带有初始值verilog代码

时间:2015-11-11 17:13:10

标签: verilog counter

我想编写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

1 个答案:

答案 0 :(得分:1)

您基本需要的是重置信号。就像时钟一样,复位将被添加到灵敏度列表中。

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

以下代码通过重置应用程序为您提供初始值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可以在每个脉冲处改变)。对于每个时钟脉冲的锁存,您需要更复杂的逻辑实现。