名称:简易全双工串行数据收发器(UART)设计Verilog代码Quartus仿真
软件:Quartus
语言:Verilog
代码功能:
设计内容
设计一个简易全双工串行数据收发器,逻辑主频32.768K,串行数据收发速速率为9600bit/s,数据帧为RS232标准:1个起始位,8位数据,1位校验位,1.5位停止位,要求把发送端按一定间隔有规律的发送编码、接收端接收判別并在数码管上以16进制显示岀来,要求进行仿真测试和实验演示。建议釆用状态机、串行移位寄存器、计数器设计。
扩展设计:采用16倍超采样频率方法实现串行数据接收和发送
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. Testbench
6. 仿真图
整体仿真图
将发送端口和接收端口回环,控制发送数据为0x35,观察仿真输出的串行信号,接收端收到串行信号后解析出数据为0x35,表示发送和接收正确。
发送模块仿真
控制发送0x35,波特率9600,输出的RS232 UART串行信号,起始位、数据位、停止位正确
接收模块仿真
按9600波特率接受,起始位、数据位、停止位匹配正确,数据正常接收到0x35
数码管显示模块仿真
通过数码管显示接收到的数据0x35
部分代码展示:
//发送模块 module?uart_send( ????input??????sys_clk,??????????????????//系统时钟 ????input?????????sys_rst_n,????????????????//系统复位,低电平有效 ????input?????????uart_en,??????????????????//发送使能信号 ????input??[7:0]??uart_din,?????????????????//待发送数据 ????output??reg???uart_txd??????????????????//UART发送端口 ????); ? //串口波特率为9600bps //parameter?define wire?[15:0]?BPS_CNT;//为得到指定波特率,50000000/9600=系统时钟频率/串口波特=5208 //仿真改小100倍 assign?BPS_CNT=?16'd52?;???//5208仿真改小100倍 //reg?define reg????????uart_en_d0;? reg????????uart_en_d1;?? reg?[15:0]?clk_cnt;?????????????????????????//系统时钟计数器 reg?[?3:0]?tx_cnt;??????????????????????????//发送数据计数器 reg????????tx_flag;?????????????????????????//发送过程标志信号 reg?[?7:0]?tx_data;?????????????????????????//寄存发送数据 //wire?define wire???????en_flag; //***************************************************** //**????????????????????main?code //***************************************************** //捕获uart_en上升沿,得到一个时钟周期的脉冲信号 assign?en_flag?=?(~uart_en_d1)?&?uart_en_d0; ????????????????????????????????????????????????? //对发送使能信号uart_en延迟两个时钟周期 always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin????????? ????if?(!sys_rst_n)?begin ????????uart_en_d0?<=?1'b0;?????????????????????????????????? ????????uart_en_d1?<=?1'b0; ????end?????????????????????????????????????????????????????? ????else?begin??????????????????????????????????????????????? ????????uart_en_d0?<=?uart_en;??????????????????????????????? ????????uart_en_d1?<=?uart_en_d0;???????????????????????????? ????end end //当脉冲信号en_flag到达时,寄存待发送的数据,并进入发送过程?????????? always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin????????? ????if?(!sys_rst_n)?begin?????????????????????????????????? ????????tx_flag?<=?1'b0; ????????tx_data?<=?8'd0; ????end? ????else?if?(en_flag)?begin?????????????????//检测到发送使能上升沿?????????????????????? ????????????tx_flag?<=?1'b1;????????????????//进入发送过程,标志位tx_flag拉高 ????????????tx_data?<=?uart_din;????????????//寄存待发送的数据 ????????end
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1037
435