带初始值的 1 秒递减计数器 verilog 代码

1second down counter with initial value verilog code

我想写一个1秒递减计数器的代码,从外部获取初始值并递减到0。但是有问题。我怎样才能得到初始值。我尝试了一些方法但是...... 这是代码:

module second_counter (        input clk,
                        input top_num,
                        output reg [3:0] sec_num
                        );

parameter clk_frequency = 25;
reg [31:0]cnt;
wire [3:0]sec;

/// how can get the top_num and count it down.

assign sec=top_num;


always @(posedge clk)
begin
if (cnt==clk_frequency)
    begin
        sec <= sec -1;
        cnt<=0;
    end
else
cnt <=cnt+1;
end

你基本上需要的是一个重置信号。和clock一样,reset是要加入敏感度列表的。

模块实例化后,必须应用复位信号来初始化设计的所有内部变量和寄存器。

以下代码通过重置应用程序为您提供 cnt 的初始值。这是一个低电平有效重置。

module second_counter ( input clk, input reset, input top_num, output reg [3:0] sec_num ); 
parameter clk_frequency = 25;
reg [31:0]cnt; 
// wire [3:0]sec; 
reg [3:0] sec;
/// 
// assign sec=top_num; 
always @(posedge clk, negedge reset) 
begin 
if(!reset)
begin
    cnt<=0;  // initialize all internal variables and registers
    sec<=0;
end 
else
begin
    if(sec == 0) // latch input when previous count is completed
        sec<=top_num;
    if (cnt==clk_frequency) 
    begin 
        sec <= sec -1; 
        cnt<=0; 
    end 
    else 
        cnt <=cnt+1; 
end
end

注意这是一个异步复位,意味着它不依赖于时钟信号。 同步复位是只影响时钟脉冲寄存器的复位。

编辑

关于sec,我修改了代码。现在,该设计将输入锁存一个时钟周期并倒数至零。一旦计数器达到零,它再次锁存输入以重新计数到零。

请注意,您不能像在每个时钟上锁存 top_num 并从零开始计数(因为 top_num 可以在每个脉冲时改变)。为了在每个时钟脉冲处锁存,您需要更复杂的逻辑实现。