FPGAデジタルシステムデザイン(3)-データフローレベルのモデリング

1.データフローレベルのモデリング文法
データフローレベルのモデリングステートメントは、継続的な割り当てステートメントにもなりました。これは、文法的な識別としてキーワードassignを使用して、ネットワークケーブルに値を割り当てるために使用されます。
1.文法構造

assign 网线信号名 = 运算表达式;
例
assign and1 = (~En)&(~S1)&(S0)&(A);
assign Y = En ? 0:(S1 ? (S0 ? D:C)(S0 ? B:A));

2、オペランド
ここに画像の説明を挿入番号

<位宽>'<进制><数值>2'b01            2进制          01
4'd11            10进制	       1011
6'o37            8进制	       011111
8'hab            16进制	       1010_1011

特例
8'o37            位宽多于数值宽度
在原本6位值前补充20,即    8'o37=8'b00011111
6’hab           位宽少于数值宽度
在原本最高位的两个有效数值位被截掉,即 6'hab = 6'b101011

例
8'ox7        相当于   xxxxx111
8'h7x        相当于   0111xxxx

数字は記号の数を表すこともできます。数字の直前にプラスまたはマイナス記号を追加するだけです。これは、現在の負の数の補数を意味します。値の部分に負の符号を入れることはできません。

例:
-4'd6;  存为-6的补码。

パラメータ

parameter        参数名1 = 表达式1,参数名2 = 表达式2 ;
例
parameter size = 8;
parameter a = 4,b = 16;
类似于C的一种赋值

パラメータはモジュールで定義され、位置はモジュール内の最初のレベルであるポート宣言のレベルと同じです。

モジュールの第1レベルの構文は、次のとおりです。
ポート名:wireまたはreg宣言、ゲートレベルの呼び出し、モジュールのインスタンス化ステートメント、連続代入割り当てステートメント、パラメーター宣言、およびその他の
パラメーター。アクションの範囲は、このモジュールとこれにのみあります。インスタンス化後のモジュール。、このモジュールは無効になります。

モジュールのインスタンス化中にパラメータを書き換えることもできます。
モジュールの書き換えパラメータ:defparamまたは#()。

例
module example (A,Y);
...
parameter  size = 8,delay = 15;
...
endmodule 

module test;
...
example #(6,6)  t1(a1,y1);                   //分别修改size = 6 delay = 6
example #(4) t2(a2,y2);                      //只修改size的值,size = 4
...
endmodule

module annotate;
//参数改写
deparam  test.t1.size = 6, test.t2.delay = 6;
endmodule


ネットワークケーブル

wire [宽度声明] 网线名1, 网线名2;
例
wire [5:0] C;
wire [4:0] a,b;
wire x;

登録登録

reg [n-1:0] 存储器名称 [0:m-1];                     //表示为该存储器的位宽为n,存储单元有m个
例
reg [5:0] a [6:0];
//此时 a[0]为_ _ _ _ _ _ 
      a[1]为_ _ _ _ _ _
      a[2]为_ _ _ _ _ _
      a[3]为_ _ _ _ _ _
      a[4]为_ _ _ _ _ _
      a[5]为_ _ _ _ _ _
      a[6]为_ _ _ _ _ _
      即a有7个6位寄存器

オペレーターオペレーター
ここに画像の説明を挿入
優先度
ここに画像の説明を挿入
2.一般的なデータフローレベルモデリング1.4
ビット全加算器
4ビット全加算器は、次の
図に示すように、1ビット全加算器を直列に接続して1ビット全加算器RTL図を形成します。
ここに画像の説明を挿入

module addfull(S , cout , cin , A , B);
input cin , A , B;
output S , cout;
assign S = cin ^ A ^ B;
assign cout = (cin & A) | (cin & B) | (B & A);
endmodule

ここに画像の説明を挿入

module add4(S, COUT, A, CIN, B );
input CIN;
input [3:0] A,B;
output COUT;
output [3:0] S;
wire c1, c2, c3;
addfull add0(.S(S[0]), .cout(c1), .cin(CIN), .A(A[0]), .B(B[0]));
addfull add1(.S(S[1]), .cout(c2), .cin(c1), .A(A[1]), .B(B[1]));
addfull add2(.S(S[2]), .cout(c3), .cin(c2), .A(A[2]), .B(B[2]));
addfull add3(.S(S[3]), .cout(COUT), .cin(c3), .A(A[3]), .B(B[3]));
endmodule

シミュレーション図は以下の図に示されている:
ここに画像の説明を挿入
2
2-4 2-4デコーダデコーダが出力四つの異なる二進数への入力00 01 10 11であり
、以下に示すように、RTL回路図
ここに画像の説明を挿入

module DEC2_4(A, B, En, Z);
input A, B, En;
output [3:0] Z;
assign Z = En ? (A ? (B ? (4'b0111):(4'b1011)):(B ? (4'b1101):(4'b1110))):(4'b1111);
endmodule

シミュレーションを下の図に示します
ここに画像の説明を挿入。3。マスタースレーブDフリップフロップ

Dフリップフロップは、メモリ機能とゼロ安定状態ストレージを備えたメモリです。
機能表
ここに画像の説明を挿入
タイミング図
ここに画像の説明を挿入
RTLシミュレーション図

ここに画像の説明を挿入

module MSDFF(Q, Qbar, C, D);
input C, D;
output Q, Qbar;
wire NotC, NotD, NotY, Ybar, Y, D1, D2, Y1, Y2;
assign NotD = ~D;
assign NotC = ~C;
assign NotY = ~Y;
assign D1 = ~(D&C);
assign D2 = ~(NotD&C);
assign Y = ~(D1&Ybar);
assign Ybar = ~(D2&Y);
assign Y1 = ~(NotC&Y);
assign Y2 = ~(NotY&NotC);
assign Q = ~(Qbar&Y);
assign Qbar = ~(Q&Y2);
endmodule

ここに画像の説明を挿入
免責事項:この記事は学習にのみ適しています。その内容には、本からの抜粋と要約が含まれています。皆さんが一緒に追加して進歩することを歓迎します。

おすすめ

転載: blog.csdn.net/qq_24213087/article/details/107458296