2014-04-04 2 views
0

그래서 테스트 조정기로 올바른 값을 출력하기 위해 RR 조정자를 얻으려고 시도하지만 상태가 올바르게 전환되는 동안 출력은 항상 기본값 인 16'h0000으로 설정됩니다. 이 가치가 변하지 않는 이유는 무엇입니까?Verilog에서 라운드 로빈 조정기를 만들려고 시도합니다

module RRArbiter(input [15:0]NodeRequests, 
         //input clock, 
         output reg [15:0]ArbiterOut 
        );  

reg[4:0]state; 
reg[4:0] next_state; 
parameter [4:0]IDLE = 5'b00000, 
s_0 = 5'b00001, 
s_1 = 5'b00010, 
s_2 = 5'b00011, 
s_3 = 5'b00100, 
s_4 = 5'b00101, 
s_5 = 5'b00110, 
s_6 = 5'b00111, 
s_7 = 5'b01000, 
s_8 = 5'b01001, 
s_9 = 5'b01010, 
s_10 = 5'b01011, 
s_11 = 5'b01100, 
s_12 = 5'b01101, 
s_13 = 5'b01110, 
s_14 = 5'b01111, 
s_15 = 5'b10000; 

//Clock Gen 
reg clock; 
parameter duty_cycle = 2; 
initial 
begin: clock_loop 
clock = 0; 
forever 
<pound>duty_cycle clock = ~clock; 
end 
initial 
<pound>10000 disable clock_loop; 

initial begin 
state = IDLE; 
ArbiterOut = 16'h0000; 
end 

always @ (posedge clock) 
begin 
state = next_state; 
case(state) 

IDLE : begin 

casex(NodeRequests) 
16'bxxxxxxxxxxxxxxx1 : next_state = s_0; 
16'bxxxxxxxxxxxxxx1x : next_state = s_1; 
16'bxxxxxxxxxxxxx1xx : next_state = s_2; 
16'bxxxxxxxxxxxx1xxx : next_state = s_3; 
16'bxxxxxxxxxxx1xxxx : next_state = s_4; 
16'bxxxxxxxxxx1xxxxx : next_state = s_5; 
16'bxxxxxxxxx1xxxxxx : next_state = s_6; 
16'bxxxxxxxx1xxxxxxx : next_state = s_7; 
16'bxxxxxxx1xxxxxxxx : next_state = s_8; 
16'bxxxxxx1xxxxxxxxx : next_state = s_9; 
16'bxxxxx1xxxxxxxxxx : next_state = s_10; 
16'bxxxx1xxxxxxxxxxx : next_state = s_11; 
16'bxxx1xxxxxxxxxxxx : next_state = s_12; 
16'bxx1xxxxxxxxxxxxx : next_state = s_13; 
16'bx1xxxxxxxxxxxxxx : next_state = s_14; 
16'b1xxxxxxxxxxxxxxx : next_state = s_15; 
default : next_state = IDLE; 
endcase 
end 

s_0 : begin 
      ArbiterOut = 16'b0000000000000001; 
      next_state = s_1; 
      end 
s_1 : begin 
      ArbiterOut = 16'b0000000000000010; 
      next_state = s_2; 
      end 
s_2 : begin 
      ArbiterOut = 16'b0000000000000100; 
      next_state = s_3; 
      end 
s_3 : begin 
      ArbiterOut = 16'b0000000000001000; 
      next_state = s_4; 
      end 
s_4 : begin 
      ArbiterOut = 16'b0000000000010000; 
      next_state = s_5; 
      end 
s_5 : begin 
      ArbiterOut = 16'b0000000000100000; 
      next_state = s_6; 
      end 
s_6 : begin 
      ArbiterOut = 16'b0000000001000000; 
      next_state = s_7; 
      end 
s_7 : begin 
      ArbiterOut = 16'b0000000010000000; 
      next_state = s_8; 
      end 
s_8 : begin 
      ArbiterOut = 16'b0000000100000000; 
      next_state = s_9; 
      end 
s_9 : begin 
      ArbiterOut = 16'b0000001000000000; 
      next_state = s_10; 
      end 
s_10 : begin 
      ArbiterOut = 16'b0000010000000000; 
      next_state = s_11; 
      end 
s_11 : begin 
      ArbiterOut = 16'b0000100000000000; 
      next_state = s_12; 
      end 
s_12 : begin 
      ArbiterOut = 16'b0001000000000000; 
      next_state = s_13; 
      end 
s_13 : begin 
      ArbiterOut = 16'b0010000000000000; 
      next_state = s_14; 
      end 
s_14 : begin 
      ArbiterOut = 16'b0100000000000000; 
      next_state = s_15; 
      end 
s_15 : begin 
      ArbiterOut = 16'b1000000000000000; 
      next_state = s_0; 
      end 

default : begin 
       ArbiterOut = 16'hxxxx; 
       state = IDLE; 
       end 

endcase 

end 


endmodule 

답변

1

그래서 문제는 state = next_state을 할당하고 있지만 next_state이 정의되지 않습니다이다 :

여기 내 디자인입니다! next_state이 정의되어 있지 않으므로 state이 기본값으로 설정됩니다. 기본적으로 state을 IDLE에 다시 할당합니다 (따라서 시계 사이에 어떤 이유로 state이 유휴 상태로 표시되지만 next_state을 할당하지 마십시오.) 두 번째 시계가 나타나고 next_state이 결코 정의되지 않으므로 계속 반복됩니다. 같은 초기 블록에 내가 초기 블록 또한 기본 경우 next_state을 할당

. state 어떤 값으로 next_state을 할당 할당하고 그것을 잘 작동했다.

enter image description here

관련 문제