はじめに:この章の内容は主に、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 半加算器
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 |
ブレッドボードの実装: