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

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

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

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
    下载

相关推荐