名称: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开发板如下,其他开发板可以修改管脚适配:
演示视频:
设计文档:
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
629