日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

<< 過去

未来 >>

論理回路をVerilog HDLで書いてみる

今日は実験の日。とはいえ、明日が就職試験だという学生もいるので実験ができるわけもなく。

最初に指導教員と進学について少々相談があったあと、課題が渡された。

それはVerilog HDLの勉強。またなんか出てきた。


HDLというのはハードウエア記述言語のこと。論理回路を書く言語ね。

そのHDLの1つ、Verilog HDLを勉強するといいよと言われた。

あとVHDLというのも有名ですね。

まぁなんにせよソフトウエアを書くようにカタカタ書いていけばいいわけです。

そうやって論理合成すれば論理回路が出てくると。そんなすばらしいものです。

これをFPGAという中身を変えられる論理回路のチップに転送したりすると所望の論理回路が作れると。


さて、例題にもあったようなプログラムを書いてみましょうか。

module Add(a,b,c);
  input [7:0]a,b;
  output [7:0]c;
  assign c=a+b;
endmodule

これは8ビットの足し算をするモジュールですね。

input [7:0]a,b ってのはaとbは入力で7から0まで8ビットあるよってこと。

assignはcはこういう式で表せるよってことを書く。組み合わせ論理回路で表せる話を書く。

組み合わせ論理回路というのは、 今の入力だけで出力が決まるタイプの回路のこと。

AND・OR・NOTが基本ですよね。足し算もこの範囲で表せますよね。

cにはa+bの結果がずっと出てる。


しかし、これじゃあ論理回路作ってる気にならんのでもうちょっとらしいのを書いてみる。

module HA(A,B,C,S);
  input A,B;
  output C,S;
  assign C=A&B;
  assign S=A^B;
endmodule
module FA(A,B,Cin,Cout,S);
  input A,B,Cin;
  output Cout,S;
  wire S1,C1,C2;
  HA HA1(.A(A) , .B(B)  , .C(C1), .S(S1));
  HA HA2(.A(S1), .B(Cin), .C(C2), .S(S) );
  assign Cout=C1|C2;
endmodule
module Add(a,b,c);
  input [7:0]a,b;
  output [7:0]c;
  wire [7:0]carry;
  FA FA0(.A(a[0]), .B(b[0]), .Cin(1'b0)    , .Cout(carry[0]), .S(c[0]));
  FA FA1(.A(a[1]), .B(b[1]), .Cin(carry[0]), .Cout(carry[1]), .S(c[1]));
  FA FA2(.A(a[2]), .B(b[2]), .Cin(carry[1]), .Cout(carry[2]), .S(c[2]));
  FA FA3(.A(a[3]), .B(b[3]), .Cin(carry[2]), .Cout(carry[3]), .S(c[3]));
  FA FA4(.A(a[4]), .B(b[4]), .Cin(carry[3]), .Cout(carry[4]), .S(c[4]));
  FA FA5(.A(a[5]), .B(b[5]), .Cin(carry[4]), .Cout(carry[5]), .S(c[5]));
  FA FA6(.A(a[6]), .B(b[6]), .Cin(carry[5]), .Cout(carry[6]), .S(c[6]));
  FA FA7(.A(a[7]), .B(b[7]), .Cin(carry[6]), .Cout(carry[7]), .S(c[7]));
endmodule

まじめに書いたらこんなのになるのかな。

HA作って、HA使ってFA作って、FA使って8ビットの加算回路を組んだ。あからさまに無駄よね。

こんなめんどくさいのが+の1文字で済むんだから便利ですよね。

inputとoutput以外にwireってのもあって、これは中だけで使う信号線のこと。

他のモジュールの回路を活用することも出来て、それがHA HA1(...)のようなのね。

1'b0と書いてあるが、これは数値ですね。1ビットで2進数(b)で0の値ということ。


もちろん順序論理回路も作れる。というわけでJK-FFでも作るか。

module JKFF(J,K,CK,Q);
  input J,K,CK;
  output Q;
  reg Q;
  always @(posedge CK) begin
    if(J==1'b1)
      Q <= 1'b1;
    else if(K==1'b1)
      Q <= 1'b0;
  end
endmodule

alwaysはwhile文みたいなもんよ。この中ループするの。@(posedge CK)はCKが立ち上がる度に実行されるという意味。

regというのは値を保持することができる信号線を表すらしい。FFとかまさにそうよね。

その値はalways文などの中で変えられて、<=で代入をすると。

その結果まさにJK-FFが作れそうなわけですね。


これでシミュレーションしてみたが、そのことはまた今度。

ただちゃんと動いてるっぽいね。


Author : hidemaro
Date : 2010/04/20(Tue) 23:56
研究・実験 | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools