Make/Day

毎日なにか作ります

24日目 ~Register~

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

今回は、19日目に更新した内容の続きで順序回路を作っていきます。
その名も、Nbitレジスタです。
レジスタは、前回紹介したDFFから作られる記憶素子の一つになります。(というか、前回の最後に紹介したDFF回路は1bitレジスタそのものですね)
in-reality.hatenablog.com

データ保持回路改め、1bitレジスタ

Nbitと言っても、折角16bitのALUなどを設計してきたので、レジスタも16bitに統一しようと思います。
複数bitのレジスタは、前回作ったモジュールを並列に並べればよいだけなので、以下のようなコードになります。

module Bit (
    input in, load, clk,
    output out
);
    reg d;
    assign out = d;
    always @(posedge clk) begin
        if (load) begin
            d = in;
        end
    end
endmodule

module Register (
    input [15:0] in,
    input load,clk
    output [15:0] out
);
    Bit U0(in[0], load, clk, out[0]);
    Bit U1(in[1], load, clk, out[1]);
    Bit U2(in[2], load, clk, out[2]);
    .....
    Bit U2(in[N], load, clk, out[N]);
endmodule

ちなみに、前回紹介したモジュールは名を改めBitという名前にしました。後は、Registerモジュールにあるようにそのまま並列に並べていって16bitレジスタの完成です。

23日目 ~チョボマキの消しゴムはんこ その2~

こんにちは!今日も消しゴムはんこの話題で更新していきます。

 

今回は、前回に引き続きチョボマキのハンコを作っていきます。

 

in-reality.hatenablog.com

 

前回は消しゴムに図案を転写したところまで更新しました。なので、今回は彫り進めて完成するところまでになります。

 

というか、完成図しかいつも撮らないのでもう次にお見せできる写真は出来上がったものになります。

それでは、どうぞ!

 

チョボマキ消しゴムはんこ

色分けもしていないので安定した良いハンコになっていますね。冒険はあまりしていないのですが、なんか線の太さが均等でないところが気になりますね。こちらの方がハンコらしさは出てるような気はするのですが、少しは改善していきたいところです。

 

皆さんはどう思われますか?

 

22日目 ~チョボマキの消しゴムはんこ その1~

こんにちは!今日は消しゴムはんこの話題で更新していきます!

 

今回作るのは、ポケモンから、チョボマキのハンコです!

図案についてですが、ポケモンカードゲームの絵から持ってきてみました。

試しに写して、消しゴムに転写してみると...

爆炎ウォーカーから

非常に良い感じです!サイズ感も程よく、絵も生き生きとしているのでハンコの題材としてはホントにマッチしてます。

ただ、チョボマキは色分けするとかなり様々なハンコによる重ね押しが必要になると思うので、今回は線主体にして彫っていこうと思います。

 

明日の更新に期待❣

21日目 ~ALU~

こんにちは!今日はついにALUの機能紹介と実装を行います。また、テストベンチの実装は次回になるため、今回紹介するコードは参考書籍の環境での検証までしか行っていません。使用する際は、自己責任でお願いしますm(_ _)m

対象となるALUはNand2tetris(参考書籍)で紹介されている、"Hack"とします。
よって、実装する命令は以下の18種類となります。

  • 0
  • 1
  • -1
  • x
  • y
  • NOT(!x)
  • NOT(!y)
  • -x
  • -y
  • x+1
  • y+1
  • x-1
  • y-1
  • ADD(x+y)
  • SUB(x-y)
  • SUB(y-x)
  • AND
  • OR

ALUのこれらの動作を制御するbitは全部で6本になり、
それぞれ入力xを0にする(zx)、反転する(nx)、入力yを0にする(zy)、反転する(ny)、AddかAndの関数の選択bit(f)、出力の反転(no)を指示します。
これらの制御ビットは信号を選択するマルチプレクサのセレクト信号として働かせます。
従って、これらの機能を実現するように回路図を書くと、

ALUの実装

となります。それぞれの動きは、マルチプレクサごとに切って追ってみると分かりやすいと思います。
また、回路図中にOrゲートはありませんが、NotとAndゲートによりうまく実現されていることがわかります。このように、設計の段階で非常にうまく考えられている為、今回はこのALUを使用させて頂きました。

そして、上図と、そこから更に16bitの等号比較と負判定の機能を出力に持たせたALU(out信号をさらに加工するので、上図のALU回路に変更はない) をVerilog HDLで記述すると以下のようになります。

