Verilog阵列演练

Verilog阵列演练,verilog,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

我刚刚开始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
//4位振荡LED模式
模块计数osc(rstn、osc时钟、时钟、LED);
输入rstn;
输出osc_时钟;
输出时钟;
输出[7:0]发光二极管;
reg[22:0]c_延迟;
genvar i;
genvar j;
GSR GSR_INST(.GSR(rstn));//参数处于低激活状态时发生重置。
OSCC OSCC_1(.OSC(OSC_clk));
生成

对于(i=0;i,这里对verilog有一些误解,这对于来自更多过程语言的程序员来说是很常见的

如果您不知道Verilog描述了硬件,因此所有事情都可以并行进行,那么我们不会从顶层开始,然后通过代码行进行处理。每个
初始
始终
块都是同时运行的

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
第二个for循环位于第一个for循环内,但仅使用第二个变量,基本上覆盖了相同的语句4次:

assign LED[4] = (~clk); 
assign LED[5] = (~clk); 
assign LED[6] = (~clk);
assign LED[7] = (~clk);
当建议你写下你想要的东西时,我是在暗示你写下上面的内容,而不是使用生成

解决方案
我不确定您想从您的问题中得到的确切顺序,因为您指的是4位阵列,但LED使用8个元素

我认为这可能是练习创建FSM(有限状态机)的好地方

reg[2:0]状态;
reg[2:0]下一状态;
始终@(posedge clk或negede rst_n)开始
如果开始

当你写下它的时候,你是说单独打开和关闭每个LED吗?我不知道怎么做,让它在一个无限循环中重复,这就是为什么我想尝试for for循环。我习惯于C++和一些汇编语言,这些循环感觉安全,但是我确实看到了你关于调试问题的观点,我现在正在体验。k你,我觉得并行工作让我耽误了很多时间。我太习惯对象和有序操作了,这对我来说是一个全新的世界。我计划做很多这样的工作,所以我需要理解语法、声明,我知道的唯一方法是将每种语言相互关联。这可能是错误的方法你可以这样做,但你的例子将帮助我至少在一个抽象的层面上与这种新语言联系起来。非常感谢。@Sagebrushwilly,没问题,很乐意帮忙。如果这确实回答了问题,那么如果你能接受它,那就太好了,这样其他人就知道它已经得到了回答。NB好的问题,有一个或多个清晰的问题,以及一些代码来展示你的尝试d应该得到很好的回应。
assign LED[4] = (~clk); 
assign LED[5] = (~clk); 
assign LED[6] = (~clk);
assign LED[7] = (~clk);
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