如何使用verilog串行运行此代码

时间:2017-12-07 03:15:06

标签: verilog system-verilog

以下代码已编译并正在并行工作,请帮助我使这些代码按顺序工作,即在stage1计数器应自行重置并从stage2开始为0。以下代码具有Module1-stage1和module2-stage2。这是一个阶段在完成另一个阶段后发生的过程流程。例如,当阶段1完成时,计数器自身复位,然后阶段2从计数零开始。这里阶段1模块有计数器,计数到18,阶段2计数器计数8.

    module stage1(
                input Clk, //50 Hz clock
                input x0,
                input reset,
                output reg y0,y1,y2,y3,y5,y7,y10,y15,
                output reg stage1_done
                );                
        reg [15:0] counter = 0;
        parameter F = 50;                  
        always@ (posedge Clk or posedge reset)
            if(reset) begin
                counter <= 0;
                {y0,y1,y2,y3,y5,y7,y10,y15} <= 8'b00000000;
                stage1_done <= 0;
            end else begin  
                if(x0 == 1) begin
                    if(counter == 18*F)
                        stage1_done <= 1;
                    else begin
                        counter <= counter + 1;
                        stage1_done <= 0;
                    end 
                    if(counter >= 1*F && counter < 10*F)
                        y0 <= 1;
                    else
                        y0 <= 0;
                    if(counter >= 1*F && counter < 17*F)
                        y1 <= 1;
                    else
                        y1 <= 0;
                    if(counter >= 1*F && counter < 9*F)
                        y2 <= 1;
                    else
                        y2 <= 0;
                    if(counter >= 11*F && counter < 16*F)
                        y3 <= 1;
                    else
                        y3 <= 0;
                    if(counter >= 1*F && counter < 18*F)
                        y5 <= 1;
                    else
                        y5 <= 0;
                    if(counter >= 1*F && counter < 5*F)
                        y7 <= 1;
                    else
                        y7 <= 0;
                    if(counter >= 1*F && counter < 5*F)
                        y10 <= 1;
                    else
                        y10 <= 0;
                    if((counter >= 2*F && counter < 9*F) || (counter >= 13*F && counter < 17*F))
                        y15 <= 1;
                    else
                        y15 <= 0;   
                end         
            end 

        endmodule

//阶段2的模块;

    module stage2(
            input x0,
            input Clk, //50 Hz clock
            input reset,
            output reg y1,y3,y5,
            output reg stage2_done 
            );            
    reg [15:0] counter = 0;
    parameter F = 50;         
    always@ (posedge Clk or posedge reset)
        if(reset) begin
            counter <= 0;
            {y1,y3,y5} <= 3'b000;
            stage2_done <= 0;
        end 
    else begin   if(x0 == 1) begin
            if(counter == 8*F)
                stage2_done <= 1;
            else begin
                counter <= counter + 1;
                stage2_done <= 0;
            end 
            if(counter >= 1*F && counter < 8*F)
                y1 <= 1;
            else
                y1 <= 0;
            if(counter >= 1*F && counter < 8*F)
                y3 <= 1;
            else
                y3 <= 0;
            if(counter >= 1*F && counter < 8*F)
                y5 <= 1;
            else
                y5 <= 0;
            end                     
        end 

    endmodule

2 个答案:

答案 0 :(得分:0)

如果您希望来自stage2模块的计数器在counter完成stage1后开始计数,那么您必须&#34;通知&#34;它是另一个完成计数。在您的情况下,您可以使用stage1_done信号并将其提供给stage2模块。使用此信号作为计数器最初开始计数的条件。另外,当您断言counter时,是否应该将stage10重置回stage1_done

答案 1 :(得分:0)

将其视为状态机。具有2或3个状态,即resetstage1stage2。你需要考虑从一个阶段到另一个阶段的条件。你提供了一个条件:stage1计数器溢出必须从stage1进入stage2。肯定没有什么问题:stage2运行时stage1会发生什么,第2阶段结束时会发生什么。重置期间会发生什么?

所以,我建议您创建另一个模块来实现状态机逻辑:

module control(clk, ...);
    enum { reset, stage1, stage2} state, next_state;

    always_ff @( posedge clk)
        case (state)
        reset: 
              if (!resetSig) next_state <= stage1;
              else if (resetSig) next_state <= reset;
        stage1:
              if (stage1Done) next)state <= stage2;
              ...
       endcase

   assign state = next_state;

现在,在每个阶段,您只需使用state作为启用条件。

  module stage1(clk, state, stageDone, ...)
     always_ff
         if (state == reset)
              do reset
         else if (state == stage1)
              do stage1 

     assign stageDone = counter == max_value;

等等。是的,您需要为状态机控件传递额外的端口,但是您将使代码更易于管理和可读,并确认符合行业惯例。