module ALU (
    input [15:0] x, y,
    input zx, nx, zy, ny, f, no,
    output [15:0] out,
    output zr, ng
);
    wire [15:0] zxout, invxout, nxout, zyout, invyout,
                nyout, addout, andout, fout, fnout, functout, middle;
    wire lowout, highout, nzr;

    //zx
    Mux16 U0(x, 16'b0, zx, zxout);    
    //nx
    Not16 U1(zxout, invxout);
    Mux16 U2(zxout, invxout, nx, nxout);
    
    //zy
    Mux16 U3(y, 16'b0, zy, zyout);
    //ny
    Not16 U4(zyout, invyout);
    Mux16 U5(zyout, invyout, ny, nyout);
    // 入力操作はここまで

    //function_code
    Add16 U6(nxout, nyout, addout);
    And16 U7(nxout, nyout, andout);
    Mux16 U8(andout, addout, f, fout);

    //out + ng
    Not16 U9(fout, fnout);
    Mux16 U10(fout, fnout, no, middle);
    And16 U11(middle, middle, out);
    And U12(1'b1, middle[15], ng);
    
    //zr
    Or8Way U13(middle[7:0], lowout);
    Or8Way U14(middle[15:8], highout);
    Or  U15(lowout, highout, nzr);
    Not U16(nzr, zr);
endmodule

これでコンピュータの自作に用いる組み合わせ回路の大部分は実装してしまいました。
次回以降はテストベンチを用いたこの回路の検証、そして前回ちょろっと出した順序回路の実装へとシフトしていきます。

参考書籍

20日目 好きだった給食メニュー

今週のお題「好きだった給食メニュー」

 

こんにちは!日曜日はだらけてなにも作らなかったので、お題に答えることにします。

 

今回の話題は、「好きだった給食メニュー」ということで、曖昧になった記憶から、少し掘り起こして書いてみたいと思います。

 

小学校給食になるのですが、今でも鮮明に覚えているのが「手巻き寿司」です。酢飯と個包装ののり、皿に具材を乗せられて自分の席まで運んでいた思い出があります。頻繁にはなかったのでみんな給食カレンダーの先にこのメニューが出てくると浮足立っていました。具材は、玉子やキュウリ、あとはカニカマ?みたいなのがあったような気がします。早く食べ終わったらあまりや、休みの人の分も貰えたので、急いで食べて回収していました。

 

一人では多くの品目を用意できないので、こういうご飯は今では特別ですね。

Oisix特別お題キャンペーン「好きだった給食メニュー」

Oisix(オイシックス)×はてなブログ 特別お題キャンペーン
by Oisix(オイシックス)

19日目 ~DFF~

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

ALUは少し後回しにして、今回はDフリップ・フロップ回路(DFF)を紹介していきます。

DFF単体は、組み合わせ回路の出力を保存することのできる記憶素子です。

以下に示す図で、DFFがどんな記号か見てみます。

DFFの図

この図では、入力がD、出力がQとなっています。基本的に、CLKがL(0)からH(1)に立ち上がる時にDの信号値を受け取ります。そして、Qから出力するという回路なわけですが、このQの出力をまたDに繋いでやればデータが保持できるわけです。

ずっと値を保持し続けるときはこう

しかし、このままでは入力を受け付けることができないため、

実際はマルチプレクサによりloadするかデータ保持かの条件分岐を行う必要があります。

よって、

これで立派なメモリになった

と設計します。

これをVerilogHDLのコードで書き表すと以下のようになります。

module DFF (
    input in, load, clk,
    output out
);
    reg d;
    assign out = d;
    always @(posedge clk) begin
        if (load) begin
            d = in;
        end
    end
endmodule

はてな記法にし忘れたため色分けできませんでしたが、短いコードなのでわかりやすいと思います。

このコード中ではマルチプレクサが出てきていませんが、ifの条件分岐がそれにあたります。クロックのposedge(positive edgeつまり、信号の立ち上がりのこと)中に、load信号がonであればDFFのにinのデータを取り込み、値を更新します。それ以外では、dの値をそのままoutへ垂れ流しています。また、dはレジスタとして宣言している為、この記述のみで値の保持ができます。

 

ALUより先に、記憶する回路に手を伸ばしてしまいました。しかし、着実にコンピュータの実装に近づいている気がします。

 

参考書籍

 

 

18日目 ~デマルチプレクサ~

こんにちは!今日はデジタル回路の話題から、デマルチプレクサ(略してDMUX)を紹介していきます!

この回路は、選択信号(sel)に従って、入力(in)を複数の出力(Yx)のうちのどれかに振り分ける機能を持ちます。
例えば、1入力4出力の場合、2bitで選択する必要があるので、以下のような真理値表と回路図になります。

デマルチプレクサ
DMUXの真理値表

この機能を実現するには、選択信号(sel)と、入力の論理積をとることで実現できます。DMUXの真理値表から、Y3の出力を見てみます。
すると、Y3=inなのはsel0, sel1が1の時のみなので
Y3=(sel1 ・ sel0) ・in
であることがわかります。
このようにしてほかの出力の分も作ってやると、以下のVerilogコードになります。

module DMux4Way (
    input wire in,
    input wire [1:0] sel,
    output a,b,c,d
);
    wire w0, w1, w2, w3, nsel1, nsel2;
    wire [1:0] sel;
    Not  U0(sel[0], nsel1);
    Not  U1(sel[1], nsel2);
    And  U3(nsel1,  nsel2, w0);
    And  U4(sel[0], nsel2, w1);
    And  U5(nsel1,  sel[1],w2);
    And  U6(sel[0], sel[1],w3);
    And  U7(in, w0, a);
    And  U8(in, w1, b);
    And  U9(in, w2, c);
    And  U10(in, w3, d);
endmodule

これで、nand2tetrisで登場するほとんどの基本モジュールは紹介しました。次回の更新からいよいよALUへ突入していきます!

参考書籍