FPGA硬件基础
- 用HDL描述的抽象硬件电路模型,Verilog称为Module
- FPGA是由许多单元(cells)组成
- EDA首先将源HDL模型转变为基本的门级网表,称为编译
- EDA随后为基本门模型分配具体的cell,称为映射
- 为了检验抽象电路代码是否正确,需要对其进行测试,称为验证,验证需要单独编写一段HDL代码,建立测试用模型,模型称为Testbenth
- 软件运行抽象模型的方法称为仿真
- 综合前验证加载测试用户RTL模型,验证的内容主要是测试模型的逻辑功能,综合前验证又称为功能仿真或RTL仿真,或者前仿
- 综合后验证测试装配后的由基本门描述的模型,即网表,验证内容主要是设计模型的时序性能,所以又称为时序仿真或或门级仿真,后仿
设计流程
D触发器
复位信号 rst_n 低电平有效
复位信号rst_n 有效时**(rst_n=0),q=0**
复位信号rst_n无效时**(rst_n=1)**,在时钟 clk 上升沿之后,d 的值赋值给 q
一个always 对应一个 D触发器,所以一个信号不可能在多个always 设计,否则硬件会有冲突
FPGA架构
Verilog语法
Verilog
逻辑参数
数的进制
标识符
数据类型
寄存器类型
线网类型
参数类型
**要求在paraeter中 的参数必须 全部大写 **
算术运算符
关系运算符
逻辑运算符
条件运算符
按位运算符
当位数不相同时,会采用位数扩展,将少位的数进行高位补0。
移位运算符
移位运算符一般用于乘除运算,尽量不使用 / 和 %
拼接运算符
运算符优先级
程序框架
注释
常用关键字
模块
模块调用
time_count是子模块,被调用
结构语句
always
posedge 上升沿,negedge 下降沿
赋值语句
阻塞赋值:在一个语句块中,如果有多条阻塞赋值语句,则在前面的赋值未完成前,后面的语句不能执行。“阻塞”
非阻塞赋值:块中多条语句并行同时执行
非阻塞赋值只能给寄存器类型的变量进行赋值,一次只能用在 initial和always 块中
例: 最终结果对比
阻塞赋值: a=0, b=0, c=0
非阻塞赋值:a=0, b=1, c=2
assign(连续赋值)语句中必须使用阻塞赋值,给wire型变量赋值
reg 型变量必须用非阻塞赋值
条件语句
时序机设计(状态机)
举例,以密码锁解锁为例
Moore状态机:下一状态取决于当前状态和当前输入,输出仅取决于当前状态
Mealy状态机:下一状态和输出都取决于当前状态和输入
1.状态空间定义
四个状态:SLEEP, STUDY, EAT, AMUSE (二进制编码)
current_state 当前状态 next_state 下一状态
**独热码:**只有一个位置位,译码逻辑简单
语法实例应用
程序设计准则
1. 一个 always 只产生一个信号
2. 条件判断只允许使用 if else 和case ,其它的全都不用(包括casex)
3. 含有posedge 和negedge 的,一定是D触发器,是时序电路
4. 设计时,如果你想立即有结果,就使用组合逻辑,如果想要延时一拍,就使用时序逻辑
1. 组合逻辑写法 always@(*),组合逻辑一定要写 else,避免生成锁存器(即 条件语句没有说明全部的条件)
2. 时序逻辑的敏感信号必须是(posedge clk or negedge rst_n)
对程序调试等有优势,更加方便处理。
信号类型 reg和 wire
用 assign 、例化模块输出的信号用 wire
位选
assign 语句
。
模块例化
例化含义
连线:
clk 连接 clk_100m
rst_n 连接 sys_rst_n
·
例化方法
参数例化(参数传递)
模块设计模板
举例
else if (en) begin
dout <=1; //dout上升时
end
else if (end_cnt) begin
dout<=0; //dout下降时
end
== 当 if 中条件 en 变为高电平后,下一句 dout<=1; 是在 en延后一拍变化的 ==
。
。
。
测试文件
编写技巧
一、认识测试文件
二、测试文件编写流程
1秒 =109 纳秒
1秒 =1012 皮秒
测试文件模板