創(chuàng)業(yè)網(wǎng)站推廣怎么做seo最新優(yōu)化技術(shù)
平臺(tái):Vivado2018.3.
芯片:xcku115-flva1517-2-i (active)
最近學(xué)習(xí)使用了xilinx除法器,在使用過(guò)程中出現(xiàn)了很多次除法器的結(jié)果和我預(yù)計(jì)的結(jié)果不一致,特此記錄學(xué)習(xí)一下。
參考文件:pg151.下載地址
pg151-div-gen.pdf ? 查看器 ? AMD 自適應(yīng)計(jì)算文檔門(mén)戶 (xilinx.com)
IP配置說(shuō)明
Xilinx除法器擁有三種模式
Radix2: The implementation uses FPGA logic primitives (registers and LUTs). The Radix2 solution does not use DSP or block RAM primitives.使用FPGA寄存器和LUT資源,不使用dsp和ram資源。被除數(shù)位寬2-64,除數(shù)位寬2-64。支持無(wú)符號(hào)或二進(jìn)制補(bǔ)碼有符號(hào)數(shù)。結(jié)果可以配置為商和余數(shù),商和小數(shù)。
High radix:該實(shí)現(xiàn)使用DSP切片和塊RAM。被除數(shù)位寬2-64,除數(shù)位寬2-64。支持有符號(hào)數(shù)。結(jié)果可以配置為商和小數(shù)。
Lutmult:使用了DSP,RAM,以及LutMult資源。被除數(shù)位寬2-17,除數(shù)位寬2-17(被除數(shù)和除數(shù)位寬之和限制在23位以內(nèi))支持無(wú)符號(hào)或二進(jìn)制補(bǔ)碼有符號(hào)數(shù)。結(jié)果為商和余數(shù)。
在學(xué)習(xí)此IP之前,需要先復(fù)習(xí)一下二進(jìn)制數(shù)的表示。
1、?? ?無(wú)符號(hào)二進(jìn)制數(shù)據(jù)unsigned。
無(wú)符號(hào)數(shù)據(jù)。例如8位無(wú)符號(hào)數(shù)就代表的十進(jìn)制數(shù)的范圍為[0,2^n-1]。
2、?? ?有符號(hào)的二進(jìn)制數(shù)據(jù)的表示signed。
有符號(hào)數(shù)據(jù)。除數(shù)據(jù)位外最高位代表符號(hào)位。例如8位的有符號(hào)數(shù)據(jù)的數(shù)值范圍為[-128,127]。我們知道計(jì)算機(jī)中的數(shù)據(jù)都是用補(bǔ)碼來(lái)參與運(yùn)算。那么計(jì)算機(jī)里面為何要使用補(bǔ)碼來(lái)計(jì)算呢?計(jì)算機(jī)中使用補(bǔ)碼就可以將原本的減法轉(zhuǎn)換為加法運(yùn)算。
例如
1,二進(jìn)制補(bǔ)碼為00000001.(代表無(wú)符號(hào)數(shù)為1)
-1,二進(jìn)制補(bǔ)碼為11111111.(代表無(wú)符號(hào)數(shù)為255)
-2,二進(jìn)制補(bǔ)碼為11111110.(代表無(wú)符號(hào)數(shù)為254)
計(jì)算機(jī)計(jì)算
1+(-1),即1+255=256,(100000000),低8位就是0的補(bǔ)碼00000000
-1+(-2),及255+254=509,(111111101),低八位就是-3的補(bǔ)碼11111101
是不是很方便,所有的減法運(yùn)算都改變成了加法運(yùn)算。
Dividend channel被除數(shù),
Divisor channel除數(shù)
Output channel
Remander type:
remainder余數(shù)模式。
Fractional小數(shù)模式。
Fractional width小數(shù)位寬
設(shè)置IP的模式。和輸出延時(shí)。
對(duì)該IP仿真。
仿真tb
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/02/04 16:05:55
// Design Name:
// Module Name: vtf_div_top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module vtf_div_top;
reg signed[15:0] dividend_tdata ;
reg dividend_tvalid ;
reg signed[15:0] divisor_tdata ;
reg divisor_tvalid ;
//
reg clk ;
reg rst_n ;div_top div_top(
//.dividend_tdata (dividend_tdata ),.dividend_tvalid (dividend_tvalid ),.divisor_tdata (divisor_tdata ),.divisor_tvalid (divisor_tvalid ),
//.clk (clk ),.rst_n (rst_n ));//------------------------------------------------------//復(fù)位參數(shù)//------------------------------------------------------integer i;//設(shè)置復(fù)位參數(shù)initialbegin$display("[%t] : reset begin...", $realtime);rst_n = 0;for( i=0 ; i<100 ; i=i+1)begin@(posedge clk );end$display("[%t] : reset stop...", $realtime);rst_n = 1;endparameter delay_cnt = 500;reg [15:0] data_value;reg data_en;reg delay_over;//------------------------------------------------------initial beginclk = 0;dividend_tdata =0;divisor_tdata =0;dividend_tvalid =0;divisor_tvalid =0;wait(rst_n == 1);$display("[%t] : div start...", $realtime);delay(delay_over,delay_cnt);//調(diào)用等待任務(wù)//------------------------------------------------------//調(diào)任務(wù)data_gen(data_value,16'd10);//產(chǎn)生被除數(shù)dividend_tdata = data_value;data_gen(data_value,16'd3);//產(chǎn)生除數(shù)
// data_gen(data_value,-16'd3);//產(chǎn)生除數(shù)divisor_tdata = data_value;data_valid(data_en);dividend_tvalid = data_en;divisor_tvalid = data_en;data_uvalid(data_en);dividend_tvalid = data_en;divisor_tvalid = data_en;delay(delay_over,delay_cnt);//調(diào)用等待任務(wù)$display("[%t] : div end...", $realtime);$finish(2); end//------------------------------------------------------//任務(wù),輸出一個(gè)數(shù)據(jù)//------------------------------------------------------task data_gen;output [15:0] data_out;input [15:0] data_in;begindata_out = data_in;endendtask//------------------------------------------------------//任務(wù),數(shù)據(jù)有效//------------------------------------------------------task data_valid;output data_en;beginrepeat(1)@(posedge clk);data_en = 1;endendtask//------------------------------------------------------//任務(wù),數(shù)據(jù)無(wú)效//------------------------------------------------------task data_uvalid;output data_en;beginrepeat(1)@(posedge clk);data_en = 0;endendtask//------------------------------------------------------//任務(wù),延時(shí)模塊//------------------------------------------------------task delay;output delay_over;input [31:0] delay_in;beginrepeat(delay_in)@(posedge clk);delay_over = 1;endendtaskalways#5 clk = ~clk;endmodule
余數(shù)模式
10/-3=-3余數(shù)為1
整數(shù)位為-3,余數(shù)位1
小數(shù)模式
10/3≈3.333333
輸出的小數(shù)將量化到2^15次方上。最高位表示符號(hào)位。
3.3333333
整數(shù)位為高16位。為fffd,代表-3
小數(shù)0.333333量化到2^15次方為10,922。
小數(shù)位為低16位。為2aaa(10922),還原回去0.3333129,有量化誤差。原因?yàn)榱炕粚挒?5位。
10/-3≈-3.333333
輸出的小數(shù)將量化到2^15次方上。最高位表示符號(hào)位。
-3.3333333
整數(shù)位為高16位。為fffd,代表-3
小數(shù)-0.333333量化到2^15次方為-10,922。
小數(shù)位為低16位。為d556(-10922),還原回去-0.3333129。
值得注意的是當(dāng)IP的模式High radix時(shí)。
小數(shù)表示已經(jīng)沒(méi)有了最高位的符號(hào)位。會(huì)將得到的結(jié)果直接量化到設(shè)置的小數(shù)位寬上。
High radix時(shí)10/4=2.5的仿真
High radix時(shí)10/-4=-2.5的仿真
計(jì)算結(jié)果
整數(shù)部分fffd,為-3。
小數(shù)部分8000,沒(méi)有符號(hào)位,為0.5
(計(jì)算結(jié)果加起來(lái)為-2.5,目前沒(méi)有在pg151內(nèi)找到相關(guān)說(shuō)明)
High radix時(shí)10/-6=-1.666666的仿真
計(jì)算結(jié)果
整數(shù)部分fffe,為-2。
小數(shù)部分5555,沒(méi)有符號(hào)位,為0.3333
(計(jì)算結(jié)果加起來(lái)為-1.6666)
High radix時(shí)10/6=1.666666的仿真
計(jì)算結(jié)果
整數(shù)部分0001,為1。
小數(shù)部分aaab,沒(méi)有符號(hào)位,為0.6666
(計(jì)算結(jié)果加起來(lái)為1.6666)