FPGA-00-语法
《Verilog数字系统设计教程》-夏宇闻-第一部分
硬件描述语言HDL:以文本形式描述数字系统硬件的结构和行为。-->利用EDA工具进行仿真验证-->利用自动综合工具将具体物理电路的模块组合转换到门级电路网表-->利用ASIC或FPGA自动布局布线工具把网表转换为具体电路布线结构
Verilog(1)让模块最终能生成电路的结构(2)测试逻辑功能
包括端口定义、I/O说明、内部信号声明、功能定义
(1)端口定义、I/O说明可以写在一起
(2)功能定义的三种方法:
①持续赋值语句:assign,多用于描述组合逻辑
②过程块:always,用于描述组合逻辑+时序逻辑
③实例引用
(1)常量
包括数字型(4'b0001)和参数型(parameter)
(2)变量
包括wire型、reg型和memory型
wire型:不能存储,需要assign驱动
reg型:always块里被赋值的信号必须定义成reg型
memory型:扩展reg型地址范围,例reg[n-1,0] mem[m-1,0]表示m个n位寄存器
(1)算术运算符:+ - x / %
(2)赋值:= <=
(3)关系:< > <= >=,等式== !=(不比较z和x) === !==(比较z和x)
(4)逻辑:&& || !
(5)条件:?:
(6)位:~ & | ^ ^~
(7)移位:<< >>
(8)位拼接:{}
(9)缩减:& | ~(单目)
阻塞与非阻塞的用法:
always块中,描述组合逻辑-->阻塞赋值=,只与电平变化有关
描述时序逻辑-->非阻塞赋值<=,往往与触发沿有关
(1)顺序块:begin-end
(2)并行块:fork-join,描述测试信号常用、
条件语句必须在过程块里,例如always的begin-end里
case全比较,casez不比较z,casex不比较x和z
记得写endcase,记得加default
(1)forever语句:连续执行,用于initial块中生成波形
(2)repeat(常量表达式))语句:执行n次
(3)while(表达式)语句:判断真,可以和>>一起计算1的个数
(4)for(表达式1;表达式2;表达式3)语句
generate-endgenerate
(1)initial语句:只执行一次,
用法:①生成激励波形作为测试仿真信号 ②设置信号记录
(2)always语句:重复但是否执行看触发条件
用法:①产生时钟,作为激励信号测试
always #half_period areg=~areg;
②时间控制
边沿触发:描述时序行为,如状态机
电平触发:描述组合逻辑
always @(posedge clock or posedge reset) //边沿触发
begin end
always @(a or b or c) //电平触发
begin end
always @(*) //全部输入变量
begin end
always
wait(enable) begin end
待补充
(1)输出
%h十六进制,%d十进制,%o八进制,%b二进制,%s字符串,%t时间
(2)监控输出
(3)时间
units_number 表示打印的时间值的单位:0 表示秒,-3 表示毫秒,-6 表示微秒,-9 表示纳秒, -12 表示皮秒, -15 表示飞秒;中间值也可以使用:例如-10表示以100ps为单位。其默认值为`timescalse所设置的仿真时间单位。
precision_number 是在打印时间值时,小数点后保留的位数。其默认值为0。
suffix_string 是在时间值后面打印的一个后缀字符串。其默认值为空字符串。
MinFieldWidth 是时间值字符串与后缀字符串合起来的这部分字符串的最小长度,若这部分字符串不足这个长度,则在这部分字符串之前补空格。其默认值为20。
(4)暂停与结束
(5)从文件读取数据到存储器
(6)产生随机数
(1)宏定义
(2)文件包含
(3)时间尺度
(4)条件编译