初学Verilog笔记
初学verilog笔记
逻辑值
- 0:逻辑低电平
- 1:逻辑高电平
- z:高阻态,无驱动
- x:未知逻辑电平
关键字
1 | module example( //模块名 模块名 |
变量类型
- wire:线网型变量,相当于一条直接的连线
- reg:具有对一时间点状态具有状态保存的功能,会被映射成一个真实的物理寄存器
1 | wire [0:0] flag, //线网类型 连线 直接连接,电路中视为导线 |
参数
1 | parameter CNT_MAX = 100; //常量 宽度 在顶层文件中通过实例化可进行修改 |
- 模块实例化
1 | example |
常量
基数表示法
格式:[换算为二进制后位宽的总长度][‘][数值进制符号][与进制符号对应的数值]
8’d171 8位十进制数171
进制符号
b 二进制 d 十进制 h 十六进制 o 八进制
总长度可有可无,verilog会根据数值自动计算位宽
当总位宽小于数值实际位宽时,截断左侧多余位
当总位宽大于数值实际位宽时,左侧补0
‘d7和8’d7 表示相同数值 换算为二进制均为 00000111,前面五位补0
2’d7表示二进制数11,前面两位截断 直接写参数,例如100,表示位宽为32的十进制数100
赋值方式
- 阻塞赋值 = 适用于组合逻辑 按顺序执行
1 | a=1;b=2;c=2; |
- 非阻塞赋值 <= 适用于时序逻辑 并行执行
1 | a=1;b=2;c=3; |
- always语句
always @(*) 组合逻辑 当敏感信号变化时,立即执行
1 | always(posedge sys_clk or negedge sys_rst_n) |
- assign语句 组合逻辑 连续赋值
位拼接运算符 {} 将多个信号拼接成一个信号
位选择运算符 [] 选择信号的某几位
1 | module top_module( |
测试文件
- 测试文件其功能主要为了验证设计文件逻辑的正确性
- 将设计文件模块名称和端口信息例化(调用)到测试文件中
1 | //1ns表示单位,1ps表示精度 |
- 如何给输入信号激励,需要用 initial 语句进行赋值,语法规定,在initial语句中,被赋值变量的数据类型为 reg 类型
1 | initial begin |
算术运算符
- +:加法
- -:减法
- *:乘法
- /:除法 乘除一般不使用
- %:求模(取余) 一般用在测试文件中
归约运算符、按位运算符
&:
一元运算符作用:表示归约与,&m是将m中所有比特相与,最后结果为1bit
eg: &4’b1111 = 1&1&1&1 = 1’b1
&4’b1101 = 1&1&0&1 =1’b0
二元运算符:表示按位与
&,|,^,^,~|等同理
逻辑运算符
- &&:逻辑与
- || :逻辑或
关系运算符
- <,>,<=,>=
- 一般在条件判断上用到
移位运算符
- 是二元运算符
- 左移符号是**<<,右移符号是**>>,将运算符左边的操作数左移或者右移指定的位数,用0来填补空闲位
1 | b <= a<<1; //即让a的每一位都往左移动一位,结果赋值给b |
- 一个二进制数不管原数值是多少,只要一直移位,最后都会变成0
- 移位运算在使用的时候可以代替乘法和除法,左移一位可以看成是乘以2,右移一位可以看成是除以2,但是要注意宽的拓展
位拼接运算符
- 由一对花括号和逗号组成 {,,,},拼接不同的数据之间,用“,”隔开
- eg:将8bit的a,3bit的b,5bit的c 按顺序拼接成一个16位的d 表示为:d={a,b,c}
条件运算符
- 即三目运算符
优先级:归约运算符>算术运算符>移位运算符>关系运算符>按位运算符>条件运算符
()可以增加优先级
if-else分支语句
1 | if(<条件表达式1>) |
case分支语句
- 多路控制更加直观
- 通常用于对微指令译码器、有限状态机的描述
- 有case、casex,casez三种形式
1 | case(<控制表达式>) |
- 控制表达式代表着对程序流向进行控制的控制信号,各个分支表达式则是控制表达式的某些具体状态取值
- 各个分支语句取值必须互不相同,否则会出现矛盾现象
系统函数
- Verilog语言中预先定义了一些任务和函数,用于完成一些特殊的功能,这些函数大多只能在testbench仿真中使用
1 | //时间尺度预编译指令 时间单位/时间精度 |
- 时间单位和时间精度由值1、10和100以及单位s、ms、us、ns、ps、fs组成
- 时间单位:定义仿真所有与时间相关量的单位
- 仿真中使用**“#数字”**表示延时相应时间单位的时间
- 时间精度:决定事件相关量的精度以及仿真显示的最小刻度
1 |
|
简单组合逻辑-译码器
译码器定义
代码实现
1 | module decoder( |
仿真文件
1 | //时间 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 秃头的君寻酱!







