1 加法器
半加器: 半加器用于位求和。
半加器不考虑低位进位来的进位值,只有两个输入,两个输出。由一个与门和异或门构成.
全加器: 使用两个半加器和一个或门 实现一个全加器。
全加器的输入包含低位进位。
对于多位: 串行进位加法器。根据全加法器实现串行进位加法器
超前进位加法器: 每一级进位有附加的组合电路产生。高位的运算不需要地位的等待,因此速度很高。
根据超前进位公式: 对于进位我们每次只需算出前一位的 a|b a&b. 然后根据公式计算。
每一位的低位进位,可以通过低位的输入和低位的进位求出。
2 IEE745数 的表示
FP16 半精度浮点数 符号 1bit。指数位5位。小数位10位。
尾数: 浮点数的二进制,小数点后第一位为2^-i.
尾数为1.M M为尾数
阶码: 指数e=阶码-127 32位的IEE745,因为指数位有8位,
16位的IEE745。 指数e = 阶码 - 15
x=(-1)s X 1.M X 2^e
单精度浮点数IEE745: 一位为符号位
尾数M:23位,原码纯小数表示,小数点在尾数与的最前面。由于原码表示的规格化浮点数要求,最高数值位始终位1,因此该标准当中隐藏最高数值位(1),
阶码E:8位,采用有偏移量的移码表示,移码用的是移127码,即E=e+(27-1)=e+127,而不是标准8位移码: [x]移=x+27=x+128
浮点数的真值:N=(-1)sX(1.M)X2E-127
就是说8位阶码在计算时候加127.
0.625 ------ 的阶码位0+127 = 127
尾数值位0.625 --- 2^-1+2^-3 1010
3 减法器
减法器和加法器设计思想类似, 从高位借位,减去低位向字节的借位。
4 乘法器
1 并行乘法器,也就是用乘法运算符实现.
2 移位相加乘法器-----每一位相乘后,进行移位相加
5 除法器
1 如果是2 的幂次,直接进行移位
2 基于减法的除法器 ------
对于32位无符号除法,被除数a除以除数b,他们的商和余数一定不会超过32位。首先将a转换成高32位为0,低32为为a的temp_a , 把b转换为高32位为b,低32位为0的temp_b。在每个周期开始,temp_a左移一位,末尾补0,然后与b比较,是否大于b,是则减去temp_b且加上1,,否则继续向下执行。
最后temp_a高32位为商,低32位为余数。
6 有符号数
有符号数均为补码表示
只有计算表达式右边有无符号数,整个计算式都按照无符号数规则运算
两个n bit数相加,得到n+1 bit结果
有符号加法,乘法: 进行符号位扩展,再进行运算。
有符号和无符号加法,乘法: 整个计算转为无符号计算
通过添加符号位,进行位扩展,同时注意运算结果的最大位宽。
输入和输出都是二进制补码,补码的符号位扩展就是补最高位即符号位即可。
7 溢出判断
有符号数的加法运算:
单符号数溢出检测判断:最高位和符号位有且仅由一个进位时溢出,即当最高位有进位,而符号位无进位时,产生正溢;当最高位无进位,而符号位有进位时,产生负溢。
双符号位溢出判断:两个符号位相异时,表示溢出;相同时,表示未溢出。
8 规格化
补码:0.1xxxxxx…x 1.0xxxxxx….x
因此,正小数的形式当然和原码一样:0.1xxxxxx…x,自然最大值就是0.1111111….1, 最小是0.10000….0
而负数是我们特别关注的:
1.0xxxxxx….x的形式,最大值是1.0111111…1, 最小值是1.000000….0
9 舍入
因为计算过程中需要扩展位数保证精度,因此在输出浮点数结果前需要截断扩展的尾数。
了保证运算结果的精度,运算过程中需保留右移中移出的若干位数据,称为保护位。在运算结果进行规格化后再按照某种规则进行舍入处理以去除这些数据。
10 溢出判断
浮点数尾数的溢出可通过规格化进行处理,而浮点数运算结果的溢出则根据运算结果中浮点数的阶码来确定。
若阶码未发生溢出,则表示运算结果未发生溢出;若阶码溢出,则需进行溢出处理。
对指数位即阶码进行判断,溢出,则数据置为0.
11 半精度浮点数加法器
对阶 尾数相加 规格化 舍入 判断溢出
规格化: 统一的数据格式 IEE745
将计算后的数据规格化。对于产生溢出位的结果右移
产生结果多个高位为0时,需要左移,直到1出现在最高位。
因为计算过程中需要扩展位数保证精度,因此在输出浮点数结果前需要截断扩展的尾数。
判断溢出: 判断指数位 最高位表示符号位。 若指数位为1表示负的。 表示溢出。 溢出要置为0. 指数位进行扩展了一位。
f(exponent[5]==1'b1) begin //exponent is negative sum = 16'b0000000000000000;
1 对阶,小阶向大阶对齐
2 尾数进行加减运算
3 规格化并进行舍入
当尾数用二进制补码表示时,规格化浮点数的尾数形式为00.1××…××或11.0××…××。若浮点数的尾数不是这两种形式,则称之为非规格化浮点数,需进行浮点数的规格化。
4 判断溢出
浮点数尾数的溢出通过规格化进行处理,若阶码未发生溢出,则表明结果未发生溢出。 阶码最高位为1, 表示溢出。置为0.
否则进行拼接。
12 半精度浮点数乘法器
浮点乘除法其实很简单,
浮点数乘法:阶码相加、尾数相乘、结果规格化;
浮点数除法:尾数调整、阶码求差、尾数相除半精度浮点数乘法器
1 阶码相加减
最高位异或得到符号位,指数位相加,阶码相加。 尾数和隐藏1进行拼接。
2 尾数相乘
相乘后位数为 乘数位数的两倍
3 规格化并进行舍入运算
4 判断溢出
浮点数的乘法运算的尾数不存在溢出,而只存在浮点数的阶码确定。
13 功耗
CMOS电路功耗主要由动态功耗和静态功耗组成,动态功耗又分为开关功耗、短路功耗两部分
静态功耗:静态功耗也称为待机功耗,包含有电路中晶体管的漏电流所导致的功耗
在CMOS电路中,静态功耗主要是漏电流引起的功耗。 与电压和亚阈值电流成正比。
动态功耗: 动态功耗包括:开关功耗或称为翻转功耗、短路功耗或者称为内部功耗;
翻转功耗 和 内部功耗。
开关功耗--- 翻转功耗:电路在开关过程中对输出节点的负载电容充放电所消耗的功耗。
它与电路的工作频率成正比,与负载电容成正比,与电压的平方成正比。
静态功耗: 电压和漏电流
电压角度 V:
(1)降低工作电压;
(2)多电压域;
(3)动态电压缩放DVS技术(处理器在不同工作模式下使用不同电压);\
(4)电源关断技术,power-gating;
电流角度 I_leak(漏电流):
(1)使用HVT高阈值晶体管,漏电流小;
(2)多阈值;
动态功耗: 和 电压、负载电容、工作时钟频率、信号翻转率、短
路电流有关;
电压角度:
(1)降低工作电压;
(2)多电压域;
(3)动态电压缩放DVS技术(处理器在不同工作模式下使用不同电压);
(4)电源关断技术,power-gating;
负载电容角度:与工艺有关
(1)按比例缩小集成度,降低器件电容;
(2)多芯片系统中,可以考虑多芯片封装,减低接口间电容;
(3)合理的布局布线;
工作时钟频率角度:\
(1)降低工作频率;\
(2)多时钟域;
(3)门控时钟,clock gating;
数据翻转率角度:
(1)使用格雷码等状态翻转比较少的编码;
(2)数据不操作说,保持上次的值,而不是强制置0或者置1;
(3)使用使能信号、片选信号,减少不必要的切换;
14 定点数的计算
补码定点小数的加减运算
加减是等效的,都需要进行符号位扩展,且扩展的是定点小数的整数位,
两个fix9_7相加或相减,结果是fix10_7,扩展的是整数位,小数位不变
x[9:0] 定点数--3位整数,7位小数。 y[5:0]定点数 --整数3bit,小数3bit。
y=x
assign y = x[9:3];
15 时序约束
时钟约束
常用指令:Create_clock、Create_generated_clock、derive pll_clocks、create_virtual_clock。
对时钟的约束,首先要明确,我们要约束的时钟有哪些,然后针对不同的时钟进行约束。下面针对不同类型的时钟,对其约束的指令作简要分析。
IO约束
IO的约束主要是指input_delay与output_delay这两种,编译软件(ISE/Quartus)是个很强大而又很傻的工具,在设计的时候,你务必要告诉他在FPGA外部的信号时序关系,他才能够知道怎么去优化内部的时序,以满足时序设计要求。
时序例外
时序例外一般用在clock与IO都约束后,还是不满足时序要求的情况下。主要包括以下几种情况:
1.多周期set_milticycle_path
2.不需要检测路径(常见,重要)set_false_path-----伪路径
3.常量与伪常量
4. 互斥的路径
5.组合电路延时,即逻辑不经过任何时钟处理就输出的情况。
多周期路径 --- 伪路径