萌新小白,为做FPGA大创,开始学习Verilog HDL
空白符:\b、\t等,在编译阶段被忽略
注释符:
//单行注释 /*多行 注释*/
操作符:
单目操作符:a=~b; 双目操作符:a=b&&c; 三目操作符:a=b?c:d;
数字声明:
指明位数 <size>'<base format><number>:4'b1111 12'habc 16'd255
未指明位数:位宽于使用的计算机有关:23456(默认十进制) 'hcc 'o21
X和Z值: 12'h13x 6'hx 32'bz (16进制的时候XZ代表4位,8进制的时候代表3位,二进制时代表1位,如果最高位为1,则使用0扩展最高位,如果最高位为0,则用X或Z进行扩展)
负数:在数字声明前加‘-’:-6'd3 -6'sd3
下划线和问号:下划线只为提高可读性,?可以替代Z
字符串
"Hello Verilog World"
标识符和关键字
关键字全部小写,标识符以字母或者_开头
转义表示符
以\开始,以空格结束
数据类型
值的种类
值的类别:0、1、X、Z
当出现冲突时,按照强度等级判断最后的逻辑输出结果
强度等级
类型
supply
驱动
strong
驱动
pull
驱动
large
存储
weak
驱动
medium
存储
small
存储
highz
高阻
寄存器
寄存器的声明和使用
reg reset;
initial
begin
reset=1'b1;
#100 reset=1'b0;
end带符号寄存器
reg signed [63:0] m;
integer i;向量
声明向量时,括号左边不管什么数字,都为高位。wire [7:0] bus; reg [0:40] virtual_add;
向量域选择:bus[2:0]. virtual_add[0:1]
可变向量域选择:[<starting_bit>+/-:width] byte=data[31-:8];
整数、实数、时间寄存器
integer、real、time
数组
不同于向量,向量表示某个东西的结合而不是一个东西有几个方向,向量是一个单独的元件而数组是n个元件
wire [7:0] w_array2 [5:0]
赋值:array_4d[0][0][0][0][0:15]=0;
存储器
reg mem1bit[]0:1023];
reg [0:7] membyte [0:1023];参数
parameter port_id=5; parameter signed [15:0] WIDTH;
字符串
存储长度要大于实际长度,要不然会把左边的位截取
reg [8*18:1] string_value; initial string_value = "hello Verilog World";
$\( display:用来显示目前的一些变量的值; \)$dispay(p1,p2,p3,pn);
$\( monitor:动态监视; \)$monitor(p1,p2,p3,pn);
$stop:暂停仿真
$finish:结束仿真
`define:类似c里的#define,可以用来替换
`include:类似c里的#include,将一个源文件包含到另外一个文件中
书目参考:Verilog HDL数字设计与综合(第二版)[美] Samir Palnitkar