ISE IP核使用说明DOC.docx

上传人:b****3 文档编号:3456874 上传时间:2022-11-23 格式:DOCX 页数:38 大小:981.39KB
下载 相关 举报
ISE IP核使用说明DOC.docx_第1页
第1页 / 共38页
ISE IP核使用说明DOC.docx_第2页
第2页 / 共38页
ISE IP核使用说明DOC.docx_第3页
第3页 / 共38页
ISE IP核使用说明DOC.docx_第4页
第4页 / 共38页
ISE IP核使用说明DOC.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

ISE IP核使用说明DOC.docx

《ISE IP核使用说明DOC.docx》由会员分享,可在线阅读,更多相关《ISE IP核使用说明DOC.docx(38页珍藏版)》请在冰豆网上搜索。

ISE IP核使用说明DOC.docx

ISEIP核使用说明DOC

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使各级蝶形运算的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1