verilog串口通信程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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是如何传输的: