2017-11-07 1 views
-1
module calculator(state,U,V,X,X_1,multiplicant,multiplier,count); 
input [1:0] state; 
input [3:0] multiplicant,multiplier; 

output reg [3:0] U,V,X; 
output reg X_1; 
output reg[2:0] count; 

wire [7:0] ASR; 
wire [4:0] CSR; 
wire [3:0] sum, sub; 


always @ (state or count) 
begin 
U<=4'b0; 
V<=4'b0; 
X<=multiplier; 
X_1<=1'b0; 
count<=3'b0; 
if(state==2'b01) 
begin 
    case({X[0],X_1}) 
    2'b00: 
    begin 
     {U,V}<=ASR; 
     {X,X_1}<=CSR; 
    end 

    2'b11: 
    begin 
     {U,V}<=ASR; 
     {X,X_1}<=CSR; 
    end 

    2'b01: 
    begin 
     U<=sum; 
     {U,V}<=ASR; 
     {X,X_1}<=CSR; 
    end 

    2'b10: 
    begin 
     U<=sub; 
     {U,V}<=ASR; 
     {X,X_1}<=CSR; 
    end 
    endcase 
    count <= count +1; 
end 
end 


rca U0_rca4(.a(multiplicant),.b(U),.ci(1'b0),.s(sum)); 
rca U1_rca4(.a(U),.b(~multiplicant),.ci(1'b1),.s(sub)); 
ASR8 U2_ASR8({U,V},1'b1,ASR); 
CSR5 U3_CSR5({X,X_1},1'b1,CSR); 
endmodule 

이것은 내 코드이며 2'b01의 경우와 2'b10의 경우는 작동하지 않습니다. 사실, 시프 팅은 잘 작동하지만 'U'에 rca의 합이나 하위를 추가해도 작동하지 않습니다. 왜 그렇게됩니까? 설명이 필요해. 또는 코드를 더 잘 수정할 수 있습니까? 4 비트 * 4 비트 -> 8 비트 결과 배율을 만들어야합니다.Verilog 부스 알고리즘 더하기 및 빼기

+0

어떤 변화가 작동합니까? 코드에 ** ** ** 교대가 없습니다. ** 거기에 '비 차단'과제를 사용하지 마세요 **. – Serge

+0

@ Serge 실제로 ASR과 CSR은 이동을 의미합니다. ASR은 산술 Shift이고 CSR은 순환 쉬프트 –

+0

ASR입니다. CSR은 단지 단순한 변수 일뿐입니다. 당신이 그 이름을 붙이더라도 그것들을 변화 시키거나 다른 어떤 것도 만들지 않습니다. 그럼, 그것이 작동한다는 것은 무엇을 의미합니까? – Serge

답변

0

코드에 여러 가지 문제가 있습니다.

우선 시계가 없습니다. case 문은 완전하게 보이며 조합 논리입니다. 그러나 'counter < = counter + 1`은 조합 논리가 아니며 플롭이 필요합니다.

비 블로킹 할당 '< ='을 사용하고 있기 때문에 어떤 경우에도 모델이 예상대로 시뮬레이트되지 않으며 시뮬레이션에서 글리치 및 인종이 발생할 수 있습니다. Blockling/Non-Blocking 할당 사용에 대한 장을 검토하십시오. 사례 01와 지금

10U 변수에 여러 할당이 : 그냥 다음 과제에 덮어 쓰기, 그래서

2'b01: 
begin 
    U<=sum; // << here is assighment #1 
    {U,V}<=ASR; // << here is assignment #2 
    {X,X_1}<=CSR; 
end 

을 따라서 (10과 이하) 합은하지 않습니다 어떤 효과.