2014-11-11 5 views
0

하나의 간단한 비동기 시퀀스 검출기를 쓰고 있지만 한 번에 비정상적인 결과가 나타납니다. 코드 "assign a8 = ((y2&&inp1&&~inp2)||(y1&&inp1));"잘 작동하지만 위의 줄 내 코드에서 다음 줄을 바꿀 경우 올바른 결과를 제공하지 않습니다.Verilog 코드의 비정상적인 동작

assign a6 = (y2&&inp1&&~inp2); 
assign a5 = (y1&&inp1); 
assign a8 = a6||a5; 

두 가지 모두 기술적으로 동일하지만 위의 코드 줄을 사용할 때 출력이 올바르지 않은 이유를 이해할 수 없습니다.

module Async_Design(inp1,inp2,outp); 
     input inp1,inp2; 
     output outp; 
     wire y1 ,y2; 

    /*assign a6 = (y2&&inp1&&~inp2); 
    assign a5 = (y1&&inp1); 
    assign a8 = (a6||a5);*/ 

    /*Uncommenting the above section and commenting below 
line is not giving correct result*/ 
     assign a8 = ((y2&&inp1&&~inp2)||(y1&&inp1));  
     Delay D1(y1,a8); 

     nand(a1,y1,1'b1); 
     nand(a2,a1,inp1); 
     nand(a3,a2,1'b1); 
     nand(a4,a3,inp2); 
     nand(a5,a4,1'b1); 

     Delay D2(y2,a5); 

     assign outp = y1; 

    endmodule 

    module Delay(q,inp); 

     output q; 
     input inp; 
     reg q; 
     initial 
     begin 
      q=1'b0; 
     end 
     always @(*) 
     begin 
      q=((inp&&1'b1)||(inp&&1'b1)); 
     end 

    endmodule 

/***********************************************/ 
TEST BENCH 
/***********************************************/ 

    module Async_Design_Test; 

    reg inp1,inp2; 
    wire outp; 
    reg[15:0] sequence1; 
    reg[15:0] sequence2; 
    integer i; 

    Async_Design Async(inp1,inp2, outp); 

    initial 
    begin 

     sequence1 = 16'b 0101_1111_0111_1111; 
     sequence2 = 16'b 1010_1010_1110_1111; 


     for(i = 0; i <= 15; i = i+1) 
     begin 
      inp1 = sequence1[i]; 
      inp2 = sequence2[i]; 
      #6 

      $display(" Input1 = ", inp1, " Input2 = ", inp2, " Output = ", outp,); 

     end 
    end 

    endmodule 

사람은 변화가 유효 아니다 후 내가

+0

[EDA Playground] (http://www.edaplayground.com/x/6Vg)에서 나란히 비교해보십시오. – Morgan

답변

3

코드를 코딩 HDL 새로운 오전 나를이 행동을 이해하는 데 도움이 될 수 있습니다. 왜? 당신이 뭘 하려는지

assign a5 = (y1&&inp1); 
... 
nand(a5,a4,1'b1); 

두 개의 서로 다른 장소 ("순 a5 여러 일정 드라이버를 확인할 수 없습니다"와 같은 BTW 컴파일러가 오류를 인쇄해야합니다)에서 드라이브 a5 와이어입니다. 그리고 한 곳에서만 전선을 운전할 수 있기 때문에 작동하지 않습니다. 이 라인 중 하나를 변경하는 경우, 예컨대 :

assign a6 = (y2&&inp1&&~inp2); 
assign a7 = (y1&&inp1); 
assign a8 = (a6||a7); 

당신이 assign a8 = ((y2&&inp1&&~inp2)||(y1&&inp1))를 사용하는 것처럼 동일한 출력을 얻을 수 있습니다.

추신 : &| 연산자의 사용을 고려하십시오.

+0

고마워 .... 내 문제를 해결했습니다. 다음 번에는 전선의 이름을 지정하는 동안주의를 기울일 것입니다. –