前回に引き続き,今回は半加算器(half adder)を2つ使って,全加算器(full adder)を作成する.
今回はfaddrというプロジェクトを作成する.
faddrのプロジェクトフォルダに前回作成したhaddr.vをコピーし,[Project]->[Add/Remove Files in Project]からfaddrのプロジェクトにhaddr.vを追加する.
[File]->[New]から[Design Files]タブのVerilog HDL Fileを選択,faddr.vとして保存する.
faddr.vの内容は以下のようにする.
module faddr(clk,in_A,in_B,cin,out,cout); input clk,in_A,in_B,cin; output reg out,cout; wire out1,cout1; wire out2,cout2; haddr haddr1(clk,in_A,in_B,out1,cout1); haddr haddr2(clk,out1,cin,out2,cout2); always @(posedge clk)begin out<=out2; cout<=cout1|cout2; end endmodule
[Processing]->[Start]-[Start Analysis & Synthesis]でコンパイルを行う.
コンパイルが通ったら,[Tools]->[Run Simulation Tools]->[RTL Simulation]でシミュレータを起動.
前回と同様に,入力波形を作成する.
[Library]タブをworkを展開し,faddrを右クリックしてCreate Waveを選択.
[Wave]フォームに各信号が表示されるので,入力関係のみ適当にセット.
今回はこのようにした.
真理値表の全パターンを網羅するために,in_Aの周期を400[ns],in_Bを200[ns],cinを100[ns]とした.
なお,clkは周期短めにして,結果が即時反映されるようにしている.
前回と同様,[File]->[Export]->[Waveform]からVerilog Testbenchを選択し,tb.vとして保存する.
終わったらModelSimを閉じる.
[Project]->[Add/Remove Files in Project]からtb.vを追加する.
tb.vを開き,「wire reg 変数名;」を「wire 変数名;」に書き換える.
その後,[Processing]->[Start]-[Start Analysis & Synthesis]でコンパイルを行う.
[Assignments]->[Settings…]を開き,[EDA Tool Settings]->[Simulation]の中にあるNativeLink Settingsを設定する.
詳しくは前回参照.
再びModelSimを起動すると,こうなった.たぶん正しいはず.
ちょくちょく変なふうになってるのは,haddr2の入力はhaddr1の入力なのに同じclkを使ってるからかな.
クロックを細かくしたら変なところの幅が狭まったので,たぶんそうでしょう.
なお,キャリー予測とかは面倒なので行わない.