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

UART控制器设计Verilog代码Quartus DE2-115开发板

09/17 08:46
629
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-24101GZPC21.doc

共1个文件

名称:UART控制器设计Verilog代码Quartus  DE2-115开发板

软件:Quartus

语言:Verilog

代码功能:

一、设计说明

UART通信因其通信线路简单、信息传输稳定等特点,被广泛应用于各种微处理器嵌入式系统,并作为标准外设之一。本次专业个性化课程设计是运用HDL语言进行编程和结合EDA开发软件完成基于FPGA的UART控制器的设计。根据设计要求完成系统各模块设计并完成相应模块的测试文件设计得到正确仿真结果。

二、设计要求

1.系统时钟频率为50MHz;

2.串口波特率可以更改为4800bps、9600bps、19200bps或其他波特率(至少完成三种波特率),波特率选择方式自行拟定(按键或程控均可);

3.通过按键选择发送数据的长度:20字节、40字节、60字节或其他整数字节(至少完成三种长度数据传输的设计);

4.数据格式为8位数据位、1位停止位、奇偶校验可设置。

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

本代码已在DE2-115开发板验证,DE2-115开发板如下,其他开发板可以修改管脚适配:

DE2-115开发板.png

演示视频:

设计文档:

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 管脚分配

6. Testbench

7. 仿真图

整体仿真图

上图仿真了波特率为9600,发送字节数为40的情况,图中可以看到数据发送了40次,每次发送的tx波形。

发送模块仿真

图中可以看到数据发送了40次,每次发送的tx波形。

数据产生模块仿真

图中可以看到连续产生40个发送数据

部分代码展示:

//发送模块
module uart_send(
    input      sys_clk,                  //系统时钟
    input         sys_rst_n,                //系统复位,低电平有效
    input  [1:0]  bps_sw,                   //波特率控制开关
 input         parity_sw,                //奇偶检验设置
    input         uart_en,                  //发送使能信号
    input  [7:0]  uart_din,                 //待发送数据
    output  reg   uart_txd                  //UART发送端口
    );
 
//串口波特率可以更改为4800bps、9600bps、19200bps或其他波特率(至少完成三种波特率)   
//parameter define
wire [15:0] BPS_CNT; //  = 5208;        //为得到指定波特率,50000000/9600=系统时钟频率/串口波特=5208
assign BPS_CNT= (bps_sw==2'b00) ? 16'd10416 :   //4800bps
 (bps_sw==2'b01) ? 16'd5208 :    //9600bps
 (bps_sw==2'b10) ? 16'd2604 :    //19200bps
 16'd1302 ;    //38400bps
//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
        else 
        if ((tx_cnt == 4'd10)&&(clk_cnt == BPS_CNT/2))
        begin                               //计数到停止位中间时,停止发送过程
            tx_flag <= 1'b0;                //发送过程结束,标志位tx_flag拉低
            tx_data <= 8'd0;
        end
        else begin
            tx_flag <= tx_flag;
            tx_data <= tx_data;
        end 
end

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1224

  • 2-24101GZPC21.doc
    下载

相关推荐