转自 https://blog.csdn.net/u014485485/article/details/82801293
真值表/卡诺图
1.建立时间和保持时间
Setup time, Tsu 建立时间 在时钟沿到来之前数据稳定不变的时间,如果建立的时间不满足,那么数据将不能在这个时钟上升沿被稳定的打入触发器
Hold time, Th 保持时间 时钟沿到来之后数据稳定不变的时间,如果保持时间不满足,那么数据同样也不能被稳定的打入触发器
Clock-to-Output Delay,Tco 数据输出延迟,输出响应时间 当时钟有效沿变化后,数据从输入端到输出端的最小时间间隔。
触发器输出的响应时间,也就是触发器的输出在clk时钟上升沿到来之后多长的时间内发生变化,也即触发器的输出延时。
数据到达时间Tda:
数据建立时间Tsu:
建立时间裕量(Setup Slack):
保持时间裕量(hold slack):
上述时序关系也解释了为什么时钟频率过快或者数据延时太大,都会导致错误的时序。(与STA静态时序分析有关)
2.施密特触发器
当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变。
这种双阈值动作被称为迟滞现象,表明施密特触发器有记忆性。
施密特触发器有两个稳定状态,可以把边沿变化缓慢的周期性信号变换为边沿很陡的矩形脉冲信号。例如将三角波、正弦波等变成矩形波。
3.格雷码
任意两个相邻的码字只有一位二进制数不同。
可以使装置做数字步进时只改动最少的位元数以降低误码率。
4.锁存器(latch)和触发器(flip-flop)
都是时序逻辑(输出不但与当前输入有关还和上一次的输出有关)
Latch是电平触发,输出同所有输入信号有关,输入信号变化,latch就变化;
Flip-flop受时钟控制,只有在时钟触发时才采样当前输入,产生输出。
区别:latch没有时钟端,无法做到同步,输出容易产生毛刺;如果用门电路来搭建,latch消耗的门资源比ff要少。
触发器的电路图由逻辑门组合而成,其结构均由R-S锁存器派生而来。
在R-S锁存器的前面加一个由两个与门和一个非门构成的附加电路,则构成D触发器。
为什么需要触发器:触发器能保存数据,保存电路状态;触发器是在时钟边沿触发,用时钟同步是让整个电路能同步整齐划一的工作;乘法器的计算部分是组合逻辑,不需要触发器,计算后的结果可以用触发器保存起来。
5.阻塞赋值(=)和非阻塞赋值(<=)
在同一个always块中,阻塞赋值先计算RHS表达式,不允许其他verilog语句干扰,然后赋值给LHS,才允许其他赋值语句执行。(其后的赋值语句是在前一句赋值语句结束后再开始赋值的)
非阻塞赋值开始时计算RHS的表达式,同时就更新LHS,赋值结束时停止更新。(也可以理解为一直在计算RHS,最后时刻更新LHS)这个过程中,其他verilog语句都能同时操作。
注意:
1.非阻塞赋值只能对寄存器变量赋值(reg),只能在initial和always块中。
2.时序电路/锁存器 建模——非阻塞赋值
用always块建立组合逻辑电路——阻塞赋值
在同一个always块建立时序和组合逻辑电路——非阻塞赋值
3.在一个always块中不要既用阻塞由用非阻塞;不要在一个以上always块中对同一个变量赋值
6.同步电路与异步电路
这里指的是时序电路。
组合逻辑电路:任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。
时序逻辑电路:任意时刻的输出不仅取决于当时的输入,还取决于电路原来的状态。(具有记忆功能)
根据各级触发器时钟端的连接方式可以将时序电路分为同步/异步。
同步时序电路所有操作都是在同一时钟严格的控制下步调一致地完成的。
异步时序电路,不存在单一的主控时钟,主要是用于产生地址译码器、FIFO和异步RAM的读写控制信号脉冲。
关于延时:
异步电路的延时:buffer或者两级非门
同步电路的延时:大的延时:计数器;小的延时:D触发器打节拍
7.跨时钟域数据交换
进行同步处理。
单bit数据:打两拍(两级并不能完全消除亚稳态危害,但是大大减少其发生概率)
多bit数据:异步FIFO(或双口RAM)(以某个时钟读,在以某个时钟写,空/满标志是关键)
多位数据也可以采用保持寄存器加握手信号的方法(多数据,控制信号,地址信号)
8.关于亚稳态
原因:在FPGA系统中,如果数据传输中不满足触发器的Tsu和Th,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值。这段时间称为决断时间(resolution time)。经过resolution time之后Q端将稳定到0或1上,但是稳定到0或者1,是随机的,与输入没有必然的关系。
只要系统中有异步元件,亚稳态就无法避免
1.数据传输:数据在目的寄存器Tsu-Th时间窗口发生变化
2.异步复位:异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之内
3.同步复位:输入端Din为高电平,而且复位信号的撤销时间在clk的Tsu和Th内时候
常用FPGA器件的Tsu+Th约等于1ns,复位移除和恢复时间相加约等于1ns。
亚稳态发生概率 = (建立时间 + 保持时间)/ 采集时钟周期
——>
(1) 降低系统工作时钟,增大系统周期,亚稳态概率就会减小;
(2) 采用工艺更好的FPGA,也就是Tsu和Th时间较小的FPGA器件;
解决方法:
1.降低系统时钟频率
2.用反应更快的FF(Tsu和Th时间较小)
3.对异步信号进行同步处理:
多级D触发器级联:大部分资料都说的是第一级寄存器产生亚稳态后,第二级寄存器稳定输出概率为90%,第三极寄存器稳定输出的概率为99%(一般就搞个两级);
采用FIFO对跨时钟域数据通信进行缓冲;
4.对复位电路采用异步复位、同步释放方式处理。
最终用sys_rst_n做系统的复位信号
5.改善时钟质量,用边沿变化快速的时钟信号
9.静态功耗与动态功耗
静态:晶体管状态稳定不变时的功耗(漏电流导致)
动态:晶体管开关状态变化(电路翻转)产生的功耗(大头 70%~90%)
10.同步复位和异步复位
也可能综合出:
优点:保证信号同步;综合为更小的触发器;复位时时钟可以过滤毛刺
使用同步复位可能使综合工具无法分辨分辨复位信号和其他控制信号,导致进行复位的控制逻辑远离触发器:
不好的:
优点:复位路径上没有延时;综合工具能自动推断出异步复位而不必加入任何综合指令
异步复位的同步释放:
11.补码
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
12.低功耗设计(系统问题)
设计层次越高,功耗改善的程度越大:
工艺级
版图和晶体管级
PTL级和逻辑级
系统级
RTL级:
时钟是大头:门控时钟:无计算任务的部分时钟停下
预计算技术:在一定的输入条件下,使所有或部分输入寄存器的负载无效,从而降低功耗
逻辑优化:减少信号的翻转
组合逻辑优化:提取重复出现表达式、表达式替换、选择性消除节点
路径平衡:几个输入通过不同的路径到达同一个门,要想办法使各个路径差不多长
系统级:
软硬件划分
指令级优化
电源管理
cache低功耗设计
总线低功耗设计
总线信号编码,减少翻转 例如格雷码
算法的优化,包括流水线设计,并行设计
13.状态机
以几何图形的方式描述时序逻辑的状态转移。
分类:
Moore:输出(下一状态)只与当前状态有关
Mealy:输出不仅与当前状态有关,还与当前输入有关
状态编码:
二进制编码、 格雷码 (Gray) 、独热码 (one-hot) 、自定义编码。
在小设计中可以考虑使用 Gray 码或 one-hot。大设计中,不担心逻辑资源不够的话,可以考虑使用one-hot 编码以提高速度。至于顺序二进制编码,一般不予考虑。但是要达到最佳性能,需要使用更高级的编码算法,针对给定的状态机进行分析。
描述方法:
两段式:两个always模块,其中一个always模块采用同步时序的方式描述状态转移,而另一个模块采用组合逻辑的方式判断状态转移条件、描述状态转移规律
三段式:
三个 always 模块,一个 always 模块采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件、描述状态转换规律,第三个 always模块使用同步时序电路描述每个状态的输出
电梯:
当前状态current status——事件event——转移状态next status
自动售货机
14.FPGA内部的资源
IOB:可编程输入输出单元,芯片与外界电路接口,完成不同电气特性下对输入输出信号的驱动与匹配要求
CLB:可编程逻辑快,多个Slice和附加逻辑构成(Xilinx),可以实现组合逻辑、时序逻辑、配置成分布式RAM(LUT配置成)
BRAM:块RAM,灵活,可以配置成单端口RAM,双端口RAM,FIFO,CAM(内容地址存储器)等,可以根据需要改变位宽和长度
DCM:数字时钟管理模块,
专用硬核:CPU,乘法器,DSP等
【 存储资源:Block RAM(一些固定大小的存储块,要用就用一整块,不占用逻辑资源,速度快);分布式RAM(灵活)】
【 可以实现RAM/ROM/CAM 的资源:block ram,flip-flop,LUT 】
15.FPGA开发流程
个人习惯:分析系统划分模块——个子模块HDL实现——各子模块前仿真——组成系统功能仿真——逻辑综合——布局布线——静态时序分析——后仿真——上板测试
尽量在底层模块做逻辑,在高层尽量做例化,顶层模块只做例化
前仿真:纯粹的功能仿真,验证电路的功能是否符合设计要求,不考虑电路门延迟与线延迟。
后仿真:综合后的功能仿真和布局布线后的时序仿真。是指电路已经映射到特定的工艺环境下,综合考虑电路的路径延迟与门延迟的影响,验证电路是否在一定时序条件下满足设计构想的过程,是否存在时序违规。(必做)
16.FPGA——乘法器的设计
常见的有移位相加法,加法树法,查表法,混合法……
1.移位相加
begin
dout=0;
for(i=0;i<WIGTH;i=i+1)
dout=dout+((din_a_buf[i]==1)?(din_b_buf<<i):0);//移位相加逻辑
end
2.加法树
上面的设计中,会产生大量组合逻辑,这就带来了大量的延迟从而使乘法器的速率受到限制,为了提高速度,可以采用流水线的方法,将组合逻辑分割成一个一个小的组合逻辑,中间加上触发器用来锁存数据,这样就可以大大提高频率,引入触发器仅仅是带来了延迟而已
begin//流水线实现
din_a_buf<=din_a;
din_b_buf<=din_b;
buf0<=din_b_buf[0]?din_a_buf:0;
buf1<=din_b_buf[1]?din_a_buf<<1:0;
buf2<=din_b_buf[2]?din_a_buf<<2:0;
buf3<=din_b_buf[3]?din_a_buf<<3:0;
buf4<=din_b_buf[4]?din_a_buf<<4:0;
buf5<=din_b_buf[5]?din_a_buf<<5:0;
buf6<=din_b_buf[6]?din_a_buf<<6:0;
buf7<=din_b_buf[7]?din_a_buf<<7:0;
buf01<=buf0+buf1;
buf23<=buf2+buf3;
buf45<=buf4+buf5;
buf67<=buf6+buf7;
buf02<=buf01+buf23;
buf46<=buf45+buf67;
dout<=buf02+buf46;
end
3.查找表
查表法,就是建一个表,里面存放了所有的乘法结果,乘数和被乘数用来作为地址去查找里面的乘积,此种方法可以大大提高乘法的速率,但是当乘法位数很大时会要求产生很大的表格,所以此种方法适合位数较小的乘法,特别适合有一个乘数为固定的乘法,如滤波器中的乘法就可以采用此种方法设计
【查找表本质上是一个RAM,例如4输入的LUT可以看成有4位地址线的16x1的RAM,使用时输入地址-查表-输出】
17.FPGA——除法器的设计
对于2:长除法: 比较 相减 移位(状态机实现)
16位 / 8位https://blog.csdn.net/stanary/article/details/77426697
首先被减数16位在前边拼接7位0,拼接后不会改变被除数的大小,而且方便向下操作。拼接后将此23位数称为mid。之后取mid的高8位与除数作比较,若大于除数,则减去除数,结果低位拼接一。若小于除数,则验证最高位是不是0,若是则左移一位,结果拼接0.若不是则用高九位减去除数,结果拼接两个0.然后将差和后15位以及末尾一个0拼接,实现结果循环向前。在计算的同时用计数器计数来确定运行到的位数。在进行以上操作,最终得到结果。
8位 / 8位http://blog.chinaaet.com/justlxy/p/5100052068
将被除数,扩展成16位的数据,低8位为被除数的值,高八位的值全为0。有开始信号,对16位数据data赋值,然后开始运算。比较data的高八位和除数的值,如果大于0,说明被除数大,将此时商置1,赋值给data的最低位,然后将被除数高八位减去除数。然后将data向左移位一位,继续比较。最终计算8次后。Data的高8位数据就为所求的余数,低八位就为所求的商。
或者把除法转换成了查表、乘法和移位:
18.奇数分频
19.静态时序分析
STA,Static Timing Analysis
静态时序分析(STA)告诉我们电路的实际表现如何,而提供约束(SDC文件,对时序的一些要求)来告诉分析工具我们希望电路的表现应该是怎样。
20.竞争与冒险
某一输入变量经过不同的传播路径,到达电路某个汇合点的时间有先有后,这种现象叫竞争;
由于竞争使输出发生瞬时错误的现象叫冒险。
判断方法:代数法(布尔表达式中有相反的信号);卡诺图(有两个相切的卡诺圈,并且相切处没有被其他的卡诺圈包围);实验法:示波器观察
解决方法:加滤波电路,消除毛刺;加选通信号,避开毛刺;增加冗余项,消除逻辑冒险