はじめに:この章の内容は主に、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 7400 を使用して RS フリップフロップを構築します
0x01 D フリップフロップ (立ち上がりエッジ トリガー)
0x03 同期セット/リセット ポート立ち上がりエッジ D フリップフロップ
0x04 非同期セット/リセット ポートの立ち上がりエッジ D フリップフロップ
Ⅰ. 前提知識
0x00 7400 を使用して RS フリップフロップを構築します
知らせ:
a. トリガーの出力が維持されるため、初期状態を使用すると、シミュレーション開始時にエラーが報告されるか、状態が不定になります。
b. トリガーの定義によれば相補的であるはずなので、不正な状態です。
RS フリップフロップの真理値表は次のように導出されます。
入力 |
出力 |
||
Q |
|||
0 |
0 |
絶え間ない |
|
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1(0) |
1(0) |
0x01 D フリップフロップ
デジタル回路において、Dフリップフロップは最も単純で最もよく使われる基本的な順序論理回路であり、デジタル回路システムの基礎となります。
基本的なDフリップフロップ、同期リセット付きDフリップフロップ、非同期リセット付きDフリップフロップ、同期セット/リセット付きDフリップフロップ、非同期セット/リセット付きDフリップフロップに大別できます。リセット。
立ち上がりエッジによってトリガーされる D フリップフロップを設計します。つまり、クロックの立ち上がりエッジが検出されると、フリップフロップは次の真理値表に従って出力します。
引き金 |
D |
CP |
Q |
Q' |
D |
バツ |
0 |
保つ |
保つ |
D |
バツ |
1 |
保つ |
保つ |
D |
0 |
立ち上がりエッジ |
0 |
1 |
D |
1 |
立ち上がりエッジ |
1 |
0 |
0x02 リセット付き D フリップフロップ
デジタル回路では、リセット制御ポートを備えた一般的な立ち上がりエッジ D フリップフロップの機能表を次の表に示します。
引き金 |
R |
D |
CP |
Q |
Q' |
D |
0 |
バツ |
立ち上がりエッジ(同期リセット) |
0 |
1 |
D |
0 |
バツ |
X (非同期リセット) |
0 |
1 |
D |
1 |
バツ |
0 |
保つ |
保つ |
D |
1 |
バツ |
1 |
保つ |
保つ |
D |
1 |
0 |
立ち上がりエッジ |
0 |
1 |
D |
1 |
1 |
立ち上がりエッジ |
1 |
0 |
同期リセットとは、クロック信号の立ち上がりエッジが到着し、リセット制御ポートの信号が有効な場合にのみ、D フリップフロップがリセット動作を実行すること、つまり出力の値を意味することを理解するのは難しくありません。ポート Q はロジック 0 に設定され、出力ポート Q の値はロジック 0 に設定されます。値はロジック 1 に設定されます。非同期リセットでは、リセット制御ポートの信号が有効である限り、Dフリップフロップは直ちにリセット動作を実行しますが、このときのリセット動作はクロック信号とは関係ありません。
0x03 セット/リセット付き D フリップフロップ
同期セット/リセット ポートを備えた立ち上がりエッジ D フリップフロップの論理回路シンボルを次の図に示します。
その機能テーブルを次の表に示します。
引き金 |
S |
R |
D |
CP |
Q |
Q' |
D |
1 |
0 |
バツ |
立ち上がりエッジ(同期リセット) |
0 |
1 |
D |
0 |
1 |
バツ |
立ち上がりエッジ(同期リセット) |
1 |
0 |
D |
1 |
1 |
バツ |
0 |
保つ |
保つ |
D |
1 |
1 |
バツ |
1 |
保つ |
保つ |
D |
1 |
1 |
0 |
立ち上がりエッジ |
0 |
1 |
D |
1 |
1 |
1 |
立ち上がりエッジ |
1 |
0 |
クロック信号の立ち上がりエッジが到着し、同期セット/リセット ポートの信号が有効な場合にのみ、D フリップフロップがセットまたはリセット動作を実行できることを理解するのは難しくありません。
Ⅱ. Verilogの実装
0x00 RSトリガ(立ち上がりエッジトリガ)
設計コード:
module RS(clk,R,S,q,qb);
input clk,R,S;
output q,qb;
reg q;
assign qb=~q;
always@(posedge clk)
case({R,S})
2'b01: q<=0;
2'b10: q<=1;
2'b00: q<=1'bx;
endcase
endmodule
シミュレーションコード:
module test();
reg clk,R,S;
wire q,qb;
RS uut(
.R(R),
.S(S),
.clk(clk),
.q(q),
.qb(qb)
); initial
begin
clk=0;
end
always #10 clk=~clk;
initial
begin
R=0;S=0;
#10 R=0;S=1;
#20 R=1;S=0;
#20 R=1;S=1;
#20 $finish;
end
endmodule
シミュレーション波形:
0x01 D フリップフロップ (立ち上がりエッジ トリガー)
ドキュメントのデザイン:
module async_rddf(clk, d,q,qb);
input clk, d;
output q,qb;
reg q,qb;
always @(posedge clk) begin
q<=d; qb<=~d;
end
endmodule
シミュレーションファイル:
`timescale 1ns / 1ns
module test;
reg clk; reg d;
wire q; wire qb;
async_rddf uut (.clk(clk), .d(d), .q(q), .qb(qb));
initial begin
clk = 0;
d = 0;
#100;
end
always #20 clk=~clk;
always #30 d=~d;
endmodule
シミュレーション波形:
0x02 リセット付き D フリップフロップ
ドキュメントのデザイン:
module sync_rddf(clk,reset,d,q,qb);
input clk,reset,d;
output q,qb;
reg q,qb;
always @(posedge clk) begin
if(!reset) begin
q<=0;
qb<=1;
end
else begin
q<=d;
qb<=~d;
end
end
endmodule
シミュレーションファイル:
`timescale 1ns / 1ns
module test;
reg clk; reg d;reg reset;
wire q; wire qb;
sync_rddf uut (.reset(reset),.clk(clk), .d(d), .q(q), .qb(qb));
initial begin
clk = 0;
d = 0;
reset = 0;
#100;
end
always #25 reset=~reset;
always #20 clk=~clk;
always #30 d=~d;
endmodule
シミュレーション波形:
0x03 ポート D フリップフロップの立ち上がりエッジを同期的にセット/リセットします
設計コード:
module sync_rsddf(clk,reset,set,d,q,qb);
input clk,reset,set;
input d;
output q,qb;
reg q,qb;
always @(posedge clk) begin
if(!set && reset) begin
q<=1;
qb<=0;
end
else if(set && !reset) begin
q<=0;
qb<=1;
end
else begin
q<=d;
qb<=~d;
end
end
endmodule
シミュレーションコード:
`timescale 1ns / 1ns
module test;
reg clk; reg d;reg reset;reg set;
wire q; wire qb;
sync_rsddf uut (.set(set),.reset(reset),.clk(clk), .d(d), .q(q), .qb(qb));
initial begin
clk = 0;
d = 0;
reset = 0;
set = 0;
#100;
end
always #25 reset=~reset;
always #10 set=~set;
always #20 clk=~clk;
always #30 d=~d;
endmodule
シミュレーション波形:
0x04 非同期セット/リセット ポートの立ち上がりエッジ D フリップフロップ
設計コード:
module set_D(clk,n_reset,n_set,d,q,qb);
input clk,n_reset,n_set;
input d;
output q,qb;
reg q,qb;
always @(posedge clk or negedge n_reset or negedge n_set)
begin
if(!n_set && n_reset)
begin
q<=1;
qb<=0;
end
else if(n_set && !n_reset)
begin
q<=0;
qb<=1;
end
else
begin
q<=d;
qb<=~d;
end
end
endmodule
シミュレーションコード:
module sim_set_D();
reg clk,n_reset,n_set;
reg d;
wire q,qb;
set_D uu1(clk,n_reset,n_set,d,q,qb);
initial {clk,n_reset,n_set,d}=4'b0000;
always #20 clk=~clk;
always #40 n_reset=~n_reset;
always #80 n_set=~n_set;
always #30 d=~d;
endmodule
シミュレーション波形: