实验目标:通过电脑调试助手向FPGA的UART串口接收模块发送数据,然后数据可以稳定显示在数码管上。
实验目的: 练习UART串口模块和数码管的使用。之前已经有文章详细讲解了串口和数码管的开发,故这里直接提供设计思路供大家参考。
(串口文章链接)https://mp.csdn.net/mp_blog/creation/editor/128935535https://mp.csdn.net/mp_blog/creation/editor/127933111
(数码管文章链接)https://mp.csdn.net/mp_blog/creation/editor/127933111
1. 模块框图
![](https://img-blog.csdnimg.cn/a8d63b2b986f4145971c7f7ab3964b76.png)
2. RTL代码
2.1 顶层模块
`timescale 1ns/1ns
module smg_uart
(
input wire sys_clk ,
input wire sys_rst_n ,
input wire rx ,
output wire [5:0] sel , //数码管位选信号
output wire [7:0] seg //数码管段选信号
);
parameter UART_BPS = 20'd9600 , //波特率
CLK_FREQ = 26'd50_000_000 ;
wire [7:0] data;
uart_rx
#(
.UART_BPS (UART_BPS ), //串口波特率
.CLK_FREQ (CLK_FREQ ) //时钟频率
)
uart_rx_inst
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.rx (rx ),
.po_data (data )
);
seg_dynamic seg_dynamic_inst
(
.sys_clk (sys_clk) ,
.data (data ) ,
.sys_rst_n (sys_rst_n) ,
.sel (sel ) ,
.seg (seg )
);
endmodule
2.2 UART数据接收模块
`timescale 1ns/1ns
//接收8位串行数据后转并行
module uart_rx
#(
parameter UART_BPS = 'd9600, //9600BPS
CLK_FREQ = 'd50_000_000 //50MHZ
)
(
input wire sys_clk ,
input wire sys_rst_n ,
input wire rx ,
output reg [7:0] po_data
);
localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS ; //接受1bit数据所需多少个脉冲周期
reg rx_reg1;
reg rx_reg2;
reg rx_reg3;
reg start_nedge;
reg bit_flag;
reg [3:0] bit_cnt;
reg work_en;
reg [15:0] baud_cnt;
reg [7:0] rx_data;
reg rx_flag;
reg po_flag;
reg [7:0] data;
//rx_reg: 进行打拍操作,消除亚稳态
always @(posedge sys_clk or negedge sys_rst_n)
if( !sys_rst_n ) begin
rx_reg1 |