Verilog 入门指南因本人近期公司似乎要使用FPGA做一些项目因此本人从0开始学习FPGA,如果您观看此内容默认为您至少了解并使用过c/cpp语言,并了解一些c/cpp底层原理或了解一定计算机编程语言.1. 基础语法1.1 数据格式wire网络连线格式表示元器件之间的连接线reg寄存器1.2 Verilog 格式说明Verilog 与 C/C 类似区分大小写。关键字和变量名必须正确匹配否则底层无法正确识别代码块。2. 数字表示2.1 不同进制表示二进制b/B或BIN十进制d/D或DEC十六进制h/H或HEX八进制o/O或OTC在 Verilog 中数字变量声明格式为n进制值其中n表示位数8b000000008 位二进制变量值为 8 个 08hAB8 位十六进制变量值为 0xAB2.2 特殊状态表示Verilog 支持两种特殊状态x未知态可能是高电平也可能是低电平z高阻态物理上无实际连接表示方法8b1111z000 // 第4位为高阻态 8b11111?11 // 低3位为高阻态 8b1111x111 // 第4位为未知态 1bx // 1位二进制变量值为未知态2.3 下划线使用为提高可读性可在数字间使用下划线分隔8b1111_1111 // 合法 8b_1111_1111 // 非法不能在进制标识符后直接加下划线 8b1_1_1_1_1_1_1_1 // 合法但不推荐3. 数据类型3.1 wire 类型表示硬件单元间的物理连接用于模块的输入输出连接。wire 变量必须有驱动源否则默认为高阻态“Z”。特殊类型wand线与wor线或示例wire a 8b11111111; wire b;3.2 reg 类型用于表示存储单元可保持数据原值reg reg_a; reg reg_b;3.3 parameter用于声明常量类似 C 中的const编译时确定且运行时不可修改parameter data 8b01001111; parameter a 1, b 2; parameter size data * 2;局部参数使用localparam区别仅在于作用域。3.4 数组reg[7:0] reg_array[0:3]; // 4个8位寄存器 wire wire_array[0:7]; // 8个线网 integer integer_array[0:3]; // 4个整数 time time_array[0:1]; // 2个时间值 real real_array[0:2]; // 3个实数 reg [7:0] reg_2d_array[0:1][0:3]; // 2x4的8位寄存器数组注意int只能表示二态1/0integer可表示四态1/0/z/x3.5 字符串Verilog 中可通过位操作处理字符每个字符用8位表示reg[39:0] hello hello; // 40位存储5个字符支持转义字符如\r、\t等每个转义字符占1字节。verilog入门1.基础语法1.数据格式wire 网络连线格式 (线网表示元器件之间的相连线)reg 寄存器2.verilog格式1.verilog区分大小写本质来讲 verilog 和 c/cpp几乎相同 因此在verilog中:关键字和变量名是需要区分大小写.如使用错误的变量名或错误的关键字去做一些代码工作 底层是无法正确匹配到正确的代码块的2.数字1.不同进制在verilog中的体现二进制b/BBIN十进制d/DDEC十六进制h/HHEX八进制o/OOTC在 verilog中在 声明一个数字变量之前 根据 n’b n’d n’h n’o 这个n去判断这个变量 的长度如:8b00000000则表示 为 8位 的 二进制 变量 变量内容为 8 个 0 字节8hAB则表示 为 8位 的十六进制变量 内容位 0xA 和 0xB而在varilog的数字变量声明中有特殊的两种方式 如 x(未知态) 和 z(高阻态)z在数电模电中我们明确的知道 Z为高阻态 即表示为在 物理状态下没有实际性的连接 为不高不低的状态在verilog中有两种声明z(高阻态的方式)z/?8b1111z000 代表为 二进制中 第四位为 高阻态811111?11 代表为 二进制中 低三位 为高阻态8b1111?111 // 第四位为高阻态 8b11111z11 // 低三位为高阻态x是一个新的概念即表示为 在一段线或引脚状态的电平信号为未知可能是高也可能是低在verilog中声明x(未知态) 的方法如下8b1111x111 代表为 二进制中 第四位为未知态1bx // 一个长度为1的二进制变量中存储着一个未知态2.下划线在verilog中我们可以使用_去让一些变量变得更可读8b1111_1111是可行的 代表了 高位 为 1111 低位 也为 1111而8b_1111_1111是不可行的 只能在每一位数字之间加_而不能在 b ---- 1 之间添加下划线甚至在极端情况下8b1_1_1_1_1_1_1_1都是可行的 但是不推荐如此使用8b1111111 8b1111_1111 8hAB3.数据类型1.wire 类型表示硬件单元之间的物理连接 用于连接模块的输出和输入在 verilog_fpga中有多种wire表示方式 wand worwire变量代表了基础的线连接类型 必须有一个连续的驱动源如另一个模块的输出或组合逻辑来驱动。如果没有任何驱动连接到 wire 变量其缺省值为高阻态“Z”表示该线没有被驱动。wand 即代表为 w(线) and(与) 与普通MCU开发中的IIC线程使用线与一样wor 即代表了 w(线) or(或) 会对线做或操作wire a 8b11111111; wire b;2.regreg 类型用于表示存储单元能够保持数据的原值。reg rag_a; reg reg_b;3.parameterparameter是一种用于常量声明的类型 类似于 c语言中的const关键字paramater在编译时值就已经确定运行时无法再次改变局部参数声明方式用localparam本质上区分方法只是作用域的区分parameter data 8b01001111; // 声明常量data为长度为8的 二进制 parameter a 1, b 2; // 声明常量 a 为 1, b 为 2 parameter size data * 2; // 声明size 为 data x 24.数组arrayreg[7:0] reg_array[0:3]; // 代表声明了一个 存储4个8位寄存器变量 wire wire_array[0:7]; // 声明了可以存储8个线网的数组 integer integer_array[0:3]; // 声明了一个整数数组 长度为4 time time_array[0:1]; // 声明了一个可以存储两个时间的数组 real real_array[0:2]; // 声明了一个可以存储两个实数 reg [7:0] reg_2d_array[0:1][0:3]; // 声明一个 8位长 的2x4寄存器数组注: 在verilog中intinteger是有区别的int只能声明 两种态 如10即在电平信号中代表高低电平integer可以声明 四种态10z(高阻态)x(未知态)5.字符串在c/cpp体系中char是可以存储字符的charaa;int8_tbb;而在verilog中我们可以对每一位的字符进行操作那么整个逻辑会变得更舒适因此我们可以使用数组去存储8的倍数的二进制 一个8字节二进制即代表一个char(int8_t) 一个字符n个8代表n个字符 即n * 8 n个字符串reg[39:0] hello hello; // 40长度二进制/8 5个字节 存储hello注:verilog中有类似于c/cpp换行符但是也会占一位字节\r\t等等