一、Verilog 概述
1.1 Verilog 简介
Verilog:硬件描述语言 描述数字系统硬件的结构和行为的语言 可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能
1.2 为什么需要Verilog
简单直观:原理图设计方式、编写描述语言(代码)等方式 复杂逻辑:Verilog 语言
1.3 Verilog 和 VHDL 区别
共同特点:
- 能形式化地抽象表示电路的行为和结构;
- 支持逻辑设计中层次与范围的描述;
- 可借用高级语言的精巧结构来简化电路行为和结构;
- 支持电路描述由高层到低层的综合转换;
- 硬件描述和实现工艺无关。 区别: Verilog:资源成熟、接近C、上手易 VHDL:不直观,设计较难 Verilog 和 VHDL 的比率是 80%和 20%
1.4 Verilog 和 C 的区别
Verilog 是硬件描述语言:会生成电路,并行处理与运行。 C 语言是软件语言:是软件指令,需要取址、译码、执行, 是串行执行的。
二、Verilog 基础知识
2.1 Verilog 的逻辑值
逻辑电路中有四种状态: 逻辑 0:表示低电平,也就是对应我们电路的 GND; 逻辑 1:表示高电平,也就是对应我们电路的 VCC; 逻辑 X:表示未知,有可能是高电平,也有可能是低电平; 逻辑 Z:表示高阻态,外部没有激励信号是一个悬空状态。 
2.2 Verilog 的标识符
- ==标识符是区分大小写的==
- ==不建议大小写混合使用==
- ==普通内部信号建议全部小写==
- ==参数定义建议大写==
- ==信号命名体现信号的含义== 第一个字符必须是字母或者下划线,可以是任意一组字母、数字、
推荐写法: count fifo_wr 规范建议:
- 用有意义的名字,如 sum、 cpu_addr 。
- 下划线区分词语组合,如 cpu_addr。
- 采用前后缀,如:时钟clk前缀:clk_50m,clk_cpu;低电平采用_n后缀:enable_n;
- 统一缩写,如全局复位信号rst。
- 同一信号在不同层次保持一致性。
- 自定义的标识符不能与保留字(关键词)同名。
- 参数统一采用大写,如定义参数使用 SIZE。
2.3 Verilog 的数字进制格式
- 二进制: 4’b0101 表示 4 位二进制数字 0101;
- 十进制: 4’d2 表示 4 位十进制数字 2(二进制 0010);
- 十六进制: 4’ha 表示 4 位十六进制数字 a(二进制 1010)。
代码中没有指定数字的位宽与进制时,默认为 32 位的十进制 如 100,实际上表示的值为32’d100
2.4 Verilog 的数据类型
三大类数据类型:
- 寄存器类型
- 线网类型
- 参数类型
1. 寄存器类型
表示一个==抽象的数据存储单元== ==只能在 always 语句和 initial 语句中被赋值,并且值从一个赋值到另一个赋值过程中被保存下来。== 过程语句描述的是时序逻辑, 即 always 语句带有时钟信号,则该寄存器变量对应为寄存器; 过程语句描述的是组合逻辑, 即 always 语句不带有时钟信号,则该寄存器变量对应为硬件连线; 寄存器类型的缺省值是 x(未知状态)
寄存器数据类型:reg、 integer、 real
//reg define
reg [31:0] delay_cnt;
reg key_flag ;2. 线网类型
线网表示 Verilog 结构化元件间的==物理连线==。 值由驱动元件的值决定,例如连续赋值或门的输出。 没有驱动元件连接到线网,线网的缺省值为 z(高阻态)。
线网类型:tri 、 wire
//wire define
wire data_en;
wire [7:0] data ;3. 参数类型
常量,常被用于定义
- 状态机的状态
- 数据位宽
- 延迟大小 参数的定义是==局部的==,只在当前模块中有效
//parameter define
parameter DATA_WIDTH = 8; //数据位宽为8位2.5 Verilog 的运算符
1. 算术运算符
==乘除比较浪费组合逻辑资源,尤其是除法。一般不用== 可用移位运算来完成运算 
2. 关系运算符
声明的关系是假,则返回值是 0, 声明的关系是真,则返回值是 1 
3. 逻辑运算符

4. 条件运算符
==位运算符一般用在信号赋值上== 
5. 位运算符
==逻辑运算符一般用在条件判断上== 
6. 移位运算符
==用 0 来填补移出的空位== 
7. 拼接运算符

8. 运算符的优先级
