赞
踩
Verilog是一种硬件描述语言:用形式化方法(文本形式)来描述和设计数字电路和数字系统的高级模块化语言。可编写设计文件、建立电路模型、编写测试文件进行仿真。
1.变量值
- 0:代表逻辑0或否条件;在电路中一般是低电平
- 1:代表逻辑1或真条件;在电路中是高电平
- X:代表未知的逻辑值(可能为0或1);一般是寄存器类型(reg)未初始化
- Z:代表一个高阻态;是线型(wire)变量未接驱动
2.wire & reg
- wire: 线网; 用来表示硬件单元之间的物理连线
wire a;
wire b;
wire c=1'b0;
- reg: 寄存器; 用来表示存储单元
reg rstn;
initial begin
rstn=1'b0;
#100;
rstn=1'b1;
end
3.向量vector
- 标量Scalar: 1-bit位宽的线网或寄存器类型
wire n1;
reg d1;- 向量Vector:n-bit位宽的线网或寄存器类型
wire [3:0] n0;
reg[3:0] d0;
4.数组Array
- 在Verilog中允许声明reg, wire, integer, time, real及其向量类型的数组
// y is an scalar reg array of depth=12, each 1-bit wide
reg y1[11:0];
//y is an 8-bit vector net with a depth of 4
wire [0:7] y2 [3:0];
//y is a 2D array rows=2, cols=4 each 8-bit wide
reg [7:0] y3 [0:1][0:3];
- 存储器:寄存器数组模拟存储器,可用来描述RAM或ROM的行为
module des();
//reg vector 8-bit wide
reg [7:0] mem1;
//8-bit wide vector array with depth=4;
reg [7:0] mem2 [0:3];
//16-bit wide vector 2D array with rows=4, cols=2
reg [15:0] mem3[0:3][0:1];
initial begin
mem=8'ha9;
$display("mem1 = 0x%0h", mem1);
5.其他类型
- integer: 32位宽的通用整型变量,可在对硬件建模时用于其他目的(可综合)
- time: 无符号64位宽,可用于存储仿真时间量以进行仿真调试,realtime变量时将时间存储为浮点数(不可综合)
- real:实数变量,可存储浮点值, 可以与integer和reg相同的方式进行赋值(不可综合)
- string:字符串,存储在reg中, reg变量的宽度必须足够大以容纳字符串(可综合)
Verilog的基本设计单元是模块。
模块由四个主要部分组成:
module block1(a,b,c,d);
input a,b,c;
output d;
wire x;
assign d=a|x;
assign x=(b&~c);
endmodule
模块是一个具有特定功能的设计单元,在电路综合时模块会被转换为相应的数字电路
给定模块一组输入,模块会返回一组输出,这意味着模块可以被重复使用,由此来实现更复杂的电路
按照如下形式来实例化模块:
module mod1(input d,...);
//contents of the module
endmodule
module mod2;
wire data;
mod1 u0(.d(data),...);
//contents of the module
endmodule
操作符也称运算符, 是Verilog HDL预定义的函数符号。
功能 | 符号 | 含义 |
---|---|---|
算术运算符 | +,-,* , /,%, ** | 加,减,乘,除,求模,求幂 |
逻辑运算符 | &&,II, !(单目) | 逻辑与,逻辑或,逻辑非 |
关系运算符 | <, >, <=, >= | 小于,大于,小于等于,大于等于 |
等值运算符 | = =, !=, = = =, != = | 等于,不等,全等,不全等 |
缩减运算符 | &,~ &,I,~ I,^ , ^ ~ /~ ^ | 与,与非,或,或非,异或,同或(都为单目) |
条件运算符 | 信号 = 条件?表达式1:表达式2; | 条件为真时,信号取表达式1的值,为假,取表达式2的值 |
位运算符 | ~(单目),&, I,^ ,^ ~ , ~ ^ | 按位取反,按位与,按位或,按位异或,按位同或 |
移位运算符 | >>, << | 右移,左移(后空位补0) |
位拼接运算符 | {信号1的某几位,…,信号n的某几位} | 用于将两个或多个信号的某些位拼接起来 |
- 在逻辑运算中,如果操作数不止一位,应将操作数作为一个整体来对待
- 两个不同长度的操作数进行位运算时,将自动按右端对齐,位数少的操作数会在高位用0补齐。
- 关系运算符优先级低于算术运算符,返回结果为逻辑值,0或1或x
- 等于运算符(= =)和全等运算符(===)的区别: 使用等于运算符时,两个操作数必须逐位相等,结果才为1,若某些位为x或z,则结果为x;使用全等运算符时,若两个操作数的相应位形式上完全一致,则结果为1,否则为0.
操作数个数 |
---|
单目运算符 |
双目运算符 |
三目运算符 |
连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 型变量进行赋值。其格式如下:
assign <net_expression> = <expressiom of different signals or constant value>
➢ 等式左边必须是一个标量或者线性向量,而不能是寄存器类型
➢ 等式右边的类型没有要求,等式右边的值一旦发生变化,就会立刻重新计算并同时赋值给左侧
module xyz;
wire i1, i2;
wire out;
assign out=i1 & i2;
endmodule
- 过程赋值是在 initial 或 always 语句块里的赋值,主要用于对寄存器类型变量进行赋值
- 寄存器变量在被赋值后,其值将保持不变,直到重新被赋予新值
- 过程赋值只有在语句执行的时候,才会起作用
- Verilog 过程赋值包括 2 种语句:阻塞赋值与非阻塞赋值
➢ 通常带有触发条件
➢ 语句块中的语句会重复执行
➢ 一个变量不能在多个 always 块中被赋值
➢ 在 always 块中被赋值的只能是 register 型变量
➢ always 语句块即可以用来实现组合逻辑也可以用来实现时序逻辑
模块声明:
always @(event)
[statement]
always @event begin
[multiple statements]
end
不带有敏感信号的 always 语句块会一直
执行
➢ 可用于仿真时钟信号生成
always #10 clk= ~clk;
always设计组合电路
代码示例:
module combo (input a, b, c, d, e,
output reg z);
always @ ( a or b or c or d or e) begin
z= ((a & b) | (c ^ d) & ~e);
end
endmodule
always设计时序逻辑电路
➢ 模N计算器,计数器从0开始,每个时钟周期上升沿自加1,计算器加到N-1之后重新从0开始计数。
➢ 模N计数器需要 log2声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/784424
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。