FPGA——Verilog基础语法
一、Verilog模块结构
- 一般端口列表与端口信号说明写到一起,即模块名(端口信号说明);
1.1 模块名
- 模块名是指电路的名字,由用户指定,需要与文件名一致(特别是在
Quartus II软件中调试时);
1.2 端口信号
- 端口信号声明是要说明端口信号的输入输出属性、信号的数据类型,以及信号的位宽;输入输出属性有input,output,inout三种,信号的数据类型常用的有wire和reg两种;信号的位宽用[n1:n2]表示;同一类信号之间用逗号隔开;
- 例:
module full_adder (
input cin,
input [3:0] a,
input [3:0] b,
output cout,
output reg [3:0] s
);
- 位宽如果不做说明的话,默认是1位;
数据类型不做说明的话,默认是wire型的。
二、assign语句
assign语句称作连续赋值语句
基本格式:
assign 赋值目标 = 表达式;
- 之所以称为连续赋值语句是指其总是处于激活状态,只要表达式中的操作数有变化,立即进行计算和赋值。(与连续赋值语句对应的另一种语句称为过程赋值语句)
- 赋值目标必须是wire型的,wire表示电路间的连线
- 一般在组合逻辑中使用
三、运算符
(这里只给出一些不常见的)
- 算术运算符
** 求幂
- 等价运算符
== 等于
!= 不等于
=== case等于
!== case不等于
- 例:
Y=(1’b1 ==1’bx); 结果为x
Y=(1’bx ==1’bx); 结果为x
Y=(1’b1 ===1’bx); 结果为0
Y=(1’bx ===1’bx); 结果为1 - case等和case不等的结果只能是1或0,对于x、z认为是确定的值,参
加比较;
- 移位运算符
>> 右移
>>> 算数右移
- 例:
Y= 4’b1001 >> 1; 结果为0100
Y= 4’sb1001 >>> 1; 结果为1100
- 拼接运复制算符
{} 拼接
{{}} 复制拼接
- 例:
Y= {4’b1001, 2’b11}; 结果为100111
Y= {4{2’b01}}; 结果为01010101
Y= {{4{2’b01}}, 2’b11};
四、always语句块
always语句块又称过程块,过程块中的赋值语句称为过程赋值语句
基本格式:
always @(敏感信号条件表)
各类顺序语句;
- 该语句块不是总处于激活状态,当满足激活条件时才能被执行,否则被挂起,挂起时即使操作数有变化,也不执行赋值,赋值目标值保持不变
- 赋值目标必须是reg型的
- 一般在时序逻辑中使用
激活条件:敏感信号条件表决定,当敏感条件满足时,过程块被激活
敏感条件:一种是边沿敏感(posedge上升沿/negedge下降沿),适用于时序逻辑;一种是电平敏感,适用于组合逻辑
关于阻塞赋值与非阻塞赋值
设计组合电路时常用阻塞赋值
设计时序电路时常用非阻塞赋值
五、底层模块的调用
底层模块是要在顶层模块中调用的
底层模块调用格式:
底层模块名 例化名 (端口映射);
- 端口调用有两种方法
- 顺序法
DFF dff1(
clk,
d1,
q1
);
- 命名法
DFF dff1(
.CLK (clk),
.D (d1),
.Q (q1)
);