verilog串口通信程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FPGA实现RS-232串口收发的仿真过程(Quartus+Synplify+ModelSim)(2007-09-11 12:17:37)

网上关于RS-232的异步收发介绍得很多,最近没事学着摸索用ModelSim来做时序仿真,就结合网上的参考资料和自己的琢磨,做了这个东西。

针对我这个小程序结合FPGA的开发流程,主要走了以下几步:

1. 文本程序输入(Verilog HDL)

2. 功能仿真(ModelSim,查看逻辑功能是否正确,要写一个Test Bench)

3. 综合(Synplify Pro,程序综合成网表)

4. 布局布线(Quartus II,根据我选定的FPGA器件型号,将网表布到器件中,并估算出相应的时延)

5. 时序仿真(ModelSim,根据时延做进一步仿真)

这里贴出我的程序和各个详细步骤,能和各位正在学习的新手们一起分享。

0. 原理

一、文本程序输入(Verilog HDL)

发送端:

module trans(clk,

rst,

TxD_start,

TxD_data,

TxD,

TxD_busy

);

input clk,

rst,

TxD_start;

input[7:0] TxD_data; lk(clk),

.rst(rst),

.TxD_start(TxD_start),

.TxD_busy(TxD_busy),

.TxD_data(TxD_data),

.TxD(TxD)

);

rcv rcv(.clk(clk),

.rst(rst),

.RxD(TxD), xD_data(RxD_data),

.RxD_data_ready(RxD_data_ready) );

initial begin

TxD_start = 0;

TxD_data = 0;

clk = 0;

rst = 1;

#54 rst = 0;

#70 rst = 1;

#40 TxD_start = 1'b1;

#10 TxD_data = 8'b;

#100 TxD_start = 1'b0;

end

always begin

#30 clk = ~clk;

#10 clk = ~clk;

end

endmodule

二、综合

三、

FPGA与PC串口自收发通信

串口通信其实简单实用,这里我就不多说,只把自己动手写的verilog代码共享下。实现的功能如题,就是FPGA里实现从PC接收数据,然后把接收到的数据发回去。使用的是串口UART协议进行收发数据。上位机用的是老得掉牙的串口调试助手,如下:

发送数据的波特率可选9600bps,19200bps,38400bps,57600bps,115200bps等,是可调的。发送格式为:1bit起始位,8bit数据,1bit停止位,无校验位。以下的代码有比较详细的注释,经过下载验证,存在误码率(<5%),仅供学习!

代码如下:

(顶层模块):

module my_uart_top(clk,rst_n,rs232_rx,rs232_tx);

input clk; lk(clk), st_n(rst_n),

.bps_start(bps_start),

.clk_bps(clk_bps)

);

my_uart_rx my_uart_rx( .clk(clk), st_n(rst_n),

.rs232_rx(rs232_rx),

.clk_bps(clk_bps),

.bps_start(bps_start),

.rx_data(rx_data),

.rx_int(rx_int)

);

my_uart_tx my_uart_tx( .clk(clk), st_n(rst_n),

.clk_bps(clk_bps),

.rx_data(rx_data),

.rx_int(rx_int),

.rs232_tx(rs232_tx),

.bps_start(bps_start)

);

endmodule

module speed_select(clk,rst_n,bps_start,clk_bps);

input clk;

允许全双工的双向通讯(也就是说计算机可以在接收数据的同时发送数据).

最大可支持的传输速率为10KBytes/s.

DB-9插头

你可能已经在你的计算机背后见到过这种插头

它一共有9个引脚,但是最重要的3个引脚是:

引脚2: RxD (接收数据).

引脚3: TxD (发送数据).

引脚5: GND (地).

仅使用3跟电缆,你就可以发送和接收数据.

串行通讯

数据以每次一位的方式传输;每条线用来传输一个方向的数据。由于计算机通常至少需要若干位数据,因此数据在发送之前先“串行化”。通常是以8位数据为1组的。。先发送最低有效位,最后发送最高有效位。

异步通讯

RS-232使用异步通讯协议。也就是说数据的传输没有时钟信号。接收端必须有某种方式,使之与接收数据同步。

对于RS-232来说,是这样处理的:

1.串行线缆的两端事先约定好串行传输的参数(传输速度、传输格式等)

2.当没有数据传输的时候,发送端向数据线上发送"1"

3.每传输一个字节之前,发送端先发送一个"0"来表示传输已经开始。这样接收端便可

以知道有数据到来了。

4.开始传输后,数据以约定的速度和格式传输,所以接收端可以与之同步

5.每次传输完成一个字节之后,都在其后发送一个停止位("1")

让我们来看看0x55是如何传输的:

相关文档
最新文档