数字钟设计Verilog代码远程云端平台Quartus

这篇文章详细描述了一种基于Verilog的数字钟设计,使用Quartus软件,通过100MHz系统时钟分频得到秒时基,数码管显示时间并支持分、时校准,通过BTN1和BTN0按键控制模式和计数值。代码包括分频模块、计时模块、显示模块和按键处理逻辑。
摘要由CSDN通过智能技术生成

名称:数字钟设计Verilog代码远程云端平台Quartus

软件:Quartus

语言:Verilog

代码功能:

数字钟设计要求:

1.由100MHZ的系统时钟分频得到秒时基

2.对秒时基计数,在数码管上显示小时,分钟和秒的计时信息。

3.可对分和时进行校准

使用BTN1和BTN0两个按键完成校准。

其中BTN1用于切换三种模式:正常计时,分校准,时校准、

在校准时或分模式时,相应的地位数码管要闪烁

BTN0案件用于在校准时,调整具体的计数值

本代码已在远程云端平台验证,远程云端平台如下,其他远程云端平台可以修改管脚适配:

远程平台照片.png

设计要求:

1.由100MHZ的系统时钟分频得到秒时基

2.对秒时基计数,在数码管上显示小时,分钟和秒的计时信息。

3.可对分和时进行校准

使用BTN1和BTN0两个按键完成校准。

其中BTN1用于切换三种模式:正常计时,分校准,时校准、

在校准时或分模式时,相应的地位数码管要闪烁

BTN0案件用于在校准时,调整具体的计数值

语言选择Verilog hdl

引脚编译完后,如此设置

第一个模块为分频模块产生1HZ的时钟信号,

参数化任意进制加计数器的 Veriog HDL 描述。

module counter #(parameter COUNT_MAX = 60, parameter N = 6)(

   input clk, rst_n,

   input cin,

   output reg [N-1:0] count,

   output reg cout

   );

   always@(posedge clk, negedge rst_n)

       if(!rst_n)

          count<= 0;

       else begin

           cout <= 0;

           if (cin) begin

                if(count < (COUNT_MAX - 1))

                    count <= count + 1;

                else begin

                    count<= 0;

                    cout <= 1;

                end

           end

       end

endmodule

第二个模块为计时模块,以下代码为例

任意进制bcd码计数

module bcd_ counter #(parameter M=60, parameter N = 6)(

    input clk, rst_n,

    input cin,

    output [9:0] bcd,

    output cout

    );

    wire [N-1:0] count;

    counter #(. COUNT_MAX (M), . N(N))

        U1(. clk(clk),

               . rst_n(rst_n),

               . cin(cin),

               . count (count),

               . cout (cout)); //调用自然二进制码的六十进制计数器

    bin2bcd U2(. bin(count), . bcd(bcd)); //调用代码转换模块, 转换为 BCD码

endmodule

第三个模块为用于产生扫描信号分频器

module divider # ( parameter CLK_FREQ = 25000000,//系统时钟输入频率: 25 MHz

                  parameter CLK_OUT_FREQ = 1) //分频器输出时钟频率: 1 Hz

              ( input clk, rst_n,

              output reg clk_out );

   parameter integer N = CLK_FREQ/ (2 * CLK_OUT_FREQ) - 1;

   // log2 constant function

   function integer log2(input integer x);

        integer i;

        begin

             i = 1;

             while (2**i< x)

             begin

                  i = i +1;

        end

        log⁡2=i;

    end

  endfunction

  parameter M = log2(N ) -1;

  reg [M:0] counter; //内部结点

  always @ (posedge cl k or negedge rst_n)

       begin

       if(!rst_n) begin //异步清零

          clk_out <= 0;

          counter <= 0;

       end

       else  begin

           if ( counter < N)

                counter <= counter +1'b1; //分频计数器加1计数

           else begin

                counter <= 0;

                clk_out <= ~ clk_out;

           end

       end

   end

endmodule

第四个模块为显示模块 数码管动态显示

module indicator_scan_top(

   input clk, rst_n,

    input [15:0] data1,

    input [15:0] date2,

    output reg [7:0] seg,

    output reg [7:0] an

    );

    reg [2:0] sel;

    reg [4:0] disp;

    always @ (posedge clk or negedge rst_n) begin

       if( !rst_n ) begin

            an =8'b00000000;

部分代码展示:

module Digital_clock(
input clk_in,
input key_1,//设置修改--BTN1
input key_0,//修改时分秒--BTN0
output[7:0] SEG1,//段选显示
output[3:0] SEL1, //位选显示
output[7:0] SEG2,//段选显示
output[3:0] SEL2 //位选显示
);
wire [7:0] hour_time;//时
wire [7:0] minute_time;//分
wire [7:0] second_time;//秒
wire key_1_negedge;
wire key_0_negedge;
wire [1:0] state_o;
wire clk_1Hz;
fenping fenping_Hz(
. clk_in(clk_in),
. clk_1Hz(clk_1Hz)
);
key_jitter key_1_jitter(
. clkin(clk_in),     
. key_in(key_1),
. key_negedge(key_1_negedge)
);
key_jitter key_0_jitter(
. clkin(clk_in),     
. key_in(key_0),
. key_negedge(key_0_negedge)
);
jishi i_jishi(
. clk_in(clk_in),
. clk_1Hz(clk_1Hz),
. set_time_key(key_1_negedge),//设置时间
. change_time_key(key_0_negedge),//设置时分秒
. state_o(state_o),
. hour_time(hour_time),//时
. minute_time(minute_time),//分
. second_time(second_time)//秒
);
display i_display(
. clk(clk_in),
. state_o(state_o),
. hour_time(hour_time),//时
. minute_time(minute_time),//分
. second_time(second_time),//秒
. SEG1(SEG1),//段选显示
. SEL1(SEL1), //位选显示
. SEG2(SEG2),//段选显示
. SEL2(SEL2) //位选显示
);
endmodule

源代码

 扫描文章末尾的公众号二维码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值