好文档 - 专业文书写作范文服务资料分享网站

基于FPGA的串口通信设计

天下 分享 时间: 加入收藏 我要投稿 点赞

end

else if( TX_En_Sig ) case ( i )

endcase

if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b0; end

4'd1, 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= TX_Data[ i

4'd9 :

if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b1; end

4'd10 :

if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b1; end

4'd11 :

if( BPS_CLK ) begin i <= i + 1'b1; isDone <= 1'b1; end

4'd12 :

begin i <= 4'd0; isDone <= 1'b0; end

4'd0 :

- 1 ]; end

2 数据传输仿真

Modelsim仿真工具是Model公司开发的。它支持Verilog、VHDL以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow窗口查看某一单元或模块的输入输出的连续变化等,比quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。 2.1仿真串口发送模块

编写一个仿真激励程序用于单独仿真串口发送模块。 步骤0的时候,将数据 8'h2E 发送至串口发送模块后使能串口发送模块,然后等待串口发送模块反馈完成信号。同样的动作也有 ... 步骤1是发送数据 8'h3f, 然而步骤2是发送数据 8'hdd。步骤3是停止动作

图5 发送数据仿真

放大第二个数据0x3f的发送过程,如下图所示。可以看出串口发送模块,发送数据的格式是一帧11 位。[0]开始位-逻辑0,[1:8]数据位,[9]校验位没有需要可以随便填,这里填逻辑1,[10]停止位逻辑1。

图6 发送过程仿真结果

图7 发送数据的延时仿真

串口发送模块配置的波特率是9600kbps ,所以一个数据逗留的时间是大约104us。在仿真结果中,在B0~B1 是数据[0],B1~B2 是数据[1] ...... B10~B11 是数据[10]。Bx~Bx之间的时间大约是104us。 2.2仿真串口接收模块

用串口发送模块作为串口接收模块的刺激,亦即串口接收模块的输入(复杂输入)。

用串口发送模块作为串口接收模块的刺激,亦即串口接收模块的输入(复杂输入)。下图是仿真虚拟环境env_rx_module.v 它组合了串口发送模块和串口接收模块。env_rx_module.v 拥有TX_En_Sig , TX_Data , TX_Done_Sig , RX_En_Sig, RX_Done_Sig,RX_Data 等信号。在激励的过程中,需要对这些信号控制。

图8 接收模块仿真建模图

当RX_En_Sig 拉高的时候,串口接收模块开始准备接收数据了。当一帧11 位数据发送

至串口接收模块,并且被串口接收模块过滤。最后经过过滤的数据会输出至RX_Data ,

然后产生一个完成信号至RX_Done_Sig。(在这里数据格式四1 帧11 位,并且波特率为9600kbps。

仿真结果如下图所示:

图10 发送结果仿真图

上图仿真结果显示了“ 串口发送模块作为串口接收模块的刺激” 的激励过程。( Cursor省略为C) 在C1~C2之间是第一帧数据的传送, C2~C3是第二位 数据的传送,其他的以此类推,然和 C1~C12是一帧数据11位的传送过程。注意,每 个Cx~Cx之间的时间大约是104us,亦即9600kbps的波特率

3 结语

本设计是基于FPGA的UART设计,用时较少,逻辑消耗小,成熟稳定的实现了数据的发送与接收,可以兼容到自己的程序中。本设计的仿真程序实现了激励的所有功能,完成初步设计要求。

附录1:发送模块

module tx_control_module (

CLK, RSTn, );

input CLK;

input RSTn;

TX_En_Sig, TX_Data, BPS_CLK,

TX_Done_Sig, TX_Pin_Out

input TX_En_Sig; input [7:0]TX_Data; input BPS_CLK;

output TX_Done_Sig; output TX_Pin_Out;

/********************************************************/ reg [3:0]i; reg rTX; reg isDone;

always @ ( posedge CLK or negedge RSTn ) if( !RSTn )

begin

i <= 4'd0;

rTX <= 1'b1; isDone

<= 1'b0;

end

else if( TX_En_Sig ) case ( i )

endcase

if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b0; end

4'd1, 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= TX_Data[ i

4'd9 :

if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b1; end

4'd10 :

if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b1; end

4'd11 :

if( BPS_CLK ) begin i <= i + 1'b1; isDone <= 1'b1; end

4'd12 :

begin i <= 4'd0; isDone <= 1'b0; end

4'd0 :

- 1 ]; end

/********************************************************/

assign TX_Pin_Out = rTX; assign TX_Done_Sig = isDone;

/*********************************************************/

Endmodule

附录2:接收模块:

module rx_control_module (

CLK, RSTn, );

input CLK;

input RSTn;

input H2L_Sig; input RX_En_Sig;

H2L_Sig, RX_Pin_In, BPS_CLK, RX_En_Sig,

Count_Sig, RX_Data, RX_Done_Sig

基于FPGA的串口通信设计

endelseif(TX_En_Sig)case(i)endcas
推荐度:
点击下载文档文档为doc格式
5elzp60bxy5kaxc90sbu
领取福利

微信扫码领取福利

微信扫码分享