2016-10-05 6 views
1

Verilogを初めて使用しました。ここまで私がこれまで行ってきたことと、4ビットCLAが動作します。ただし、16ビット(4ビットCLAのインスタンスを使用)ではそうではありません。問題は、ブロックの伝播(BP)とブロックの生成(BG)のCout_itermed(中間キャリ)の値を設定することです。私はこれに対処するためにモジュールcarriesを作成しました。ザイリンクスISE、出力波形に4ビットキャリールックアヘッド(CLA)からの16ビット加算器 - ブロックからの出力生成と伝播

この(何波は図示せず)として表示:

Xilinx ISE

module CLA_4bit(
     output [3:0] S, 
     output Cout, PG, GG, 
     input [3:0] A, B, 
     input Cin 
     ); 

     wire [3:0] G,P,C; 

     assign G = A & B; //Generate 
     assign P = A^B; //Propagate 

     assign C[0] = Cin; 
     assign C[1] = G[0] | (P[0] & C[0]); 
     assign C[2] = G[1] | (P[1] & G[0]) | (P[1] & P[0] & C[0]); 
     assign C[3] = G[2] | (P[2] & G[1]) | (P[2] & P[1] & G[0]) | (P[2] & P[1] & P[0] & C[0]); 

     assign Cout = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]) |(P[3] & P[2] & P[1] & P[0] & C[0]); 
     assign S = P^C; 

     assign PG = P[3] & P[2] & P[1] & P[0]; // block generate 
     assign GG = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]); // block propagate 
endmodule 

module CLA_16bit(
     output reg [15:0] S, 
     output reg Cout, 
     input [15:0] A, B, 
     input Cin 
     ); 

     reg [3:0] BP, BG; 

     reg [3:0] Cout_itermed; 

     carries my_carries(BP, GP, Cin, Cout_itermed, Cout); 

     CLA_4bit cla0(S[3:0], Cout_itermed[0], BP[0], BG[0], A[3:0], B[3:0], Cin); 

     CLA_4bit cla1(S[7:4], Cout_itermed[1], BP[1], BG[1], A[7:4], B[7:4], Cout_itermed[0]); 

     CLA_4bit cla2(S[11:8], Cout_itermed[2], BP[2], BG[2], A[11:8], B[11:8], Cout_itermed[1]); 

     CLA_4bit cla3(S[15:12], Cout_itermed[3], BP[3], BG[3], A[15:12], B[15:12], Cout_itermed[2]); 

     Cout = Cout_itermed[3]; 
endmodule 

module carries (
     input [3:0] BP, 
     input [3:0] BG, 
     input Cin, 
     output reg [3:0] Cout_itermed, 
     output reg Cout 
     ); 

     assign Cout_itermed[0] = BG[0] | (BP[0] & Cin); 
     assign Cout_itermed[1] = BG[1] | (BP[1] & Cout_itermed[0]); 
     assign Cout_itermed[2] = BG[2] | (BP[2] & Cout_itermed[1]); 

     assign Cout = Cout_itermed[3]; 

endmodule 

Iがのテストベンチを実行すると、波形表示(及び正常)し4ビットCLA。誰でもcarriesまたはCLA_16bitモジュールのどこに問題があるのか​​説明できますか? CLA_4bitCout出力である第1、及びcarriesモジュールのCout_itermed出力である第2 -

答えて

1

Cout_itermedは、2個のドライバを有しています。

(それは2つのドライバがCLA_16bitcarriesに、同じ信号、Cout_itermed[3]になってしまうのですが)同じことがCLA_16bitCoutに適用されます。

Verilogでは物理的な回路について記述しているので、同じワイヤに2つのソース(ドライバ)を接続することは絶対に避けてください。

https://en.wikipedia.org/wiki/Lookahead_carry_unit#16-bit_adderに基づいています。 CLA_16bitCoutポートからCout_itermed[x]を削除することを定義してください(ポートをハングアップさせておくことができます)。ロジックCout_itermed[3]BG[3] | (BP[3]&Cout_itermed[2]))をcarriesモジュールに移動する必要があります。

+0

この問題を修正しましたか?申し訳ありませんが、それは非常に基本的な質問ですが、私は2,3時間それを再生しているが、それを働かせることができませんでした。 –

+0

いくつかの可能な変更について私の編集を参照してください。 – wilcroft

関連する問題