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

时间:2012-01-16 18:44:17

标签: vhdl verilog

我希望在我的for循环中有一个2秒的计数器,这样每次迭代之间都有2秒的间隙。我正在尝试移动LEDR显示器

代码:

 parameter n =10;
 integer i;

 always@(*)
 begin
    for(i=0;i<n;i=i+1)
    begin
       LEDR[i]=1'b1;
       //2 second counter here
    end

 end

2 个答案:

答案 0 :(得分:4)

您想要的功能是什么?我假设:每隔2秒移动一个LED,保持所有其他LED关闭? “滑动LED”......

另外,我假设你的目标是FPGA型板。

FPGA世界中没有免费的“等待X时间”。你正在尝试计算时钟周期的关键。您需要知道此块用于时钟的时钟频率。一旦你知道了,那么你就可以计算在需要采取行动之前你需要计算多少个时钟上升沿。

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

另一个过程只会观察“旗帜”的发生。当标志出现时,您移动哪个LED打开,并关闭所有其他LED。

答案 1 :(得分:3)

我认为这个模块实现了Josh所描述的内容。该模块将创建两个寄存器,一个计数器寄存器(counter_reg)和一个移位寄存器(leds_reg)。计数器寄存器将在每个时钟周期递增一次,直到它翻转为止。当它翻转时,“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