一、数据流级建模语法
数据流级建模的语句也成为连续赋值语句,用于对网线的赋值,以关键字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位值前补充2个0,即 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
声明:该文只适用于学习,其内容包含来自书本的摘抄和总结,欢迎大家补充,共同学习进步。