FPGA_数码管显示UART串口接收的数据

该文介绍了一个FPGA项目,通过UART串口接收数据,并将接收到的数据稳定显示在数码管上。文中提供了UART数据接收模块和数码管显示模块的Verilog代码实现,以及二进制转BCD码的转换过程。实验中,调试助手发送的十六进制数会转化为对应的数码管显示数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      实验目标:通过电脑调试助手向FPGA的UART串口接收模块发送数据,然后数据可以稳定显示在数码管上。

      实验目的: 练习UART串口模块和数码管的使用。之前已经有文章详细讲解了串口和数码管的开发,故这里直接提供设计思路供大家参考。

(串口文章链接)https://mp.youkuaiyun.com/mp_blog/creation/editor/128935535https://mp.youkuaiyun.com/mp_blog/creation/editor/127933111

(数码管文章链接)https://mp.youkuaiyun.com/mp_blog/creation/editor/127933111 

1. 模块框图

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 <= 1'b1;
		rx_reg2 <= 1'b1;
		rx_reg3 <= 1'b1;
		end
     else   begin
        rx_reg1 <= rx;	
        rx_reg2 <= rx_reg1;
        rx_reg3 <= rx_reg2;
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小源8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值