2017-11-07 17 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は動作しません。実際にはシフトはうまくいくが、rcaの和またはサブを「U」に加えることはうまくいかない。それはなぜ起こるのですか?私は説明が必要です。または、自分のコードをより良く変更できますか?私は4bit * 4bit - > 8bitの結果乗数を作る必要がありますVerilogブースアルゴリズムの加算と減算

+0

どのシフトが動作しますか?あなたのコードに** **シフトはありません。そこに 'non-blocking'アサインメントを使ってはいけません**。 – Serge

+0

@ Serge実際、ASRとCSRはシフトを意味します。 ASRは算術シフト、CSRは循環シフト –

+0

ASRです。 CSRは単なるワイヤーであり、単純な変数です。どんな名前をつけても、それが変わることはありません。だから、それはどういう意味ですか? – Serge

答えて

0

あなたのコードに複数の問題があります。

まず第一に時計はありません。 caseステートメントは完全に見え、組み合わせロジックですが、 'counter < = counter + 1`は組み合わせ論理ではなく、フロップを必要とします。

ノンブロッキングアサインメント「< =」を使用しているため、モデルが予想どおりにシミュレートされず、シミュレーションでグリッチやレースが発生する可能性があります。ブロッキング/ノンブロッキング割り当ての使用についての章を見直してください。あなただけの次の割り当てでそれを上書きし、だから、

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

、したがって、合計(サブ10で)取ることはありません。

は今例0110のために、あなたはU変数への複数の割り当てを持っています任意の効果。