2017-12-07 20 views
0

다음 코드가 컴파일되고 동시에 작동합니다.이 코드가 순차적으로 작동하도록 도와주세요. 즉 stage1 카운터가 자체적으로 재설정되고 stage2에 대해 0부터 시작해야합니다. 다음 코드는 Module1- stage1 및 module2-stage2를 포함합니다. 이것은 하나의 단계가 다른 단계를 완료 한 후에 발생하는 프로세스 흐름입니다. 예를 들어, 스테이지 1 대향하고 완료 될 때 그 자체를 재설정하고 단계 카운트 zero.Here 단계 2 개시 1 개 모듈은 스테이지 2 (18)와 스테이지 (2) 카운터 카운트Verilog를 사용하여이 코드를 연속적으로 실행하는 방법

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;     
     [email protected] (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 

// 모듈 (8)까지 세는 카운터를 갖고 ; 당신이 stage2 모듈에서 카운터가 counterstage1에서 완료된 후 계산 시작하려면

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;   
    [email protected] (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 

답변

0

는, 당신은 다른 하나는 계산 완료 그것을 것을 "통보"해야합니다. 귀하의 경우에는 stage1_done 신호를 사용하여 stage2 모듈에 신호를 보낼 수 있습니다. 카운터가 초기에 카운팅을 시작하는 조건으로이 신호를 사용하십시오. 또한 stage1_done을 지정할 때 counterstage1에서 0으로 다시 설정하면 안됩니까?

+0

동일한 작업을 시도했지만 올바른 해결책이 없었습니다. 1 단계에서 카운터를 재설정하고 2 단계에 stage1_done 조건을 제공하는 것과 같이 계속 진행하는 방법을 보여줄 수 있습니까? 감사합니다. –

+0

'stage1_done'을'stage2' 모듈의 입력으로 선언하고, 최상위 레벨에서'stage1'에서'stage2'까지 경로를 지정하십시오. 'stage1'에서'counter '를 리셋하려면'stage1_done'을 선언 할 때'0''을 할당하십시오. – RaZ

+0

여러 번 반복했지만 원하는 결과를 얻을 수 없습니다. if (stage1_done <= 1) begin과 같은 조건을 사용했습니다. counter <= 0; 끝과 몇 가지 다른 조건이 있지만 결과를 얻지 못하고 있습니다. 구현하여이 작업을 어떻게 시도하는지 알려주십시오. 나는 사용할 수있는 구문을 주석으로 처리하는 것을 의미합니다. –

0

상태 시스템이라고 생각하십시오. 2 또는 3 상태, 즉 reset, stage1, stage2 한 단계에서 다른 단계로 옮겨 갈 조건에 대해 생각할 필요가 있습니다. 하나의 조건을 제공했습니다. 스테이지 1 카운터 오버플로는 스테이지 1에서 스테이지 2로 이동해야합니다. 분명히 거의 질문이 없습니다. 스테이지 2가 실행 중일 때 스테이지 1에는 어떤 일이 생기고, 스테이지 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를 사용

그래서, 난 당신이 상태 머신 로직을 구현하기 위해 다른 모듈을 yest 만드는 것이 좋습니다.

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

    assign stageDone = counter == max_value; 

등등. 예. 상태 시스템 컨트롤을위한 추가 포트를 전달해야하지만 코드를 훨씬 쉽게 관리하고 읽을 수있게 만들고 업계 관행에 확인합니다.

+0

안녕하세요, 설명해 주셔서 감사합니다. 힌트를 더 가지고 있지만 verilog를 사용하고 있으며 위의 언급 코드는 시스템 Verilog에 적합합니다. –

+0

@p_ka Verilog 용으로도 적합합니다. 난 당신이 '시스템 Verilog'태그 때문에 시스템 Verilog 항상 블록을 사용. 유일한 차이점은 항상 사용하는 블록과 열거 형의 유형입니다. 'always @ff (posedge clk)'를'always @ (posedge clk)'로 재생하고 params 또는 매크로를 사용하여 enum 대신에 상태를 인코딩 할 수 있습니다. – Serge