Make/Day

毎日なにか作ります

41日目 ~16bit伝播加算器~

こんにちは!今日はデジタル回路の話題で更新します。

今回実装するのは、伝播加算器です。

なんぞそれ?と思われた方もいらっしゃるかもしれませんが、これまで紹介してきた16bit云々のと同じで、ユニットを縦に繋げただけの意外と単純なものです。
今回は、今実装している最中のCPUと同じ16bitの加算器を組み立てていきます。

というのも、じつは加算器の16bitバージョンだけ作るのを忘れていたからですね(・ω<) てへ

それで、繋げていくユニットについてですが、これは過去記事で実装した加算器たちを使用します。というか、最近テストベンチを書く時も紹介した子たちですね。
in-reality.hatenablog.com

上の記事でも、4bitの桁上げ伝播加算器については紹介していますが、どうも紹介だけで満足してしまっていたようです。

これは4bit伝播加算器、更に4倍繋げて今回のを作る

なので、今回はそれを16bitにアップグレードして実装します。コードの形で紹介するのは今回が初めてですね。

module Add16(
    input[15:0] a,b, 
    output[15:0] out
);
  wire [15:0] c;
  HalfAdder U1(a[0],  b[0],  out[0],  c[0]);
  FullAdder U2(a[1],  b[1],  c[0],  out[1],  c[1]);
  FullAdder U3(a[2],  b[2],  c[1],  out[2],  c[2]);
  FullAdder U4(a[3],  b[3],  c[2],  out[3],  c[3]);
  FullAdder U5(a[4],  b[4],  c[3],  out[4],  c[4]);
  FullAdder U6(a[5],  b[5],  c[4],  out[5],  c[5]);
  FullAdder U7(a[6],  b[6],  c[5],  out[6],  c[6]);
  FullAdder U8(a[7],  b[7],  c[6],  out[7],  c[7]);
  FullAdder U9(a[8],  b[8],  c[7],  out[8],  c[8]);
  FullAdder U10(a[9],  b[9],  c[8],  out[9],  c[9]);
  FullAdder U11(a[10], b[10], c[9],  out[10], c[10]);  
  FullAdder U12(a[11], b[11], c[10], out[11], c[11]);   
  FullAdder U13(a[12], b[12], c[11], out[12], c[12]);   
  FullAdder U14(a[13], b[13], c[12], out[13], c[13]);   
  FullAdder U15(a[14], b[14], c[13], out[14], c[14]);   
  FullAdder U16(a[15], b[15], c[14], out[15], c[15]);
endmodule

どうでしょうか?そのまま加算器を繋げただけだというのがパッと見でも伝わってくると思います。最初の1段目だけ、桁上がり信号が来ないので半加算器で済んでいます。
それ以降は前段の加算器の桁上げ信号を受け取るために全加算器を重ねていますね。
このように、桁上げの信号(キャリー)をどんどん伝播しているため、伝播加算器という名前がついています。

次回、ALUのテストベンチまでこぎつける予定です(´~`)
この調子でまったりやっていくので、次の更新もぜひよろしくお願いしますm(_ _)m