XNOR(AND,INV,NORから)作成・シミュレーション

更新日 2020-06-17 (水) 16:53:51

パーツ作成

Partsディレクトリの下に各パーツのフォルダを作成

インバータ

フォルダ Parts/INV04

  • module名:INV04
  • 入力信号名:A
  • 出力信号名:X

Parts/INV04/INV04.v

/* INV */

module INV04 ( A, X );

      input A;
      output X;

      assign X = ~A;

endmodule

テストベンチ

Parts/INV04/INV04_testbench.v

`timescale 1ns/1ps

module INV04_testbench;

reg a;
wire out;

INV04 test (a, out);

initial begin
      $dumpfile("wave.vcd");
      $dumpvars(0, INV04_testbench);
      $monitor ("%t: a = %b, out = %b", $time, a, out);

             a = 0;
      #10   a = 1;
      #10   a = 0;
      #10   $finish;
end

endmodule

AND

フォルダ Parts/AND08/AND08

  • module名:AND08
  • 入力信号名:A, B
  • 出力信号名:X

Parts/AND08/AND08.v

/* AND2 */

module AND08 ( A, B, X );

      input A, B;
      output X;

      and a08 (X, A, B);

endmodule

テストベンチ

Parts/AND08/AND08_testbench.v

`timescale 1ns/1ps

module AND08_testbench;

reg a, b;
wire out;

AND08 test (a, b, out);

initial begin
      $dumpfile("wave.vcd");
      $dumpvars(0, AND08_testbench);
      $monitor ("%t: a = %b, b = %b, out = %b", $time, a, b, out);

            a = 0; b = 0;
      #10   a = 1;
      #10   a = 0; b = 1;
      #10   a = 1;
      #10   a = 0; b = 0;
      #10   $finish;
end

endmodule

NOR

フォルダ Parts/NOR02/NOR02

  • module名:NOR02
  • 入力信号名:A, B
  • 出力信号名:X

Parts/NOR02/NOR02.v

/* NOR2 */

module NOR02 ( A, B, X );

      input A, B;
      output X;

      nor a00 (X, A, B);

endmodule

テストベンチ

Parts/NOR02/NOR02_testbench.v

/* NOR2 */

module NOR02 ( A, B, X );

      input A, B;
      output X;

      nor a00 (X, A, B);

endmodule

XNOR

フォルダ XNOR

  • module名:XNOR
  • 入力信号名:IN_A, IN_B
  • 出力信号名:OUT_O

XNOR.png

XNOR/XNOR.v

/* XNOR */


module XNOR (IN_A, IN_B, OUT_O);

   input IN_A;
   input IN_B;
   output OUT_O;

   wire   s1;
   wire   s2;
   wire   s3;
   wire   s4;

   // 内部回路のモジュールをインスタンス化

   INV04 IC1(
           .A(IN_A), .X(s1)
           );

   INV04 IC2(
           .A(IN_B), .X(s2)
           );

  AND08 IC3(.A(s1), .B(IN_B), .X(s3)
           );

   AND08 IC4(.A(IN_A), .B(s2), .X(s4)
            );

   NOR02 IC5(.A(s3), .B(s4), .X(OUT_O)
           );

endmodule

テストベンチ

XNOR/XNOR_testbench.v

/*************
*
*   XNOR bench
*
**************/

/* 以下が部品のパスになる */

`include "/home/okada/icarus_files/Parts/AND08/AND08.v"
`include "/home/okada/icarus_files/Parts/INV04/INV04.v"
`include "/home/okada/icarus_files/Parts/NOR02/NOR02.v"
 

`timescale 1ns / 1ps

module XNOR_testbench;

    reg IN_A;
    reg IN_B;

    wire O;

XNOR SSI1(IN_A, IN_B, O);

  // シミュレーション設定
   initial
     begin
       // wave.vcd という名前で波形データファイルを出力
       $dumpfile("wave.vcd");
       // xor_1に含まれるすべてのポートを波形データに含める
       $dumpvars(0, XNOR_testbench);
       // シミュレーション結果を示す変数(vvpを実行時、表示する)
       $monitor ("%t: IN_A = %b, IN_B = %b, Out = %b", $time, IN_A, IN_B, O);

     end

  // 信号生成
   initial
     begin
                   IN_A = 0; IN_B = 0;
        #100       IN_A = 1;
        #100       IN_A = 0; IN_B = 1;
        #100       IN_A = 1;
        #100       IN_A = 0; IN_B = 0;
        #100       $finish;
     end

endmodule

コンパイル

$ iverilog -o XNOR -s XNOR_testbench *.v

波形作成

$ vvp XNOR
VCD info: dumpfile wave.vcd opened for output.
                  0: IN_A = 0, IN_B = 0, Out = 1
             100000: IN_A = 1, IN_B = 0, Out = 0
             200000: IN_A = 0, IN_B = 1, Out = 0
             300000: IN_A = 1, IN_B = 1, Out = 1
             400000: IN_A = 0, IN_B = 0, Out = 1

添付ファイル: fileXNOR.png 9件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-06-17 (水) 16:53:51 (23d)