【FPGA】Verilog: モジュール式組み合わせ論理回路設計 | 半加算器 | 全加算器 | シリアル加算器 | サブモジュール | メインモジュール

はじめに:この章の内容は主に、Vivadoで Verilog 言語を使用した回路設計、シミュレーション、合成、およびダウンロードを説明することです。

例: 加算器

 

  • 特徴: Xilinx Artix-7 XC7A35Tチップを使用 
  • コンフィギュレーション方法: USB-JTAG/SPI フラッシュ
  • 最大 100MHz の内部クロック速度 
  • メモリ: 2Mbit SRAM N25Q064A SPI Flash (サンプル画像の旧モデルは N25Q032A)
  • 汎用IO: スイッチ: x8LED: x16ボタン: x5DIP: x8 汎用拡張IO: 32pin
  • オーディオおよびビデオ/ディスプレイ: 7 セグメント デジタル チューブ: x8 VGA ビデオ出力インターフェイス オーディオ オーディオ インターフェイス 
  • 通信インターフェース: UART: USB to UART Bluetooth: Bluetooth モジュール 
  • アナログ インターフェイス: DAC: 8 ビット分解能 XADC: 2 ウェイ 12 ビット 1Msps ADC

目次

Ⅰ. 事前知識

 0x00 半加算器

 0x01 全加算器

Ⅱ. Verilogの実装 

 0x00 注意事項

 0x01 1 ビット全加算器

 0x02 シリアル加算器


Ⅰ. 事前知識

 0x00 半加算器

2 つの 1 ビット2 進数を加算、合計、桁上げできる論理回路は、半加算器と呼ばれますまたは、半加算器と呼ばれる下位桁上げからの演算回路を考慮せず、2 つの 1 ビット 2 進数の加算のみを考えます。

次の図は、半加算器のブロック図です。     

その内: In1 と In2 はそれぞれ加数と加数で、回路の入力端子として使用されます; S は 2 つの数値の加算によって生成される標準和であり、 とともに回路の出力として使用されます。 2 つの数値の加算によって生成される上位キャリー C。

2 進数の加算の原理に従って、半加算器の真理値表は次のように得られます。

信号入力

信号出力

1で In2

S

C

0

0

0

0

0

1

1

0

1

0

1

0

1

1

0

1

 0x01 全加算器

全加算器は実際にはキャリーを考慮した加算器です。

全加算器入力 

全加算器出力 

B

シン

BCDout

コウト

0

0

0

0

0

0

0

1

0

1

0

1

0

0

1

0

1

1

1

0

1

0

0

0

1

1

0

1

1

0

1

1

0

1

0

1

1

1

1

1

真理値表:

論理式:

ここに画像の説明を挿入

 2 つの半加算器は全加算器を形成できるため、ここでのキャリー Ci は次のように表すこともできます。 

ここに画像の説明を挿入

Ⅱ. Verilogの実装 

 0x00 注意事項

この実験では、サブモジュールメインモジュールの作成が関係します

メイン モジュール (トップレベル ファイル) では、設計を満たすためにサブモジュールが呼び出されます。

以下では、加算器を例として、サブモジュールとメイン モジュールの作成と呼び出しを紹介します。

1. サブモジュールの設計

参考プログラム:

プログラム ファイル 1: 

module FA1(input A,input B,input Cin,output reg Cout,output reg S);
always @(A or B or Cin)begin
 {Cout,S}=A+B+Cin;
end
endmodule

プログラム ファイル 2: (オプション、カスタム)

module UserAND(a,b,z); 
input a,b; 
output z; 
assign z=a&b; 
endmodule 

上記のプログラムは、自分で設計および変更することもできます。

2. メイン モジュールを設計します: (最上位ファイル)

module EX5_Top(input [1:0] IA,input [1:0] IB,output [1:0] sum,output C );
wire ct; 
//子模块的调用,例如其中FA1为子模块名称,FD0和FD1为在顶层文件中引用的名称。 
FA1 FD0 (.A(IA[0]),.B(IB[0]),.Cin(0),.Cout(ct),.S(sum[0])); 
FA1 FD1 (.A(IA[1]),.B(IB[1]),.Cin(ct),.Cout(C),.S(sum[1]));
Endmodule

3. ファイルをコンパイルし、RTL ビューを表示します (図を参照)。

 0x01 1 ビット全加算器

 設計コード:

module  ADD_Top(input [1:0] IA,input [1:0] IB,output [1:0] sum,output C );
wire ct; 

ADD FD0 (.A(IA[0]),.B(IB[0]),.Cin(0),.Cout(ct),.S(sum[0])); 
ADD FD1 (.A(IA[1]),.B(IB[1]),.Cin(ct),.Cout(C),.S(sum[1]));

endmodule

module ADD(input A,input B,input Cin,output reg Cout,output reg S);
always @(A or B or Cin)begin
 {Cout,S}=A+B+Cin;
end
endmodule

シミュレーション設計コード:

module sim_ADD_Top( );
reg [1:0] IA;
reg [1:0] IB;
wire [1:0] sum;
wire ct;
 ADD_Top uu1(IA,IB,sum,ct);
initial {IA,IB}=4'b0000;
always 
 #100{IA,IB}={IA,IB}+1;
 
endmodule

Vivado の [Run Simulation] メニューをクリックしてシミュレーション デバッグ モードに入り、シミュレーション出力ウィンドウにシミュレーション タイミング波形を表示できます。

波形図:

 0x02 シリアル加算器

半加算器と全加算器の理解に基づいて、モジュール設計手法を使用して、4 つの全加算器を通じて 4 ビットのシリアル加算器の設計を実現できます。

設計コード:

`timescale 1ns / 1ps
module M_4bit_adder(S,C3,A,B,C_1);
input [3:0]  A,B;
input C_1;
output [3:0] S;
output C3;
wire C0,C1,C2;
fulladder u0(S[0],C0,A[0],B[0],C_1);
fulladder u1(S[1],C1,A[1],B[1],C0);
fulladder u2(S[2],C2,A[2],B[2],C1);
fulladder u3(S[3],C3,A[3],B[3],C2);
endmodule


module halfadder(S,C,A,B);
input A,B;
output S,C;
xor(S,A,B);
and(C,A,B);
endmodule

module fulladder(S,C,A,B,Cin);
input A,B,Cin;
output S,C;
wire S1,D1,D2;
halfadder HA1(.S(S1),.C(D1),.A(A),.B(B));
halfadder HA2(.S(S),.C(D2),.A(S1),.B(Cin));
or g1(C,D2,D1);
endmodule

シミュレーション設計コード:

module sim_ADD();
reg [3:0] A,B;
wire [3:0] S;
wire C3;

M_4bit_adder uu1(S,C3,A,B,0);
initial {A,B}=8'b0000_0000;
always
#100 {A,B}={A,B}+1;
endmodule

波形図:

ハードウェア制約を追加してブレッドボードを接続し、

基準ピン割り当ては次のとおりです。

プログラム端子名 

実際のピン 

説明する 

あ(0

N4

トグルスイッチ SW1

あ(1

M4

トグルスイッチ SW2

B(0

R2

トグルスイッチ SW3

B(1

P2

トグルスイッチ SW4

合計(0) 

K2

LED0

合計(1) 

J2

LED1

C

J3

LED2

ブレッドボードの実装:

おすすめ

転載: blog.csdn.net/m0_66307842/article/details/128915895