基于串口校时的数字钟设计(verilog实现)(附代码)

本文介绍了一种数字时钟的设计方案,包括计时模块、时间设置接口及UART串口通信实现。通过计数器完成秒、分、时的递增,并利用UART协议与外部设备交换时间数据。

任务:

电路图设计:

设计:

  模块1:1.先设计一个计数时钟,为了仿真方便,这里把1000ns当作1s。

      创建一个计数器second_lim,当计数到1000/20时清零,即1s。

      秒显示器second_show,每当second_shwo小于59且second_lim清零时second_show加一,second_shwo小于59且second_lim清零时second_show清零。

      分显示器minute_show,每当minute_show小于59且second_show等于59且second_lim清零时minute_show加一,minute_show等于59且second_show等于59且second_lim清零时minute_show清零。

      时显示器hour_show,每当hour_show小于23且minute_show等于59且second_show等于59且second_lim清零时minute_show加一,hour_show等于23且minute_show等于59且second_show等于59且second_lim清零时hour_show清零。

      2.一个接口接收设置时间的数据,当出现完整的设置时间数据和设置信号时,便直接把时间修改。

      3.遵循uart协议的串口发送模块,把数据发送给电脑。

  模块2:之前的uart串口接收模块可以直接用来接收设置时间的数据,一次可以接收八位数据,即要接收三次才能接收到时,分,秒。

      设置数据寄存器set_tim_regist[23:0],存储时,分,秒数据。

      一个计数器,计数到3便发送设置时间的数据并产生一个设置时间的信号给模块1.

完整代码如下:

module uart_receive_1(  //part1
    clk ,
    reset ,
    baud_rate ,
    uart_tx, 
    data ,
    rx_done,
    send_en   
    );
    input  clk ;
    input reset ;
    input [2:0]baud_rate ;
    input uart_tx ;
    output reg [7:0]data ;
    output reg rx_done ;
    output reg send_en ;
    
    reg [2:0]r_data[7:0] ;//接收每一位数据
    reg [2:0]sta_bit ;
    reg [2:0]sto_bit ;
    
    reg [17:0]bit_tim ;//每一位持续的时间(计数)
    always@(baud_rate)  //在这里一个 码元由一位组成,所以波特率=比特率
        begin
            case(baud_rate)         //常见的串口传输波特率
            3'd0 : bit_tim = 1000000000/300/20 ; //波特率为300
            3'd1 : bit_tim = 1000000000/1200/20 ; //波特率为1200
            3'd2 : bit_tim = 1000000000/2400/20 ; //波特率为2400
            3'd3 : bit_tim = 1000000000/9600/20 ; //波特率为9600
            3'd4 : bit_tim = 1000000000/19200/20 ; //波特率为19200
            3'd5 : bit_tim = 1000000000/115200/20 ; //波特率为115200
            default bit_tim = 1000000000/9600/20 ;   //多余的寄存器位置放什么:默认速率
            endcase
     end
    
    wire [17:0]bit_tim_16 ;//每1/16位的持续时间(计数)
    assign bit_tim_16 = bit_tim / 16;
    
    wire [8:0]bit16_mid ; //在中心点产生采样脉冲 
    assign bit16_mid = bit_tim_16 / 2 ;
    
    //边沿检测
    reg [1:0]edge_detect ;
    always @( posedge clk or negedge reset )
    begin
        if (!reset )
            edge_detect <= 2'd0 ;
        else 
            begin
            edge_detect[0] <= uart_tx ;
            edge_detect[1] <= edge_detect[0] ;
            end
    end    

    wire byte_sta_neg ;
    assign byte_sta_neg = ( edge_detect == 2'b10 ) ? 1 : 0 ;//输入的数据开始出现下降沿,说明出现了起始位(一直运行?)
         
    reg receive_en ;//接收使能端
    reg [17:0]div_cnt ;//每1/16bit内的计数
     reg [7:0]bit16_cnt ;//计数到了第几个状态(10位,每位分成16份,总共160个状态)
    always @( posedge clk or negedge reset )
    begin
         if (!reset )
            receive_en <= 1'd0 ;
        else if ( byte_sta_neg )    //检测到下降沿,使能段有效(只要有下降沿就使能?)
            receive_en <= 1'd1 ;
        else if ( (rx_done) || (sta_bit >= 3'd4 ))    
            receive_en <= 1'd0 ;    //检测到结束信号,使能端无效
        else if ( ( bit16_cnt == 8'd159 ) && (div_cnt == bit_tim_16 - 1'd1 ) )//跑完159后re_en置零
            receive_en <= 1'd0 ;
    end
             
    
    always@( posedge clk or negedge reset )
    begin
        if ( ! reset )
            div_cnt <= 18'd0 ;
        else if (receive_en)
        begin
            if ( div_cnt == bit_tim_16 - 1'd1 )//计数,每1/16bit清零
                div_cnt <= 18'd0 ;               
            else
                div_cnt <= div_cnt + 1'b1 ; 
        end
        else 
            div_cnt <= 18'd0 ;
    end
    
    reg bit16_pulse ;//产生采样脉冲
    always@( posedge clk or negedge reset )
    begin
        if ( ! reset )
            bit16_pulse <= 18'd0 ;
        else if (receive_en)
            if ( div_cnt == bit16_mid )
                bit16_pulse <= 1'd1 ;
            else
                bit16_pulse <= 1'd0 ;
        else
                bit16_pulse 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值