Verilog阵列演练

时间:2014-10-09 22:40:30

标签: verilog

我刚刚开始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

1 个答案:

答案 0 :(得分:1)

这里对verilog的误解很少,这对于来自更多程序语言的程序员来说非常普遍。

如果您不了解Verilog描述的硬件,因此一切都可以并行发生,我们不会从程序上从顶部开始,并通过代码行开始工作。每个initialalways块都在同一时间运行。

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

我认为这不会完成您尝试做的序列,但它应该给予足够的理解来自己完成序列。