首页 > 代码库 > verilog 笔记(一)--概览
verilog 笔记(一)--概览
HDL 语言本身是对硬件的描述,这一特性使其拥有了“并发”的概念,如果纯以语言的角度来考虑,这点是很让人兴奋的。
verilog 是以模块为基本的描述单位。虽然基于硬件让他比C有了很大的局限性,但模块配合“并发”也让它拥有了不可小觑的灵活性。
端口类型
input默认为wire类型(貌似不可以声明为reg类型);
output在always或initial中赋值时默认是reg,否则是wire;
inout 一般设为tri类型(表示有多个驱动源,如无驱动则为三态)
数据类型
0. 常量:
parameter 参数名1=表达式,参数名2=表达式,... ,参数名n=表达式;
1.线网类型( wire 和 tri )
wire
线网类型用于对结构化器件的物理连线的建模。(如器件的管脚,内部器件如与门的输出等).
由于线网类型代表的是物理连接线,因此它不存储逻辑值。必须有器件所驱动。通常用assign 进行赋值。
wire类型的信号缺省值为Z。
信号没有定义数据类型时,缺省值为 wire 类型。
tri
主要用于定义三态的线网。
2。寄存器类型
reg 是最常用的寄存器类型,通常用于对存储单元的描述。如D触发器,rom等。
reg类型的变量不一定是存储单元。在always语句进行描述的必须用reg类型的变量。
二。运算符
1. 算术运算符: + ,- , *,/,%
2.关系运算符:
">" , "<" , ">=" , "<=" , "=="(逻辑相等), "!="(逻辑不等)
关系操作符的结果为1或0,如果操作数中有一位为X或Z,结果为X。
如果操作数长度不同,长度较短的操作数向左添0补齐。
注:
“===”和“!==” 对操作数比较时对某些位的不定值x和高阻Z也进行比较,两个操作数必须完全一致,结果才为1,否则为0。
3. 逻辑运算符
&& || !
4. 按位逻辑运算符 ( ~,&,|,^, "^~"(异或非)
5. 条件运算符: expr1?expr2:expr3
6. 位拼接运算符:
{expr1,expr2,...,exprN}
将小表达式合并成大表达式的操作。
eg: wire [7:0]Dbus;
assign Dbus[7:4] = {Dbus[0],Dbus[1],Dbus[2],Dbus[3]}; //低位反序赋给高位
assign Dbus = {Dbus[3:0],Dbus[7:4]}; // 高位和低位交换。
注:不允许连接操作非定长常数。 如 :{Dbus,5}
7. 移位运算符 (<< 和>>)
8. 条件语句:
if 语句。
case 语句:
case 的default 项必须书写,防止产生锁存器。
9. 缩减运算符: &,|,~
eg. reg [3:0] B;
reg C;
C=&B; //相当于 C= B[0]&B[1]&B[2]&B[3];
10. 优先级:
! ,~ 高 优 先 级 别* ,/ ,%+ ,-<< ,>><, <= ,> ,>=== , !=, ===, !==&^, ^~|&&||?:
块语句:
1. 顺序块:块内语句按顺序完成
begin。。。end
2. 并行块:
fork。。。join
三。建模
1。结构建模:调用模块。在结构建模中,描述语句主要是实例化语句,包括对Verilog HDL 内置门如与门(and)异或 门(xor)等的例化。对其他器件的调用,这里的器件包括 FPGA厂家提供的一些宏单元以及设计者已经有的设计。
a.模块实例化(即调用)时 悬空端口和不同长度端口的处理:
悬空端口是输入时,作为高阻Z。悬空端口为输出时,该管脚废弃不用。
当端口和局部端口表达式的长度不同时,端口通过无符号数的右对齐或截断方式进行匹配。
2. 数据流建模
a。连续赋值语句: assign net_type = 表达式 ;
连续赋值语句用于组合逻辑的建模。左边数据类型是wire型。
连续赋值语句之间并行语句,因此与位置顺序无关。
= 用于阻塞的赋值,凡是在组合逻辑(如在assign 语句中)赋值的请用阻塞赋值。
3. 行为建模:
通过对设计的行为的描述实现对设计建模,一般是指用过程赋值语句(initial和always 语句)来设计的成为行为建模。
a. 顺序语句块提供将两条或多条语句组合成语法结构上相当于一条语句的机制。
如,verilog hdl 的顺序语句块(begin。。。end)。语句块中的语句按给定次序顺序执行。
b。过程赋值语句。
verilog 提供两种过程赋值语句initial和always语句。这两种语句之间的执行时并行的。这两种语句通常与语句块(begin。。。end)相结合,则语句块中的执行时按顺序执行的。
initial 语句:
initial 语句只执行一次,即在设计被开始模拟执行时开始(0时刻)。
always语句:
always语句被重复执行,执行机制是通过对一个成为敏感变量表的事件驱动来实现的。always语句可实现组合逻辑或时序逻辑的建模。
always @(posedge Clk or posedge Rst)
整个always语句当敏感变量有变化是被执行,否则不执行。always@(*)里面的敏感变量为*,意思是说敏感变量由综合器根据always里面的输入变量自动添加,不用自己考虑
注:
对组合逻辑的always语句,敏感变量必须写全。
对组合逻辑器件的赋值采用阻塞赋值”=“,时序逻辑器件的赋值语句采用非阻塞赋值”<="
verilog 笔记(一)--概览
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。