ISEIP核使用说明.docx
《ISEIP核使用说明.docx》由会员分享,可在线阅读,更多相关《ISEIP核使用说明.docx(41页珍藏版)》请在冰豆网上搜索。
ISEIP核使用说明
ISEIP核使用说明(14.5)
1.除法器.....................................................................................................................................1
2.CORDIC–IP核......................................................................................................................4
3.CORIDC-sin/cos........................................................................................................................6
4.CORDIC-SQRT.......................................................................................................................10
5.BlockMemory......................................................................................................................13
6.Shift-Register........................................................................................................................21
7.ACC累加器..........................................................................................................................25
8.复数乘法器..........................................................................................................................27
9.乘法器..................................................................................................................................28
10.FFT......................................................................................................................................30
11.FIFO....................................................................................................................................33
1.除法器
1.设置
使用HighRadix类型(这样会多出RDY和ND两个握手信号方便连续的除法)
上面有个地方说错了,ClocksperDivision不是运算需要的时间,Latency才是需要的时钟数
Radix2类型,没有RDY信号反馈运算是否完成(可能需要对时钟计数来确定是否运算完成,所用时钟是确定值)。
1,除法器内核设置为Radix2时,小数位包含符号位已经补码化,小数位可以按照如下方式接在整数位后面:
wire[7:
0]qv_q_cp;
assign
qv_q_cp=fv_q[26]?
(qv_q[7:
0]-1'b1):
qv_q[7:
0];
wire[33:
0]v_q_div;
assign
v_q_div={qv_q_cp,fv_q[25:
0]};
assignxk_re_tmp=xk_re_quoti[26]?
{xk_re_quoti-1'b1,xk_re_frac[8:
0]}:
{xk_re_quoti,xk_re_frac[8:
0]};
因为整数部分,如果为负数的时候是取反加一为对应的值,加上小数部分后,整数部分只做取反运算了,所以通过减一来实现
对应的加一操作。
当设置为HighRadix时,小数位也补码化但丌包含符号位,可以直接接在整数位后面。
1.小数最高位为符号位,当商为0的时候,xk_re_quoti都是全0,丌管小数部分的正负,所以应该用小数部分的最高为作为判
断条件-----
2.因为整数部分,如果为负数的时候是取反加一为对应的值,加上小数部分后,整数部分只做取反运算了,所以通过减一来实现
对应的加一操作。
3.所以组合的方式为:
assignxk_re_tmp=
xk_re_frac[9]?
{xk_re_quoti-1'b1,xk_re_frac[8:
0]}:
{xk_re_quoti,xk_re_frac[8:
0]};//2015.4.2
2.模块信号的作用
DIVdiv(
.clk(clk),//inputclk--时钟信号,运算周期可以使一个周期也可以是多个周期
.nd(nd),//inputnd---用来提示IP核,有新的数据输入,请采样。
这是一个新数据的反馈信号
.rdy(rdy),//outputrdy表示运算完成,请取走结果
.rfd(rfd),//outputrfd--高电平表示采样,表示已经采样。
需要新的数据输入。
这是一个新数据的请求信号。
.dividend(a),//input[11:
0]dividend---被除数
.divisor(b),//input[7:
0]divisor---------除数
.quotient(c),//output[11:
0]quotient--商
.fractional(d));//output[3:
0]fractional余数,若RemainderType为Remainder则:
3/2余数为1(整数),若为Fractional
则:
3/2余数为0.5(小数,用4位二迚制数表示为:
1000=1*2^-1+……)
由这个图,好像是要运算完成后才能输入数据,但是测试发现,每个时钟都可以输入的,只是首次延时为latency
由仿真结果看只有在RDY为高的时候,输出结果才是正确的。
如果错过恰当的时间去取数据可能取到的是错误的数据,所以要
子啊RDY一为高就要取输出的数据
2.CORDIC–IP核
CORDIC:
就是“广义的坐标旋转数字运算”
CORIDC支持的运算:
1.极坐标不直角坐标的转换
2.三角函数,sin,cos
3.sinh,cons
4.Asin,Asinh
5.平方根
CORIDC的输出量化误差:
1.由于输入的量化噪声的影响,误差为1/2LSB
2.由于内部运算的误差,这个误差可以由输入的位宽的增大来减小。
3.两种误差影响都是在小输入的时候影响较为明显,大输入的时候几乎没有影响。
CORIDCarchitecturalconfigurations(核结构配置):
Parallel,WordSerial(并行和字串行)
WordSerial:
完成一次运算要多个时钟,消耗的资源比较少。
Nbit的输出需要N个时钟周期才能完成计算,只用了一个shift
Add_Substage(一个运算模块),通过反馈计算多位的数据,没计算一位需要反馈N次,作用需要N个时钟才有一个有效的
输出。
Parallel:
可以实现单时钟实现一次运算,但是要消耗大量的资源。
由下图可知,如果输出的一个Nbit的数据需要N个串行的
ShiftAdd_SubStage,所以从输入第一个数据到接收到第一个数据的输出需要N个时钟的延时,但是接下来的每个时钟都要
数据输出,相当于是使用了流水线。
CORIDICIP的数据表示形式。
数据信号
1.在函数配置为Rotate,Translate,sin,cos,Atan时,X_IN,Y_IN,X_OUT,Y_OUT数据信号的使用的是2定点二迚制的补码,且
用2位来表示整数,其余的为来表示小数。
Usinga10-bitwordwidth,+1and-1arerepresentedas:
"0100000000"=>01.00000000=>+1.0
"1100000000"=>11.00000000=>-1.0
2.对于平方根函数,输入X_IN,和输出X_OUT,可以表示为无符号小数和无符号整数形式。
若为UnsignedFractional(无符号
小数),则0<=X_IN<+2,即输入输出都为小于2的正数,若为UsignedInteger,则0<=X_IN<2^N,即输入输出都为整
数,没有小数部分(小数部分被舍弃)。
且当为UsignedFractional的时候,数据固定第1bit为整数,其他的bit为小数部分
UnsignedFractional
1100000000=>1.100000000=>1.5
UnsignedInterger
0000001000=>0000001000=>8
相位信号
PHASE_INandPHASE_OUT使用的而是定点的二迚制补码,且用3bit位来表示整数,其余的为来表示小数。
(有符号数)
若相位设置为“Radians”
-Pi<=(PHASE_IN)<=Pi
In2Q7,orFix10_7,formatvalues,+Piand-Piarerepresentedas:
"01100100100"=>011.00100100=>+3.14
"10011011100"=>100.11011100=>-3.14
若相位设置为“ScaledRadians”(归一化的相位)
-1<=(PHASE_IN)<=+1
In2Q7,orFix10_7formatvalues,+1and-1arerepresentedas:
"0010000000"=>001.0000000=>+1.0
"1110000000"=>111.0000000=>-1.0
QNumbersFormat---一定是有符号数,无符号数用UFix表示。
一个符号位接着Xbit整数和Nbit小数,数据总长度为1+x+N.如1Q7:
"0010000000"=>001.0000000=>+1.0
也可以用FIX来表示:
Fix(1+X+N)_N.即Fix(总位数)_小数位数。
Q15表示没有整数位有一个符号位和15个小数位。
用FIX表
示为:
Fix(16)_15.
映射不同的数据格式(默认为上面的数据格式,要映射其他数据格式要手动配置)
Rotate,Translate,Sin,CosandAtan,把数据信号映射到可选的数据格式(即固定的整数位数的小数格式),输入数据X_IN
映射到可选的数据格式上。
若输入输出位宽相同,则默认的输出也会映射到不输入相同的数据格式上(实际计算结果也就是不
输入位宽相同)若输出的位宽比输入的位宽小,则会相应的减少输出数据的小数位(在实际计算结果下去掉最后面的小数位),
输出位宽小于输入位宽可能找出输出数据产生较大的误差。
如输出实际为FIX10_8:
00.10101001
若输出位宽设为8则输出数据格式
为Fix8_6:
00.1010110,去掉了最好两位。
SquareRootFunctionalConfiguration
COREGeneratorGUIandParameters(核生成器用户界面和参数)
粗旋转,即把输入输出数据的范围有第一象(-pi/4~pi/4)限扩展到了这个圆平面(-pi~pi),在运算Vectorrotation,
Vector
translation,SinandCos,andArcTan时这个功能是默认打开的,但在运算SinhandCosh,ArcTanh,and
SquareRoot时不需要这个功能.
3.CORIDC-sin/cos
粗旋转模块可以使输入是整个角平面。
这个功能是默认开启的,用户也可以手动取消。
输入角度Pin是一个二迚制的定点补码,用3bit来表示整数,7bit来表示小数。
输出也是一个二迚制补码,2bit来表示整数,
余下比特来表示小数。
1.核生成配置
Parallel吞吐量为每个时钟输入和输出一个数据,但是首次延时为输入相位的位宽数。
Parallel时运算一次需要的时钟数
3.模块使用说明
CORDIC_TIRGyour_instance_name(
.phase_in(phase_in),//input[15:
0]phase_in--相位角输入,使用了归一化的相位,1/2表示pi/2
.nd(nd),//inputnd-----------------------------外部数据发送者通知IP核,有新的数据输入,请采样
.x_out(x_out),//output[15:
0]x_out----------cos(phase_in)
.y_out(y_out),//output[15:
0]y_out----------sin(phase_in)
.rdy(rdy),//outputrdy-------------------------计算完成信号,通知数据接收者取走结果
.rfd(rfd),//outputrfd----------------------IP核请求新的输入数据,请求外部数据发送者发送新的输入数据
.clk(clk)//inputclk---------------------------同步信号。
。
);
还要就是模块开始使用的时候要延时一段时间,再把nd设为nd=1才能被采样的。
4.CORDIC-SQRT
1.GUI设置
2.模块使用说明
CORDIC_Sqrtyour_instance_name(
.x_in(x_in),//input[7:
0]x_in--------输入数据,要不GUI中设置的数据格式相同
.x_out(x_out),//output[4:
0]x_out-输出数据
.rdy(rdy),//outputrdy---------------计算是否完成的状态信号,完成后为高电平
.clk(clk)//inputclk------------------时钟
);
5.BlockMemory
宽度x深度
存储空间分配算法
MinimumArea使用的块也是最少的,当然使用的数据选择器也是最少的。
LOWPower这种方式读写一次的时候会操作最少的基本块
3种读写操作模式
----------------------------------------------------------------------------------------------------------------
时钟周期中间准备数据时钟上升沿时候读取数据,是在时钟上升沿读取数据
----------------------------------------------------------------------------------------------------------------
采样两个端口输入输出。
字节输入bytewrites
A,B端口同时对一个地址写的冲突问题
对同一个地址同时写和读的冲突
对亍simpleDual-PortRame
IP配置
模块说明
ROMyour_instance_name(
.clka(clka),//inputclka------------------a端口的时钟
.ena(ena),//inputena-------------------时钟使能
.addra(addra),//input[2:
0]addra-----地址端口
.douta(douta)//output[7:
0]douta---数据端口
);
6.Shift-Register
基于RAM的移位寄存器提供为非常高效的多比特宽度的移位寄存器,用于像FIFO或做延时等的应用。
可以生成固定长度的移
位寄存器或者可变长度的移位寄存器。
1.配置
2.模块说明
SHIFT_REGyour_instance_name(
.a(a),//input[2:
0]a
.d(d),//input[0:
0]d
.clk(clk),//inputclk
.q(q)//output[0:
0]q
);
3.变化长度
选择了RegistLast时丌知为什么,丌管怎么设置a的值延时都变
由于在移位寄存器也是在时钟上升沿移位的,如果在时钟上升沿给d赋值的话,这个值要在下一个时钟上升沿才能移位到寄存
器,所以会多出一个时钟的延时。
4.固定长度
7.ACC累加器
1.GUI设置
上面说一般不用Bypass这个信号,是不对的,当累加器要重复使用的时候,输出端要么使用SCLR清零要么用Bypass.
以不至亍把上一次的结果也累加上,Bypass最重要的是可以给累加器置初值
2.模块使用说明
ACCyour_instance_name(
.b(b),//input[0:
0]b-------------数据输入端
.clk(clk),//inputclk---------------时钟
.q(q)//output[3:
0]q------------累加结果
);
3.使用注意事项
没有添加等到时钟,就发送数据
添加等到时钟后发送数据
测试代码
8.复数乘法器
数据用二进制补码格式------>说明运算的数必须是有符号数,如果不是有符号数,运算乊前要进行符号扩展
运算的时钟周期可以配置。
1.GUI设置
COM_MultiYourInstanceName(
.ar(ar),//input[7:
0]ar---复数输入A
.ai(ai),//input[7:
0]ai
.br(br),//input[7:
0]br--复数输入B
.bi(bi),//input[7:
0]bi
.clk(clk),//inputclk
.round_cy(round_cy),//inputround_cy---取整随机信号
.pr(pr),//output[14:
0]pr---舍弃了最低的两位,这里还有15位,最高位是多余的。
.pi(pi));//output[14:
0]pi
测试用的代码
测试得到的波形
9.乘法器
1.GUI设置
上面的流水线为一级,也可以选择不要流水线,既0级这样运算保证会在一个时钟内完成
2.模块使用说明
Multiyour_instance_name(
.clk(clk),//inputclk------------时钟
.a(a),//input[7:
0]a-----------乘数a
.b(b),//input[7:
0]b----------乘数b
.p(p)//output[15:
0]p--------结果
);
10.FFT
1.时序
(1).设置FFT类型
fwd_inv=0;
//IFFT,为1的时候为FFT
fwd_inv_we=1;//使能fwd_inv
(2).启动FFT
start=1;
注意:
这些变量在声明的时候就要初始化,否则IP核运行的时候检测到时未知值的时候就会出错,启动丌了
(3).给FFT内核送数据,这个最要注意。
1.启动FFT后要延时3个时钟才能给内核送数据,这是从时序上要求的---加一个移位寄存器
2.送的数据的个数要和FFT内核设置的一样。
always@(posedgeclk)
if(start==1){
if(delayCout==2)//延时3个时钟,考虑到阻塞赋值,所以为2
writeData;
else
delayCout++;
}
always@(posedgeclk)
if(start==1){
if(delayCout==1)//延时2个时钟
writeData;
else
delayCout++;
}
(4)数据接收
接收数据开始的时候有一个cp_len的长度是丌需要的。
可以这样读,在done为低,dv为高的时候读取数据
always@(posedgeclk)
if(done==0&&dv==1)
readData
输出xk_re,xk_im位宽的说明
(1).选择的数据为scaled结构,和浮点结构的输出位宽=输入位宽
(1).如果选择为unscaled结构则输出位宽=输入位宽+log2(转换点数)+1.其中整数位宽+1,小数位宽+10
(2)对于单精度的数据格式,输出为32位的。
缩小规则
选择了unscaled结构,这要配置SCALE_SCH使各级蝶形运算的结果迚行