我想在我的for循環中有2秒的計數器,以便每次迭代之間有2秒的間隔。我試圖使移位LEDR顯示器如何在for循環中放置2秒計數器
代碼:
parameter n =10;
integer i;
[email protected](*)
begin
for(i=0;i<n;i=i+1)
begin
LEDR[i]=1'b1;
//2 second counter here
end
end
我想在我的for循環中有2秒的計數器,以便每次迭代之間有2秒的間隔。我試圖使移位LEDR顯示器如何在for循環中放置2秒計數器
代碼:
parameter n =10;
integer i;
[email protected](*)
begin
for(i=0;i<n;i=i+1)
begin
LEDR[i]=1'b1;
//2 second counter here
end
end
我認爲這個模塊實現了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
您希望的功能是什麼?我假設:每2秒鐘切換一次LED,保持所有其他LED熄滅? 「Sliding LED」...
另外,我假設你的目標是FPGA型板。
FPGA世界中沒有免費的「等待X時間」。關鍵是你正在嘗試做計數時鐘週期。您需要知道您正在使用該塊的時鐘的時鐘頻率。一旦你知道了,那麼你可以計算在需要採取「行動」之前需要計算多少個時鐘上升沿。
我推薦兩個過程。其中之一,你會看鐘的上升沿,並運行一個足夠大的計數器,這樣它會每兩秒鐘翻轉一次。每當你的計數器爲0時,你設置一個「標誌」一個時鐘週期。
另一個過程只會監視「標誌」的發生。標誌出現時,您將切換打開哪個LED,並關閉所有其他LED。
你能澄清嗎?該代碼中只有一項任務。 – 2012-01-17 01:32:27
我建議使用嵌入式解決方案(微控制器)而不是ASIC/FPGA,但是如果你仍然想使用Verilog/FPGA解決方案,那麼你可能需要按照@Josh指定的方式進行操作,或者使用某些FPGA和C庫來實現閃爍/滑動LED – wisemonkey 2012-01-17 03:54:37