1.FIFO深度计算
1.1读写同时进行的FIFO
对于读写同时进行的FIFO,有一个简便计算深度的公式:
FIFO_Depth >= Burst_length -Burst_length* (rd_clk/ wr_clk)*(rd_rate) (其中Burst_length可以认为是连续两个cycle可以写入的数据量)
如:同步fifo,100个cycle可以写入80个数据,10个cycle可以读出8个数据,fifo的深度为:160-160×1×(8/10) = 32
1.2fA > fB 读写之间没有空闲周期或延迟周期相同
例题如下:
写速率fA = 80MHz,读速率fB = 50MHz,突发长度Burst Length = 120,读写之间没有空闲周期,是连续读写一个突发长度。
题解:
写一个数据需要的时间 = 1 / 80MHz = 12.5ns,写一个突发需要的时间 = 120 * 12.5ns = 1500ns,读一个数据需要的时间 = 1 / 50MHz = 20ns,每1500ns,120个数据被写入FIFO,但读一个数据需要20ns的时间。可以计算出,1500ns内读出多少个数据,1500 / 20 = 75。剩下的没有读出,就存在FIFO中,则需要120 - 75 = 45。
所以这种情况下,需要的FIFO最小深度为45。
当然,如果在没有空闲周期或延迟周期相同的情况下,读速率大于等于写速率,那么FIFO的深度为1就行了。
1.3fA > fB读写都有不同的空闲周期(IDLE Cycles)例题如下:
写速率fA = 80MHz,读速率fB = 50MHz,突发长度Burst Length = 120,两个连续写入之间的空闲周期为 = 1,两个连续读取之间的空闲周期为 = 3。
题解:
写一个数据需要的时间 = 2 * (1 / 80MHz) = 25ns,写一个突发需要的时间 = 120 * 25ns = 3000ns,读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns,每3000ns,120个数据被写入FIFO,但读一个数据需要80ns的时间。可以计算出,3000ns内读出多少个数据,3000 / 80 = 37.5。剩下的没有读出,就存在FIFO中,则需要120 - 37.5 = 82.5。
所以这种情况下,需要的FIFO最小深度为83。
另一种情况是读写使能百分比,与这种情况基本相同。比如写使能占空比为50%,可以理解为两个周期写一次数据,读使能同理。
那么,对于在读写都有不同的空闲周期的情况下,读速率大于等于写速率,计算方法也是类似。可以按照这类方法一步一步计算即可。
1.4总结
这些题目要注意突发长度,理解好突发长度后,直接套用计算步骤即可。
2.latch使用的逻辑门数量
5个,分别是四个与非门,一个非门
3.时序帮助
时钟速率主要影响的是建立时间 Setup Timing,保持时间 Hold Timing 主要和路径延迟有关,保持时间希望组合逻辑路径延迟越大越好,较高的工作电压会减少组合逻辑的延迟,所以希望对 Hold Timing 有帮助的是较低的工作电压,组合逻辑路径延迟更大一点
4.缩写简称
STA :Static Timing Analysis ,静态时序分析
DTA :Dynamic Timing Analysis ,动态时序分析
ROM:Read Only Memory,只读存储器
RAM:Random Access Memory,随机存取存储器
SRAM:Static Random-Access Memory,静态随机存取存储器
DRAM:Dynamic Random Access Memory,动态随机存储器
SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器
EEPROM:Electrically Erasable Programmable Read Only Memory,电可擦除可编程只读存储器
DDR:Double Data Synchronous Dynamic Random Access Memory,双倍速率同步动态随机存储器
FLASH: Flash Memory,闪存
AMBA : Advanced Microcontroller Bus Architecture,高级微控制器总线体系结构
AHB : Advanced High-performance Bus 高级高性能总线
ASB : Advanced System Bus 高级系统总线
APB : Advanced Peripheral Bus 高级外围总线
5.验证
fork-join 是并行执行的,所以里面的延时就取决于最大的延时
6.不能在module中独立存在的语句块
forever 通常是包含在 initial begin end 中,用来生成时钟,无法单独存在
7.STA和DTA的个人理解
静态时序分析(STA):比如vivado的综合或者布线后的report timing summary,遍历电路存在的所有时序路径,根据给定工作条件(PVT)下的时序库.lib 文件计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足约束要求, 根据最大路径延时和最小路径延时找出违背时序约束的错误。
动态时序分析(DTA):可以称作动态时序仿真,对RTL电路的功能性仿真,需要自己编写testbench进行测试。
8.FPGA开发流程
系统规划
RTL设计
功能仿真
综合、编译、布局布线
时序仿真
板级验证
9.setup time和hold time
在时钟有效沿到来之前,数据必须维持一段时间保持不变,这段时间就是建立时间 Tsetup
在时钟有效沿到来之后,数据必须维持一段时间保持不变,这段时间就是保持时间 Thold
一些需要知道的名词定义:
1.走线延迟:数字逻辑电路中,任何输出信号到输入信号之间都有一定的线路延迟,把这种线路延迟叫做走线延迟。
2.组合延迟Tcomb:当进行门电路逻辑运算时产生的延迟。——一般为最长的延迟路径
3.寄存器延迟Tco:寄存器内部的延迟,或者说posedge上升沿到寄存器clk端到输出Q端的延迟。
4.时钟延迟Tclk:时钟信号从时钟源端口出发,到源寄存器时钟端口的延迟。
5.数据延迟Tdata:数据从源寄存器Q端到目的寄存器D端的时间。—— Tco + Tcmob
6.Tskew : 时钟偏斜或说时钟偏移,是指时钟信号到达数字电路各部分所用时间的差异。
7.Tjitter : 时钟抖动,是同一时钟的两个时钟周期之间的差值。
8.Th:保持时间
9.Tsu:建立时间。
关于保持时间和建立时间的计算方法:
对于建立时间有:T(T为时钟周期) + Tskew = Tco + Tcmob + Tsu + A(A为建立时间容限>0)。所以有T + Tskew - Tco - Tcmob > Tsu。
关于保持时间有:Tco + Tcmob = Th + Tskew + B(B为保持时间容限>0)。所以有Tco + Tcmob - Tskew > Th。
关于时钟抖动和时钟偏移的解决方法:
减小时钟抖动的方法:
受时钟自身的影响,不受布线的影响,因此通过控制系统温度变化、减少机械振动、减少电源、地等来减少,选用好的时钟源。
减小时钟偏移的方法:
时钟偏移是由于布线长度或者不同负载(组合逻辑)引起的,因此可使用低输出阻抗的时钟驱动,如果驱动能力不够可用同型号电源并联、采用树形结构、低阻抗时钟分布线、远程匹配多驱动来解决。——采用全局时钟
补充:
一般地,我们在进行分频操作的时候,采用PLL来完成,尽量避免对时钟进行逻辑操作,否则容易出现时钟偏移、抖动,甚至出现时钟毛刺的情况。
10.function 和 task
function的定义如下
function <返回值的类型或范围>(函数名);
<端口说明语句>
<变量类型说明语句>
beign
<语句>
end
endfunction
function 定义时的注意事项:
函数的定义不能包含有任何的时间控制语句,即任何用#、@、或wait来标识的语句。
函数不能启动任务。
定义函数时至少要有一个输入参量。
在函数的定义中必须由一条赋值语句给函数中的一个变量赋以函数的结果值,该内部变量具有和函数名相同的名字。
定义中声明的所有局部变量寄存器都是静态的,即function中的局部寄存器在function的多个调用直接保持它们的值
function 调用:
function 的调用可以出现在always以及assign语句中
function 例子:
function integer clogb2;
input integer depth;
for (clogb2=0; depth>0; clogb2=clogb2+1)
depth = depth >> 1;
endfunction
task的定义如下:
task <任务名>;
<端口及数据类型声明语句>
<变量声明>
<语句1>
<语句2>
.....
<语句n>
endtask
task定义的注意事项:
在第一行“task”语句中不能列出端口名列表。
任务中可以有延时语句、敏感事件控制语句等事件控制语句。
任务可以没有或可以有一个或多个输入、输出和双向端口。
任务可以没有返回值,也可以通过输出端口或双向端口返回一个或多个返回值。
任务可以调用其它的任务或函数,也可以调用该任务本身。
任务定义结构内不允许出现过程块(initial或always过程块)。
任务定义结构内可以出现disable终止语句,这条语句的执行将中断正在执行的任务。在任务被中断后,程序流程将返回到调用任务的地方继续向下执行。该语句不可综合。
task的调用方式:
<任务名>(端口1,端口2,…,端口n);
11.关于跨时钟域的一些题解
对于多比特传输,异步fifo是一种解决方案
对于由快时钟域到慢时钟域的脉冲传递,需要在快时钟域下检测单bit脉冲,然后做一个脉冲展宽,即当检测到单bit脉冲后,对寄存器x写1。然后再慢时钟下同步寄存器x的值,当慢时钟域下明确同步到寄存器x的值后,可以反馈给快时钟域,用于对寄存器x写0,表示一次传递完成。
对于由慢时钟域到快时钟域的脉冲传递,可以使用两级触发器同步解决。
对于电平信号,均可用两级触发器打拍来解决。
12.对于切换时钟的题解
参见文章:设计一个Glitch Free的时钟切换电路
13.环形计数器的改进方法
采用约翰逊计数器,可以利用更多的状态,即计数次数增加
14.异步复位同步释放的优点
异步复位最大的问题是不管产生或撤销复位信号,都是一个异步过程,产生复位信号不存在问题,但是撤销时就出现了问题,如果异步复位在触发器时钟有效沿附近释放,触发器的输出就会进入亚稳态,因此导致SOC的复位状态丢失。因此,需要对复位信号进行两级触发器缓冲,有效消除亚稳态。
具体代码如下:
module asyn_reset(
clk ,
rst_n ,
rst_s2
);
input clk ;
input rst_n ;
output reg rst_s2;
reg rst_s1;
always @ (posedge clk or negedge rst_n) begin
if (!rst_n) begin
rst_s1 <= 1'b0;
rst_s2 <= 1'b0;
end
else begin
rst_s1 <= 1'b1 ;
rst_s2 <= rst_s1 ;
end
end
endmodule
15.关于verilog设计中的低功耗
低功耗的方法:
1.对于时序逻辑下的寄存器,不加复位逻辑,只加有效值信号判断,这样可以省下复位电路的布线面积。
2.手动插入时钟门控,在模块不会运作的时钟周期,加入控制信号,关掉时钟,减小动态消耗。
3.休眠掉电。
4.减少没有意义的高低电平切换,避免没有必要的动态消耗。
16.什么是亚稳态?
输入信号在时钟有效沿的建立时间和保持时间之间变化,导致其不满足触发器建立保持时间的时序要求,使得输出有一段时间的不确定状态,这就是亚稳态。
17.格雷码与二进制码的互相转换
假设二进制和格雷码各个位分别使用如下字符表示:
n 位的二进制:Bn, Bn-1, Bn-2…B2, B1 , B0;
n 位的格雷码:Gn, Gn-1, Gn-2…G2, G1, G0;
则,转换公式为:2-g : Gn = Bn , Gi-1 = Bi ^ Bi-1 (i = 1 , 2 , … ,n) ; g-2 : Bn = Gn , Bi-1 = Gi ^ Bi-1 (i = 1 , 2 , … ,n) 。
18.竞争和冒险
产生原因:竞争和冒险都是由于存在电路延迟引起的,同时冒险是由竞争造成的,而竞争是因为电路中的时延不同,但是有竞争的时候不一定会出现冒险。
解决方法:1.增加冗余项 2.增加选通信号 3.增加滤波电容 4.采用可靠型编码
19.分布式RAM和Block RAM
这里先介绍一下FPGA的基本组成:CLB(可配置逻辑块)、IOB、BRAM、完整的时钟管理模块、内嵌的底层功能单元和嵌入式专用硬核、丰富的布线资源。其中CLB由两个Slice组成,由于Slice有SliceL(Logic)和SliceM(Memory)之分,因此CLB可分为CLBLL和CLBLM两类。而SliceL和SliceM内部都包含4个6输入查找表(LUT6)、3个数据选择器(MUX)、1个进位链(Carry Chain)和8个触发器(Flip-Flop)。那么,SliceM中的LUT资源就是分布式RAM的组成部分。
下面介绍两者的主要区别:
Block RAM由一定数量固定大小的存储块构成的,使用Block RAM资源不占用额外的逻辑资源,并且速度快。但是使用的时候消耗的BLOCK RAM资源是其块大小的整数倍。如Xilinx公司的结构中每个BRAM有36Kbit的容量,既可以作为一个36Kbit的存储器使用,也可以拆分为两个独立的18Kbit存储器使用。反过来相邻两个BRAM可以结合起来实现72Kbit存储器,而且不消耗额外的逻辑资源。
分布式RAM的特点是可以实现BRAM不能实现的异步访问,不过使用分布式RAM实现大规模的存储器会占用大量的LUT,可用来实现逻辑的查找表就会减少。在查找表资源足够的情况下,利用查找表为电路实现存储器,既可以实现芯片内部存储,又能提高资源利用率。不过建议仅在需要小规模存储器时,使用这种分布式RAM。
20.时序约束的基本路径
1.FPGA内部寄存器之间的时序路径,简称reg2reg;
2.输入引脚到FPGA内部寄存器的时序路径,简称pin2reg;
3.FPGA内部寄存器到输出引脚的时序路径,简称reg2pin;
4.输入引脚到输出引脚之间的时序路径(不通过寄存器),简称pin2pin。
21.时序约束的基本步骤
1.时钟约束(主时钟、虚拟时钟、衍生时钟);
2.输入/输出接口约束(系统同步、源同步);
3.时钟分组和跨时钟约束(异步);
4.时序例外约束(多周期路径、虚假路径)。
22.突发传输与普通流水线传输有何区别
表面上来看,没什么区别。理论上都是N+1个Cycle。但是这是针对一拍可以回数的紧耦合SRAM而言的,如果访问的是DDR呢?
如果是突发传输,你只需要下发一次命令,DDR Controller可以帮你计算好,你总共需要读多少数据,比如每一拍是32Bit,突发长度是4,DDR控制器只要对DDR发一次命令即可,一次性读回128Bit的数据。如果是Single transfer,DDR Controller可不知道你下一笔传输的地址和这笔传输的地址只差了0x4,DDR Controller完全可能把你的第一次single transfer下发出去,然后又下发第二次,然后又下发第三次,然后…由于DDR的读取时序没有那么简单,不是完全的流水式的,因此这中间就可以阻塞很多个周期。所以!突发传输和流水线的Single transfer是不一样的!能用突发传输就用突发传输,不要用多次Single Transfer。
23.spi的相位和极性
CPOL为1,第一个跳变沿为下降沿,CPOL为0 ,第一个跳变沿为上升沿。
CPHA为1,取第二个跳变沿采样,CPHA为0,取第一个跳变沿采样。文章来源:https://www.toymoban.com/news/detail-537101.html
24.低功耗设计的方法
1.时钟门控。 2.电源关断技术。 3.Multi VDD(多电压域):根据不同模块的性能要求不同而采用不同的电源供电。4.Multi Vt(多阈值电压):使用多阙值工艺可以在时序和漏电流之间进行一些折中。5.状态机编码:格雷码,可以减少翻转的位数。文章来源地址https://www.toymoban.com/news/detail-537101.html
到了这里,关于FPGA知识点(不断增加......)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!