• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

简易全双工串行数据收发器(UART)设计Verilog代码Quartus仿真

08/21 08:52
435
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-240Z5150S0141.doc

共1个文件

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

  • 2-240Z5150S0141.doc
    下载

相关推荐