带有初始值verilog代码的1秒下降计数器

带有初始值verilog代码的1秒下降计数器,verilog,counter,Verilog,Counter,我想写一个1秒倒计时计数器的代码,从外部获取初始值并倒计时到0。但有一个问题。如何获得初始值。我试过一些方法,但是。。。。 代码如下: module second_counter ( input clk, input top_num, output reg [3:0] sec_num ); parameter clk_frequency

我想写一个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
模块第二个计数器(输入时钟,
输入top_num,
输出寄存器[3:0]秒数
);
参数clk_频率=25;
reg[31:0]cnt;
导线[3:0]秒;
///怎样才能得到最上面的数字并倒计时。
分配秒=顶数;
始终@(posedge clk)
开始
中频(cnt==时钟频率)
开始

sec您基本上需要的是一个复位信号。与时钟一样,在灵敏度列表中添加重置

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

以下代码通过重置应用程序为您提供
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
module second_计数器(输入时钟、输入复位、输入顶端数、输出寄存器[3:0]秒数);
参数clk_频率=25;
reg[31:0]cnt;
//导线[3:0]秒;
注册[3:0]秒;
/// 
//分配秒=顶数;
始终@(posedge时钟、negedge重置)
开始
如果(!重置)
开始

谢谢,我想使用此代码进行实时更改。我不想在复杂的代码中应用这个,我不想重置。但在这种情况下,cnt对我来说并不重要。我的问题是如何将top_num连接到sec以进行倒计时,例如,我的代码操作如下;获取top_num=5,输出结果显示5--4--3--2--1--0。我已经相应地编辑了我的答案。如果top_num=5,计数器现在将倒计时到0。然后再次锁存top_num的值(假设为7)并倒计时到0。是的,top_num必须是一个4位宽的输入。非常感谢,我不想重置,但我学会了编码的新技术。