Verilog 如何在for循环中放置2秒计数器

Verilog 如何在for循环中放置2秒计数器,verilog,Verilog,我想在for循环中有一个2秒的计数器,这样每次迭代之间都有2秒的间隔。我想有一个移动的LEDR显示器 代码: 参数n=10; 整数i; 始终@(*) 开始 对于(i=0;i您想要的功能是什么?我假设:每2秒切换哪个LED亮起,保持所有其他LED熄灭?“滑动LED” 另外,我假设您的目标是FPGA类型的板 FPGA世界中没有免费的“等待X时间”。关键是要计算时钟周期。您需要知道用于此块的时钟频率。一旦知道,您就可以计算在采取“操作”之前需要计算的时钟上升沿数 我推荐两个过程。在其中一个过程中,您将

我想在for循环中有一个2秒的计数器,这样每次迭代之间都有2秒的间隔。我想有一个移动的LEDR显示器

代码:

参数n=10;
整数i;
始终@(*)
开始

对于(i=0;i您想要的功能是什么?我假设:每2秒切换哪个LED亮起,保持所有其他LED熄灭?“滑动LED”

另外,我假设您的目标是FPGA类型的板

FPGA世界中没有免费的“等待X时间”。关键是要计算时钟周期。您需要知道用于此块的时钟频率。一旦知道,您就可以计算在采取“操作”之前需要计算的时钟上升沿数

我推荐两个过程。在其中一个过程中,您将观察时钟的上升沿,并运行一个足够大的计数器,使其每两秒滚动一次。每次计数器为0时,您将为一个时钟周期设置一个“标志”


另一个过程只是观察“标志”的出现。当标志出现时,你移动哪个LED灯亮起,然后关闭所有其他LED灯。

你想要的功能是什么?我假设:每2秒钟移动哪个LED灯亮起,保持所有其他LED灯熄灭?“滑动LED”

另外,我假设您的目标是FPGA类型的板

FPGA世界中没有免费的“等待X时间”。关键是要计算时钟周期。您需要知道用于此块的时钟频率。一旦知道,您就可以计算在采取“操作”之前需要计算的时钟上升沿数

我推荐两个过程。在其中一个过程中,您将观察时钟的上升沿,并运行一个足够大的计数器,使其每两秒滚动一次。每次计数器为0时,您将为一个时钟周期设置一个“标志”


另一个过程只是观察“标志”的出现。当标志出现时,你移动哪个LED亮起,然后关闭所有其他LED。

我认为这个模块实现了Josh所描述的。这个模块将创建两个寄存器,一个计数器寄存器(计数器寄存器)和一个移位寄存器(LED寄存器)。计数器寄存器将在每个时钟周期内递增一次,直到其滚动。滚动时,“tick”变量将等于1。发生这种情况时,移位寄存器将向左旋转一个位置

module led_rotate_2s (
    input wire clk,
    output wire [N-1:0] leds,
);

parameter N=10;                 // depends on how many LEDs are on your board
parameter WIDTH=<some integer>; // depends on your clock frequency
localparam TOP=<some integer>;  // depends on your clock frequency

reg [WIDTH-1:0] counter_reg = 0, counter_next;
reg [N-1:0] leds_reg = {{N-1{1'b0}}, 1'b1}, leds_next;

wire tick = (counter_reg == 0);

assign leds = leds_reg;

always @* begin : combinational_logic
    counter_next = counter_reg + 1'b1;
    if (counter_next >= TOP)
        counter_next = 0;
    leds_next = leds_reg;
    if (tick)
        leds_next = {leds_reg[N-2:0], leds_reg[N-1]}; // shift register
end

always @(posedge clk) begin : sequential_logic
    counter_reg <= counter_next;
    leds_reg <= leds_next;
end

endmodule
模块指示灯旋转(
输入线时钟,
输出线[N-1:0]发光二极管,
);
参数N=10;//取决于板上的LED数量
参数宽度=;//取决于时钟频率
localparam TOP=;//取决于时钟频率
reg[WIDTH-1:0]计数器\u reg=0,计数器\u next;
reg[N-1:0]LED_reg={{N-1{1'b0},1'b1},LED_接下来;
导线刻度=(计数器_reg==0);
分配LED=LED_reg;
始终@*开始:组合逻辑
计数器_next=计数器_reg+1'b1;
如果(计数器下一步>=顶部)
计数器_next=0;
LED_next=LED_reg;
如果(勾选)
LED_-next={LED_-reg[N-2:0],LED_-reg[N-1]};//移位寄存器
终止
始终@(posedge clk)开始:顺序逻辑

counter_reg我认为该模块实现了Josh所描述的功能。该模块将创建两个寄存器,一个计数器寄存器(counter_reg)和一个移位寄存器(LED_reg)。计数器寄存器将在每个时钟周期递增一次,直到其滚动。滚动时,“勾号”变量将等于1。发生这种情况时,移位寄存器将向左旋转一个位置

module led_rotate_2s (
    input wire clk,
    output wire [N-1:0] leds,
);

parameter N=10;                 // depends on how many LEDs are on your board
parameter WIDTH=<some integer>; // depends on your clock frequency
localparam TOP=<some integer>;  // depends on your clock frequency

reg [WIDTH-1:0] counter_reg = 0, counter_next;
reg [N-1:0] leds_reg = {{N-1{1'b0}}, 1'b1}, leds_next;

wire tick = (counter_reg == 0);

assign leds = leds_reg;

always @* begin : combinational_logic
    counter_next = counter_reg + 1'b1;
    if (counter_next >= TOP)
        counter_next = 0;
    leds_next = leds_reg;
    if (tick)
        leds_next = {leds_reg[N-2:0], leds_reg[N-1]}; // shift register
end

always @(posedge clk) begin : sequential_logic
    counter_reg <= counter_next;
    leds_reg <= leds_next;
end

endmodule
模块指示灯旋转(
输入线时钟,
输出线[N-1:0]发光二极管,
);
参数N=10;//取决于板上的LED数量
参数宽度=;//取决于时钟频率
localparam TOP=;//取决于时钟频率
reg[WIDTH-1:0]计数器\u reg=0,计数器\u next;
reg[N-1:0]LED_reg={{N-1{1'b0},1'b1},LED_接下来;
导线刻度=(计数器_reg==0);
分配LED=LED_reg;
始终@*开始:组合逻辑
计数器_next=计数器_reg+1'b1;
如果(计数器下一步>=顶部)
计数器_next=0;
LED_next=LED_reg;
如果(勾选)
LED_-next={LED_-reg[N-2:0],LED_-reg[N-1]};//移位寄存器
终止
始终@(posedge clk)开始:顺序逻辑

你能澄清一下吗?代码中只有一个赋值。我建议使用嵌入式解决方案(微控制器)代替ASIC/FPGA,但如果你仍然想使用Verilog/FPGA解决方案,那么你可能需要按照@Josh的规定进行,或者使用一些FPGA和C库来实现闪烁/滑动LED。你能澄清一下吗?代码中只有一个任务。我建议使用嵌入式解决方案(微控制器)代替ASIC/FPGA,但如果您仍然想使用Verilog/FPGA解决方案,那么您可能需要按照@Josh的规定进行操作,或者使用一些FPGA和C库来实现闪烁/滑动LED