我想编写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
答案 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可以在每个脉冲处改变)。对于每个时钟脉冲的锁存,您需要更复杂的逻辑实现。