一.模块
module xxx(输入、输出)
输入/输出端口定义......
信号类型声明......
逻辑功能定义......
endmodule
其中逻辑功能定义:
二. 数据类型和运算
1.常量类型
一种为连线型,另一种为寄存器型
①,整数
②,实数
③,参数型
parameter
- 常用于定义状态机状态、数据位宽、延时大小
- 在模块调用时,通过参数传递改变被调用模块中已定义的参数
3.变量类型
①.连线型
线网类型 wire (tri型很少用)
- 不能存储值,由驱动元件决定(门、连续赋值语句、assign)
- 默认为高阻态z
- 可以指定位宽: wire[3:0] cnt;
②,寄存器型
- reg [31:0] delay_cnt; 表示位宽为32
- reg count; 未写位宽,默认为1
- reg寄存器型不能在声明的时候赋值,只能在always和initial中赋值
③,momery型
4.运算符
和c语言类似的不做说明,着重说下特有的
- 左移运算,位宽增加
- 右移运算,位宽不变
位拼接运算符 {}
{a,b[3:0]};
三 ,基本语句
1.赋值语句
注意下 阻塞赋值 和 非阻塞赋值 的区别:
- 阻塞式:“=” 语句结束立即生效
- 非阻塞式:“<=” 整个过程块结束时生效
- 描述组合逻辑时: 常用 阻塞式赋值 =
- 描述时序逻辑时: 用 非阻塞式赋值 <=
- always中不能 “ =” 和 “<=” 同时用; 不同always中不准对同一个变量赋值
这里可以用软件仿真做实验验证
2. 块语句
① 串行块语句 begin-end
② 并行块语句 fork-join
3. 过程语句
always语句
always@(敏感信号表达式)
4. 条件语句
① if-else
if判断,0、x、z都是假
② case
casez 不考虑 高阻态z
casex 不考虑 高阻态z 和 不定值x
5. 循环语句
① forever
② repeat
③while
④ for
和C语言类似
6.编译向导语句
①宏替换 'define
②文件包含 `include
可以包含模块
③条件编译 'ifdef 'else 'endif
程序可以进行条件编译
④时间尺度 'timescale
例如:
7.任务task和函数function说明语句
①任务说明语句
②函数说明
函数定义
7. 系统任务与系统函数
① $display和$write
② $monitor 和 $strobe
③ $time 和$realtime
8. 结构描述方式
门元件
调用