我刚刚开始Verilog,几乎没有方向。我一直在尝试构建一个4位数组,我想按顺序打开然后关闭每个LED。我希望他们从0-3,7-4开始并重新开始。我还没有设置我的循环,但是我想看看我是否至少朝着正确的方向前进。
// 4 bit oscillating LED pattern
module count_osc (rstn, osc_clk, clk, LED);
input rstn;
output osc_clk;
output clk;
output [7:0] LED;
reg [22:0]c_delay;
genvar i;
genvar j;
GSR GSR_INST (.GSR(rstn)); // Reset occurs when argument is active low.
OSCC OSCC_1 (.OSC(osc_clk));
generate
for (i=0; i<4; i=i+1) begin : LED_loop
assign LED[i] = (clk);
for (j=4; j<8; j=j+1) begin : LED_loop_2
assign LED[j] = (~clk);
end
end
endgenerate
// The c_delay counter is used to slow down the internal oscillator (OSC) output
// to a rate of approximately 0.5 Hz
always @(posedge osc_clk or negedge rstn)
begin
if (~rstn)
c_delay <= 32'h0000;
else
c_delay <= c_delay + 1;
end
assign clk = c_delay[22];
endmodule
答案 0 :(得分:1)
这里对verilog的误解很少,这对于来自更多程序语言的程序员来说非常普遍。
如果您不了解Verilog描述的硬件,因此一切都可以并行发生,我们不会从程序上从顶部开始,并通过代码行开始工作。每个initial
和always
块都在同一时间运行。
assign
应该在循环之外使用,它是一个连续分配,即组合逻辑。
generate
用于参数化硬件实例,在基本示例中不应该这样做。注意,这也意味着你所描述的硬件很难理解。
考虑到这一点,你可能会意识到这个障碍:
generate
for (i=0; i<4; i=i+1) begin : LED_loop
assign LED[i] = (clk);
for (j=4; j<8; j=j+1) begin : LED_loop_2
assign LED[j] = (~clk);
end
end
endgenerate
并不重要,第一部分是:
assign LED[0] = (clk);
assign LED[1] = (clk);
assign LED[2] = (clk);
assign LED[3] = (clk);
第二个for循环位于第一个循环内,但仅使用第二个变量基本上覆盖相同的语句4次:
assign LED[4] = (~clk);
assign LED[5] = (~clk);
assign LED[6] = (~clk);
assign LED[7] = (~clk);
当建议你写出你想要的东西时,我暗示你写出上面而不是使用生成。
<强>解决方案强>
我不确定您的问题的确切顺序,因为您指的是4位阵列,但使用8个元素作为LED。
我认为这可能是练习创建FSM(有限状态机)的好地方。
reg [2:0] state;
reg [2:0] nextstate;
always @(posedge clk or negede rst_n) begin
if (~rst_n) begin
state <= 'b0;
end
else begin
state<= nextstate;
end
end
//Next state logic (keeping it simple)
always @* begin
nextstate = state +1;
end
//Output logic
always @* begin
case(state)
3'd0 : LED = 'b0000_0000; //Binary makes sense as we can see the LED pattern
3'd1 : LED = 'b0000_0001;
3'd2 : LED = 'b0000_0011;
3'd3 : LED = 'b0000_0111;
3'd4 : LED = 'b0000_1111;
3'd5 : LED = 'b0000_0111;
3'd6 : LED = 'b0000_0011;
3'd7 : LED = 'b0000_0001;
default : LED = 'b0000_0000; //Default unreachable if we completed the case
endcase
end
我认为这不会完成您尝试做的序列,但它应该给予足够的理解来自己完成序列。