名称:简易全双工串行数据收发器(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
893