k0b0's record.

Computer Engineering, Arts and Books

Introduction to SystemVerilog. Combination circuit (basic gate, adder, multiplexer, tri-state buffer)

組合わせ回路

 SystemVerilogで簡単な組合わせ回路を記述してみる。

論理ゲート

論理ゲート(logic_gates.sv)

 基本的な論理ゲートの記述例。入出力ビット幅はパラメータで指定する。

/* logic_gates.sv */
module logic_gates #(parameter WIDTH=1)
                    (input  [WIDTH-1:0] a,b,
	             output [WIDTH-1:0] y1,y2,y3,y4,y5);

assign y1 = a & b;    //AND
assign y2 = a | b;    //OR
assign y3 = a ^ b;    //XOR
assign y4 = ~(a & b); //NAND
assign y5 = ~(a | b); //NOR
endmodule

Nbit論理積(andNbit.sv)

 リダクション演算の記述例。リダクション演算を用いて4bit入力信号のaの各ビットの論理積を計算している。

/* andNbit.sv */
module andNbit #(parameter WIDTH=4)
                (input  [WIDTH-1:0] a,
	         output [WIDTH-1:0] y);

// y = a[0] & a[1] & a[2] & a[3]
assign y = &a; //リダクション演算
endmodule

加算器

 1bit全加算器の記述例。

全加算器(adder.sv)

/*adder.sv*/
module adder (input  a, b,cin,
              output s, cout);

logic p,g;
assign p = a ^ b;
assign g = a & b;

assign s = p ^ cin;
assign cout = g | (p & cin);
endmodule

Nbit全加算器(adderNbit.sv)

 Nbit全加算器の記述例。パラメータにてbit幅を指定。

/*adderNbit.sv*/
module adderNbit #(parameter WIDTH=4)
                  (input  [WIDTH-1:0] a, b,
	           input              cin,
                   output [WIDTH-1:0] s,
	           output             cout);

assign {cout, s} = a + b + cin;
endmodule

マルチプレクサ(セレクタ)

1bit2to1マルチプレクサ(mux.sv)

 1bit2入力1出力のマルチプレクサの記述例。信号selの値によって入力信号d0、d1を選択する。

/*mux.sv*/
module mux (input d0,d1,sel,
            output s);

assign s = (sel==1'b0)? d0 : d1;
endmodule

Nbit2to1マルチプレクサ(muxNbit2to1.sv)

 こちらは上述したマルチプレクサのNbit版。パラメータNにてビット幅を指定する。

/* muxNbit2to1.sv */
module muxNbit2to1 #(parameter WIDTH=4)
                    (input  [WIDTH-1:0] d0,d1,
                     input              sel,
                     output [WIDTH-1:0] s);

assign s = (sel==1'b0)? d0 : d1;
endmodule

トライステートバッファ

トライステートバッファ(tristate.sv)

 トライステートバッファの記述例。en(許可信号)により有効な出力(a)かZ(ハイインピーダンス)かを選択する。

/* tristate.sv */
module tristate #(parameter WIDTH=1)
                 (input  [WIDTH-1:0] a,
		  input              en,
	          output [WIDTH-1:0] y);

assign y = (en)? a : 1'bz;
endmodule