Verilog模块结构

参考代码

module full_adder (A,B,CIN,S,COUT); 
input [3:0] A,B;
input CIN;
output reg [3:0] S;
output COUT;

位宽默认为1位,数据类型默认为wire型

内部信号声明格式:数据类型 位宽 信号名称 元素个数

wire和reg

  1. wire类似于线,需要驱动,assign语句的合法左值

  2. reg类似于寄存器,并且能够存储状态.always语句的合法左值

net和varible

  1. 如果是连续赋值或门原语赋值或例化语句赋值,则定义成net型;如果是过程赋值,则定义成varible型
  2. 对于端口信号来说,input信号和inout信号必须定义成net

$wire\rightarrow net,reg\rightarrow varible$

assign语句

assign语句被称为连续赋值语句

用法

assign 赋值目标 = 表达式

运算符

  1. 算术运算符(+,-,×,/,%)
  2. 赋值运算符(=,<=)
  3. 关系运算符(>,<,>=,<=)
  4. 逻辑运算符(&&,||,!)
  5. 条件运算符(?:)
  6. 位运算符(~,|,^,&,^~)
  7. 移位运算符(<<,>>)
  8. 拼接运算符({ })

异或运算符"^"也称XOR运算符。它的规则是若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)。即 0∧0=0,0∧1=1, 1^0=1,1∧1=0。比如:01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算。

always语句

always语句被称为过程块

用法

alwyas @(敏感信号条件表),敏感条件有两种,一种是边沿敏感,一种是电平敏感

阻塞与非阻塞赋值

  1. 阻塞赋值(=):在赋值时,先计算等号右手部分的值,再赋值给左边变量,直到该语句赋值完成,后面的语句才能执行,会阻塞后面的语句。(顺序执行)
  2. 非阻塞赋值(<=):执行赋值语句右边,然后将begin-end之间的所有赋值语句同时赋值到赋值语句的左边,但是左边的变量的值不会立即更新,直到always块所有语句执行完,才将左边变量的值更新。

底层模块调用

参考代码

module DFF(CLK,D,Q) 
output reg Q;
input CLK,D;
always @ (posedge CLK)
Q<=D;
endmodule
module examp (clk,d,a,q) 
output q; input clk,d,a;
wire d1; wire q1;
DFF dff1(.CLK(clk),.D(d1),.Q(q1));
DFF dff2(q1,d,q);
or (d1,a,q);
endmodule

命名方法

  1. 端口名关联法(命名法)
  2. 位置关联法(顺序法)

门原语

门原语调用格式:门原语名 实例名

参考代码

and(out, in1, in2);
and(与) or(或) xor(异或)
nand(与非) nor(或非) xnor(同或)

数字表达格式

格式:位宽基数 常量

基数:二进制(b/B)、十进制(d/D)、八进制(o/O)、十六进制(h/H)