带初始值的 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 可以在每个脉冲时改变)。为了在每个时钟脉冲处锁存,您需要更复杂的逻辑实现。
我想写一个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 可以在每个脉冲时改变)。为了在每个时钟脉冲处锁存,您需要更复杂的逻辑实现。