名称:串口通信控制模块发送端Verilog代码Quartus DE2-115开发板(文末获取)
软件:Quartus
语言:Verilog
代码功能:
串口通信控制模块发送端
编写波特率可设置的串口通信控制程序,使得发送端(通过FPGA的四个拨码开关发送
0~15内的整数),接收端(在PC上通过串口调试助手进行显示)观察数据是否与发送端一样。
本代码已在DE2-115开发板验证,DE2-115开发板如下,其他开发板可以修改管脚适配:
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. 管脚分配
5. Testbench
6. 仿真图
部分代码展示:
//UART发送端 module uart_send( input clock, //系统时钟 input reset, //系统复位,低电平有效 input write_strobe, //发送使能信号 input [3:0] data_in, //待发送数据 output transmitinf, //表示这种发送 output reg s_out //UART发送端口 ); //parameter define parameter CLK_FREQ = 50000000; //系统时钟频率 parameter UART_BPS = 9600; //串口波特率 localparam BPS_CNT = CLK_FREQ/UART_BPS; //为得到指定波特率,对系统时钟计数BPS_CNT次 //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; assign transmitinf=tx_flag; //***************************************************** //** main code //***************************************************** //捕获uart_en上升沿,得到一个时钟周期的脉冲信号 assign en_flag = (uart_en_d1) & (~uart_en_d0); //对发送使能信号uart_en延迟两个时钟周期 always @(posedge clock or negedge reset) begin if (!reset) begin uart_en_d0 <= 1'b0; uart_en_d1 <= 1'b0; end else begin uart_en_d0 <= write_strobe; uart_en_d1 <= uart_en_d0; end end //当脉冲信号en_flag到达时,寄存待发送的数据,并进入发送过程 always @(posedge clock or negedge reset) begin if (!reset) begin tx_flag <= 1'b0; tx_data <= 8'd0; end else if (en_flag) begin //检测到发送使能上升沿 tx_flag <= 1'b1; //进入发送过程,标志位tx_flag拉高 tx_data <= {4'b0000,data_in}; //寄存待发送的数据,前4bit补0 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
源代码
点击下方的公众号卡片获取