FPGA数字系统设计(3)——数据流级建模

一、数据流级建模语法
数据流级建模的语句也成为连续赋值语句,用于对网线的赋值,以关键字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

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

参数定义在模块内,位置与端口声明所处级别相同,处于模块内部的第一级别。

模块第一级别的语法为:
端口声名: wire或reg声明、门级调用、模块的实例化语句、持续赋值assign语句,参数声明等
参数的作用范围仅在此模块内以及实例化之后的本模块,出了本模块不再生效。

模块实例化的过程中还可以对参数进行改写
模块的改写参数 :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

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

寄存器reg

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位寄存器

操作符
在这里插入图片描述
操作符优先级
在这里插入图片描述
二、典型数据流级建模
1、四位全加器
四位全加器是由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