1 浮点近似为定点运算
浮点定标:
数的定标就是将要运算的浮点数扩大很多倍,然后取整,再用这个数进行运算,运算得到的结果再缩小相应的倍数就可以了。
在设计中,一定不要忘记小数点。在FPGA 中是体现不出来小数点的,小数点的位置只有程序员知道。Q表示小数点的位置,Q15就表示小数点在第15位。
浮点数(x)转换为定点数(xq): xq=(int)x*2^Q
定点数(xq)转换浮点数(x): x= (float)xq*2^(-Q)
比如,16进制数2000H,用Q0表示就是8192;若用Q15表示,则为0.25。
0010_0000_0000_0000, 2^-2 = 0.25
介绍Q格式运算中Q值的确定:
(1)定点加减法:需要转换成相同Q格式才能加减
(2)定点乘法:不同Q格式的数据相乘,相当于Q值相加
(3)定点除法:不同Q格式的数据相除,相当于Q值相减
(4)定点左移:相当于Q值增加
(5)定点右移:相当于Q值减少
Q15表示的4000H(浮点数0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,乘完之后Q值变为15+15=30,即结果为0.01B,即为浮点数0.25。
不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。
因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。
综上首先掌握,浮点数转定点数,定点数转浮点数。根据Q的确定,Q为小数点。 其次掌握乘法 除法 加减法 浮点数运算,中Q的确定,以及二进制加减法,乘除法
2 FPGA中的整数乘除法
FPGA乘法器: 按位与数相与,最后移位,加法运算。 与 移位 加法。
在Verilog中,我们一般使用乘法器时直接用*来直接完成,或者调用相关IP核来生成高性能乘法器。
乘法器、除法器:
Multipiler divider
FPGA除法器: 组合逻辑实现: 移位 比较 减法
首先将被除数(位宽DIVISOR_WIDTH)和除数(位宽DIVIDEND_WIDTH)均扩展到(DIVISOR_WIDTH+DIVIDEND_WIDTH)位,其中将被除数高位补0后赋给tempa,除数左移DIVISOR_WIDTH位,低位补0,赋给tempb,在每个周期开始时,先将tempa左移一位,末尾补0,然后与除数(dividend)比较, 是否大于除数,是则tempa减去tempb将且加上1,
执行结束后tempa的高DIVIDEND_WIDTH位即为余数,低DIVISOR_WIDTH位即为商
假设数据位宽为WIDTH,被除数为a,除数为b
第一步:
令a={WIDTH{1'b0},a},b={b,WIDTH{1'b0}}。
第二步:
在每个时钟周期,将a左移一位,末尾补0,然后与b比较,若大于b,则令a=a-b+1;否则继续左移比较。
第三步:
直到移位WIDTH次,此时a的高width位为余数,低width位为商。
3 FPGA进行浮点运算
将浮点数乘以2的n次方,换成整数计算 ,最后在缩小。只能做到近似。
通过移位,将浮点数变为整数,进行整数运算后,移位复原。
FPGA小数乘法: 定点小数可以通过移位来加速,所以定点小数的运算比浮点小数要快得多。
5.555*4.444=24.68642
第一步:将被乘数乘以256
5.555*256 = 1422.08 = 20’d1422 = 20’h5_8E; (存在误差0.0056%)
*4.444256 = 1137.664 = 20’d1137= 20’h4_71; (存在误差0.058%) **
第二步:中间运算
20’h5_8E * 20’h4_71 = 20’h18_ABAE;
第三步:中间结果除以256
20’h18_ABAE >> 8 = 20’h18_AB;
第四步:转换为实际小数比较
20’h18_AB = 24.171 (存在误差2%)
如果想降低取整导致的误差,可以加大位宽
因为Q小数点会加倍,所以恢复小数得除2^16.. 上述为Q8
FPGA浮点数加减法:
如果对于未对齐的二进制数,需要补齐最低位使得小数位的位宽相同才能进行加减法运算;
如果将数据均看成无符号整数,则不需要进行小数位扩展,因为Verilog HDL编译器会自动将参与运算的数据以最低位对齐进行运算;
4 Floating-point IP核
比较
定点转浮点
浮点转定点
乘
指数
等运算
5 浮点数的表示
IEE754协议
符号位占1bit,指数位E(Exponent)占8bit,其取值范围为0~255(无符号整数)(注意:E为无符号整数,实际数值e=E-127,这一点务必注意),**尾数位M占23bit。尾数也叫做有效数字位、系数位、甚至被称作小数;
6 综合和不可综合
verilog HDL或VHDL都只是一种硬件的描述语言,并且允许在不同的抽象层次上对电路进行建模。VerilogHDL侧重于电路级,可以在门级和寄存器传输级(RTL)描述硬件,也可以在算法级对硬件加以描述。而VHDL侧重于系统级。
综合就是将Verilog描述的RTL级的电路模型构造出门级网表的过程。综合只是个中间步骤,综合后生成的网表文件,就是由导线相互连接的寄存器传输级功能块 (像是触发器、算术逻辑单元和多路选择器等)组成的。
综合产生网表文件后,逻辑优化器会读入网表,并且会按照用户提供的面积(即资源要求)和定时(时序要求)约束为目标来优化网表。
并且,这些面积和定时约束也能够指导模块构造器恰当地选取或生成寄存器传输级功能块。
并不是所有层次上的描述方式都可以被综合成想要的硬件元件,即不可综合。
比如Verilog中存在一些用于仿真验证的子集,属于仿真验证语言,只在仿真时候使用,不能被综合成电路,因为没有相应的硬件元件与其对应。如系统任务$dsiplay(),initial语句等。
-
task和function都是可综合的,不过综合出来的都是组合逻辑电路。要想可综合,task和function内部必须是组合逻辑。
-
循环语句(repeat、while、for)也可以用于可综合电路设计,当采用循环语句进行计算和赋值操作时,可以综合得到逻辑电路。
可被综合的:
parameter
function、generate、integer、 `define,while、repeat、for
不可综合的:
initial、fork.. join、wait、time、real、display、forever。defparam
task
保证Verilog HDL 赋值语句的可综合性,在建模时应注意以下要点:
-
不能使用initial,initial一般使用在测试程序,做初始化;
-
不建议使用延时,#1,这种只是模拟数字电路中因为布线产生的信号延时,不可综合,但也不会报错;
-
不能使用循环次数不确定的函数,但forever在综合设计中禁止使用,只能使用在仿真测试程序中;
-
尽量使用同步电路设计方式;
-
当使用always进行组合逻辑设计时,敏感列表里面的要列出所有输入信号。
-
在进行时序电路进行编写时,采样非阻塞赋值。组合逻辑设计时,采样阻塞赋值,但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。。
-
为避免产生锁存器,if、case要进行完整的语句赋值,且case语句中避免使用X值、Z值。
-
避免混合使用上升沿和下降沿触发的触发器:
如:always @(posedge clk or negedge clk) begin...end,这个always块不可综合。
7 同步释放,异步复位
复位是将寄存器恢复到默认值。一般复位的功能包括:同步复位,异步复位。
同步复位是指当上升沿检测到复位信号,执行复位操作,有效的时钟沿是前提。
同步复位优点:
有利于仿真器的仿真
可以使设计的系统成为100%的同步时序电路,有利于时序分析,可综合出较高的Fmax
由于只在时钟有效电平到来时有效,所以可以滤除高于时钟频率的复位毛刺。
缺点:
复位信号的有效时长必须大于时钟周期,才能真正的被系统识别并完成复位任务,同时还要考虑诸多时钟偏斜,组合逻辑路径延时,复位延时等因素。
由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,若采用同步复位的话,综合器就会在寄存器的数据输入端端口插入组合逻辑,这样会额外增加FPGA内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。
异步复位:
异步复位指的是无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
优点:
大多数目标器件库的DFF都有异步复位端口,那么该触发器的复位端口不需要额外的组合逻辑,可以节省资源
设计相对简单
复位信号的产生和响应都很方便。
缺点:
在复位信号释放(reset)的时候容易出现问题。具体来说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
异步复位信号需要满足恢复视觉和去除时间,才能有效的复位和释放复位,防止出现亚稳态。
异步复位,同步释放:复位信号到来时,不受时钟信号的同步,而复位信号释放的时候的受时钟信号的同步。 将复位信号释放打两拍,与时钟信号同步。
8 跨时钟域
1 跨时钟域的亚稳态现象
建立时间:输入信号在时钟上升沿来临之前,应该保持数据稳定的最短时间,否则数据不能被正常采样;
保持时间:输入信号在时钟上升沿来临之后,数据保持稳定的时间,否则数据不能被正常传输。
对于时序电路,在不同时钟域之间进行数据传输时,因为异步时钟沿可能在任何时刻到来,当寄存器输出信号不满足建立时间和保持时间时,输出端的信号很有可能出现亚稳态现象。 但当存在亚稳态现象,也可能是半导体工艺或者芯片在不同的环境下工作导致信号从亚稳态回到稳定状态的时间长短不一。
2 跨时钟域处理
单bit信号跨时钟域处理: 控制信号 慢时钟域到快时钟域
两级触发器同步器。
单bit信号跨时钟域处理: 快时钟域
扩宽脉冲,握手信号。
多bit信号: 数据信号