目录
模块结构
模块组成:一部分描述接口(端口定义、I/O说明、内部信号说明),另一部分描述逻辑功能(功能定义)。
引用模块时,端口连接方式:
1. 模块名(连接端口1信号名,连接端口2信号名……)
2.模块名(.端口1名(连接信号1名),.端口2名(连接信号2名)
/*I/O说明也可以在端口声明语句中*/
module module_name(input port1,input port2,……
output port1,output port2……);
内部信号说明
reg [width-1:0] R变量1,R变量2……;
wire [width-1:0] W变量1,W变量2……;
功能定义
1. 用assign声明 变量可以是reg(是因为过程连续赋值语句吗),常用于组合逻辑
2. 用实例元件 被实例引用的模块,端口可以通过不同名的连线或寄存器类型变量连接到别的模块相应的输入、输出信号端
3. always块 变量需是reg 块中的语句为顺序语句,顺序执行,所以称这种块为过程块(既可以描述组合逻辑,也可以描述时序逻辑)
/*verilog模块中所有过程块(如always、initial块)、连续赋值语句、实例引用是并行的*/
assign a=b&c; //assign
and #2 u1(q,a,b); //实例元件
/* 异步复位,复位信号是触发信号,无论时钟信号是多少,都可以复位;同步复位,只有时钟信号是触发信号,只有某个时钟触发时,复位才会发生*/
always@(posege clk or posedge clr) //always块
begin
if (clr) q<=0;
else if (en) q<=d;
end
数据类型及其常量和变量
常量(不能被变化的量)
数字
1.整数
表达方式:
<位宽><进制><数字>全面的描述方式 位宽指明数字的精确位数,一个二进制位宽为1,一 个16进制位宽为4 8‘ha2
<进制><数字>数字位宽采用默认位宽(机器系统决定,至少32位)
<数字>采用默认进制(十进制)
2.x和z(?)值 一个x可以表示一个二进制,八进制、十六进制
3.负数 在表达式最前面加上负号
4.下划线 分隔开提高可读性 8’b_0011_1010
参数(parameter)型
标识符形式的常量 常用于定义延迟时间和变量宽度
parameter Width=1,Polarity=1
/* 通过#(n,n)改变参数 */
Decode #(4,0) D1(A4,F16) //参数变为4,0
Decode #(5) D2(A5,F32) //参数变为5,1
/*在一个模块中改变另一个模块的参数时,需要使用defparam命令*/
变量
wire
网络数据类型(wire、tri型),不能存储值。若没有连接到驱动器(如门或连续赋值语句assign),则变量为高阻态。wire通常用来表示单个门驱动或连续赋值,tri型变量则用来表示多驱动器驱动的网络数据类型。若没有定义逻辑强度,多驱动源下,逻辑值会发生冲突、从而产生不确定值。
verilog程序模块中输入、输出信号类型默认时自动定义为wire型。wire可以作为任何方程式的输入,也可以用作assign和实例元件的输出。
被实例引用的模块,其端口可以通过不同名的连接线或寄存器类型变量连接到别的模块相应的输入、输出信号端。
reg
数据存储单元的抽象,寄存器数据类型。reg默认初始值为不定值x,常代表触发器。always模块内被赋值的每个信号必须定义为reg,只表示被定义的信号用在always模块内,不是说reg型信号一定是寄存器或触发器的输出。
对于reg型数据,赋值语句的作用如同改变一组触发器的存储单元的值。reg型数据是一个表达式中操作数时,它的值被当作是无符号值,即正值。如开始寄存器被赋以值-1,表达式中值被认为15。
memory型
通过拓展reg数据类型的地址范围来生生成的。
reg [7:0] mema [255:0] //256个8位寄存器,地址范围为0到255
reg [n-1:0] rega; //一个n位寄存器 rega=0;//合法
reg mema [n-1:0]; //一个由n个一位寄存器构成的存储器 mema=0; //不合法
运算符及表达式
基本算术运算符
<=用作比较运算符时是双目运算,用作阻塞赋值时是单目运算,只在右边是操作数。
位运算符
按位异或(^)x和任何值异或都是x;按位同或(^~)是先异或,之后取反。
不同长度位运算,系统会自动将两者右端对齐。