前言:在fpga我只是一个新手,我会将一些学习心得不定期放到这个博文里。这里占个坑。
一、学习感悟
5、2024.5.24
- 关于数据跟控制信号线跨时钟域时
- 对于数据是使用FIFO,对于控制信号线是使用打两拍来解决跨时钟域同步问题
- 关于时序违例
- 如果是例化的线长太长可以通过打一拍解决,也就是a-c ---> a-b-c
- 时序违例应该看自己的代码设计,不应该首先改自己的时序约束。高扇出网络就看看能不能降低扇出或者走全局信号线,信号经过的器件太多就想办法修改自己的实现或者换更好的fpga ic,如果是跨时钟域问题就用上面写的跨时钟域解决方法
- 关于除法器与乘法器、加法器
- 加法器与乘法器应该尽量设计成流水线的方式
- 除法器是一个时钟周期无法完成计算的,这个时候可以增加使能信号线用于使能其他模块获知除法结果
- 对于使用时序逻辑例化的乘法器跟加法器因为也无法一个时钟计算出结果也可以使用除法器的使能信号线获知结果输出时间
4、2022.12.21
- 扇入、扇出(助记:像扇子一样)
- 扇入:一个模块或者函数或方法被调用,也可以理解为(信号或执行)进入的次数
- 扇出:一个模块或者函数或者方法去调用别的模块、函数、方法。
- 为什么高扇出的信号要使用全局网络
- 例如fpga有全局时钟网络、全局复位网络。一个是因为高扇出的信号驱动能力要求高,普通网络达不到驱动要求。一个是普通网络的延时高,面对高速时钟等信号达不到设计要求。
3、2022.12.19
- 异步信号
- 会在时钟的周期内任意时间变化的信号就是异步信号。
- 触发器的输入、复位信号等都是异步信号。
- 同步信号
- 仅仅在时钟上升下降沿期间而发生变化的信号
- 亚稳态
- 触发器有输入建立时间和保持时间,当输入在这其中发生变化,输出就会进入亚稳态。
- 亚稳态之后经过不定长度的决断时间进入稳定,但稳定后的输出与输入无关。
- 异步电路亚稳态不可避免。
- 解决办法是:通常给电路打两拍,打一拍后触发器仍旧进入亚稳态概率仍旧很高。通常打一拍的稳定概率认为在90%,认为打两拍后稳定概率在99%。
- 进入亚稳态概率公式:概率 = (建立时间Tsu + 保持时间Th)/ 采集时钟周期。通常Tsu+Th假设为1ns。
- 打拍电路
module dff( input clk, input d, output q ) reg q1, q2; always @(posedge clk)begin {q, q2, q1} <= {q2, q1, d}; //两拍 //{q, q1} <= {q1, d}; //一拍 end endmodule
2、2022.12.12
- 顶层模块
- 顶层模块包含着所有底层模块的输入输出
- testbeach文件可以用quartus ii生成模板
- 引脚约束基于顶层模块
- 不可综合
- 不可综合的代码设置为顶层模块会导致过不了综合,比如testbeach文件
- quartus跟modelsim联合仿真不用每次都关闭软件然后重开,只要写完代码保存再modelsim中重编译然后restart就行
1、2022.12.09
- 综合与不可综合
- 综合:把代码用库中元器件转换成实际电路,事实上只要能转成实际器件得语句就是可综合语句
- 不可综合:无法将语句转化为实际电路的语句就是不可综合
- 不可综合与可综合语句区别在:能否转换成实际电路。比如#100就是不可综合的,因为无法在库中找到一个元件对应#100这个语句。综合器综合时会直接忽略该语句。
- 原码、反码、补码
- 原码:正数最高位为0,负数为1
- 反码:正数反码等于原码,负数反码等于原码最高位不变其余位取反
- 补码:正数补码等于原码,负数补码等于反码加一
- verilog中各语句的综合后的资源占用
- if语句:
- 嵌套每多一层,资源使用更多,更浪费
- 综合成一个2选1选择器
- case语句:
- 相比if资源利用少一点
- 综合成一个n选1选择器
- for循环
- 基本只在testbeach文件用,或者结合generate优化代码书写
- 综合结果就是把for循环里面的电路循环复制n遍,资源极度浪费
- assign语句
- 声明一个连接
- 在综合前确定,因此向量的连接需要常量索引
- 左值必须wire
- generate语句
- 一种文本控制语句,在综合前起作用
- generate-case、generate-if、generate-for