建設(shè)哪里有百度seo按天計(jì)費(fèi)
引言
????????浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)是一種常見的數(shù)值轉(zhuǎn)換技術(shù),用于將浮點(diǎn)數(shù)表示轉(zhuǎn)換為定點(diǎn)數(shù)表示。浮點(diǎn)數(shù)表示采用指數(shù)和尾數(shù)的形式,可以表示較大范圍的數(shù)值,但存在精度有限的問題。而定點(diǎn)數(shù)表示則采用固定小數(shù)點(diǎn)位置的形式,具有固定的精度和范圍。在某些應(yīng)用中,特別是在嵌入式系統(tǒng)和數(shù)字信號處理領(lǐng)域,使用定點(diǎn)數(shù)表示可以更加高效地進(jìn)行計(jì)算。然而,很多算法和庫函數(shù)都是基于浮點(diǎn)數(shù)實(shí)現(xiàn)的,因此需要將浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)才能在這些系統(tǒng)中使用。浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)的背景涉及到浮點(diǎn)數(shù)和定點(diǎn)數(shù)的表示方法、精度要求以及性能考慮等方面。在轉(zhuǎn)換過程中需要考慮相應(yīng)的位寬、小數(shù)點(diǎn)位置、舍入方式等參數(shù)的選擇,以保證轉(zhuǎn)換后的定點(diǎn)數(shù)能夠準(zhǔn)確地表示原始浮點(diǎn)數(shù),并滿足應(yīng)用的要求。此外,浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)也可能涉及到溢出、舍入誤差、舍入方式選擇等問題。因此,在實(shí)際應(yīng)用中需要仔細(xì)分析和評估轉(zhuǎn)換算法的性能和精度,并根據(jù)具體的應(yīng)用場景進(jìn)行調(diào)整和優(yōu)化。
背景
????????浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)的概念和技術(shù)并沒有一個(gè)具體的發(fā)明者或起源人。它是在計(jì)算機(jī)科學(xué)和數(shù)字信號處理等領(lǐng)域的發(fā)展過程中逐漸形成和應(yīng)用的。浮點(diǎn)數(shù)和定點(diǎn)數(shù)的概念最早可以追溯到計(jì)算機(jī)科學(xué)的早期發(fā)展階段。在計(jì)算機(jī)領(lǐng)域的先驅(qū)們,如馮·諾依曼、約翰·馮·諾伊曼、阿蘭·圖靈等,對于數(shù)字表示和計(jì)算方法進(jìn)行了深入研究,為后來的浮點(diǎn)數(shù)和定點(diǎn)數(shù)概念的發(fā)展奠定了基礎(chǔ)。隨著計(jì)算機(jī)技術(shù)的快速發(fā)展,浮點(diǎn)數(shù)和定點(diǎn)數(shù)的表示方法和轉(zhuǎn)換技術(shù)也得到了更多的研究和應(yīng)用。在數(shù)字信號處理領(lǐng)域,特別是在嵌入式系統(tǒng)和通信領(lǐng)域,浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)被廣泛應(yīng)用于各種算法和信號處理任務(wù)。因此,浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)作為一種技術(shù)和方法,并沒有一個(gè)特定的發(fā)明者或起源人,而是在計(jì)算機(jī)科學(xué)和數(shù)字信號處理領(lǐng)域的長期積累和發(fā)展中形成的。不同的研究者和工程師在不同的應(yīng)用場景中對該技術(shù)進(jìn)行了不同的改進(jìn)和優(yōu)化,推動了該技術(shù)的應(yīng)用和發(fā)展。
軟核開發(fā)
module top (input wire clk,input wire rst_n,input The_uart_en_w,input [31:0] The_uart_data
);wire [31:0] B;wire [31:0] C;wire valid;wire complete;wire [23:0] intpart; //結(jié)果整數(shù)部分wire [23:0] decpart; //結(jié)果小數(shù)部分assign B = 32'd0;decimals u_decimals(.clk (clk ),.rst_n (rst_n ),.valid (valid ), //轉(zhuǎn)換開始使能.symbol (C[31] ), //符號位.exponent (C[30:23] ), //階碼.trail (C[22:0] ), //尾數(shù).intpart (intpart ), //結(jié)果整數(shù)部分.decpart (decpart ), //結(jié)果小數(shù)部分.complete (complete ) //執(zhí)行完成信號
);floatingpoint32 u_floatingpoint32(.clk (clk ),.rst_n (rst_n ),.en (The_uart_en_w ),//數(shù)據(jù)轉(zhuǎn)換開始.A (The_uart_data ),.B (B ),.C (C ),.valid (valid )
); endmodule
module decimals (input wire clk,input wire rst_n,input valid,input symbol, //符號位input [7:0] exponent, //階碼input [22:0] trail, //尾數(shù)output reg [23:0] intpart, //結(jié)果整數(shù)部分output reg [23:0] decpart, //結(jié)果小數(shù)部分output reg complete //執(zhí)行完成信號
);//------------------------------------------------------------------------------
//----------- Registers decpartlarations -------------------------------------------
//------------------------------------------------------------------------------ reg [3:0] state = 0;reg [5:0] ctate = 0;reg [2:0] mimi = 0;reg [2:0] ter = 0;reg [2:0] trai_ter = 0;reg [7:0] exponent_reg_d0 = 0; //寄存1reg [22:0] trail_reg_d0 = 0; //寄存1reg [23:0] trail_reg_d1 = 0; //寄存2reg [23:0] trail_reg_d2 = 0; //寄存2reg [23:0] trail_reg_d3 = 0; //寄存3reg [23:0] trail_reg_d4 = 0; //寄存4reg trai1_one = 0; //單位寄存reg trai2_one = 0; //單位寄存reg trai3_one = 0; //單位寄存reg trai4_one = 0; //單位寄存reg trai5_one = 0; //單位寄存reg trai6_one = 0; //單位寄存reg trai7_one = 0; //單位寄存reg trai8_one = 0; //單位寄存reg trai9_one = 0; //單位寄存reg trail0_one = 0; //單位寄存reg trail1_one = 0;reg trail2_one = 0;reg trail3_one = 0;reg trail4_one = 0;reg trail5_one = 0;reg trail6_one = 0;reg trail7_one = 0;reg trail8_one = 0;reg trail9_one = 0;reg trai20_one = 0;reg trai21_one = 0;reg trai22_one = 0;reg trai23_one = 0;reg trai24_one = 0;reg chic = 0;reg start = 0; //啟動判斷 reg etart = 0; //啟動判斷reg judge = 0; //判斷m有多少零reg [5:0] cnt = 0;reg [5:0] sum = 0;reg [5:0] com = 0;reg [5:0] count = 0;reg [20:0] bucket = 0;reg [5:0] select = 0;reg [20:0] cno = 0;reg [4:0] ltate = 0;reg a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;reg a10,a11,a12,a13,a14,a15,a16,a17;reg a18,a19 = 0;reg ltate_done;reg [35:0] cno_ride = 0;reg [23:0] cno_ride_reg = 0;reg s0,s1 = 0;reg g0,g1 = 0;//------------------------------------------------------------------------------
//----------- Wires decpartlarations -----------------------------------------------
//------------------------------------------------------------------------------wire pos_valid;wire pos_chic;//------------------------------------------------------------------------------
//----------- Local Parameters -------------------------------------------------
//------------------------------------------------------------------------------parameter idle = 'd0; //初始化狀態(tài)parameter expo = 'd1; //階碼計(jì)算parameter trai = 'd2; //尾碼計(jì)算parameter trai_1 = 'd3; //尾碼計(jì)算1parameter trai_2 = 'd4; //尾碼計(jì)算2parameter trai_3 = 'd5; //尾碼計(jì)算3parameter decparti = 'd6; //數(shù)據(jù)結(jié)合parameter resu = 'd7; //結(jié)果parameter stop = 'd8; //結(jié)束//------------------------------------------------------------------------------
//----------- Assign/Always Blocks ---------------------------------------------
//------------------------------------------------------------------------------assign pos_valid = s0 & (!s1);assign pos_chic = g0 & (!g1);always @ (posedge clk or negedge rst_n) begin if (!rst_n)begin s0 <= 'd0;s1 <= 'd0;end else begin s0 <= valid;s1 <= s0;end
end always @ (posedge clk or negedge rst_n) begin if (!rst_n)begin g0 <= 'd0;g1 <= 'd0;end else begin g0 <= chic;g1 <= g0;end
end // 判斷多少 0
always @ (posedge clk or negedge rst_n) begin if (!rst_n)begin judge <= 1'b0;mimi <= 3'd0;ter <= 3'd0;cnt <= 6'd0;end else case (mimi)0:begin if (start)mimi <= 3'd1;else mimi <= mimi;end 1:begin if (ter == 5)begin ter <= 3'd0;mimi <= 3'd2;end else begin ter <= ter + 1'b1;cnt <= ctate;end end 2:begin if (ter == 5)begin ter <= 3'd0;mimi <= 3'd0;judge <= 1'b0;end else begin judge <= 1'b1;ter <= ter + 1'b1;end end default : ;
endcase
end always @ (*) begin if (trail[0] == 1) ctate = 0; else if (trail[1] == 1) ctate = 1; else if (trail[2] == 1) ctate = 2; else if (trail[3] == 1) ctate = 3; else if (trail[4] == 1) ctate = 4; else if (trail[5] == 1) ctate = 5; else if (trail[6] == 1) ctate = 6; else if (trail[7] == 1) ctate = 7; else if (trail[8] == 1) ctate = 8;else if (trail[9] == 1) ctate = 9;else if (trail[10]== 1) ctate = 10;else if (trail[11]== 1) ctate = 11;else if (trail[12]== 1) ctate = 12;else if (trail[13]== 1) ctate = 13;else if (trail[14]== 1) ctate = 14;else if (trail[15]== 1) ctate = 15;else if (trail[16]== 1) ctate = 16;else if (trail[17]== 1) ctate = 17;else if (trail[18]== 1) ctate = 18;else if (trail[19]== 1) ctate = 19;else if (trail[20]== 1) ctate = 20;else if (trail[21]== 1) ctate = 21;else if (trail[22]== 1) ctate = 22;
end always @ (posedge clk or negedge rst_n) begin if (!rst_n)begin intpart <= 'd0;decpart <= 'd0;exponent_reg_d0 <= 'd0;trail_reg_d0 <= 'd0;start <= 'd0;sum <= 'd0;trai1_one <= 'd0; //單位寄存trai2_one <= 'd0; //單位寄存trai3_one <= 'd0; //單位寄存trai4_one <= 'd0; //單位寄存trai5_one <= 'd0; //單位寄存trai6_one <= 'd0; //單位寄存trai7_one <= 'd0; //單位寄存trai8_one <= 'd0; //單位寄存trai9_one <= 'd0; //單位寄存trail0_one <= 'd0; //單位寄存trail1_one <= 'd0;trail2_one <= 'd0;trail3_one <= 'd0;trail4_one <= 'd0;trail5_one <= 'd0;trail6_one <= 'd0;trail7_one <= 'd0;trail8_one <= 'd0;trail9_one <= 'd0;trai20_one <= 'd0;trai21_one <= 'd0;trai22_one <= 'd0;trai23_one <= 'd0;trai24_one <= 'd0;trail_reg_d1 <= 'd0;trail_reg_d2 <= 'd0;count <= 'd0;trail_reg_d3 <= 'd0;trail_reg_d4 <= 'd0;sum <= 'd0;chic <= 'd0;cno_ride <= 'd0;cno_ride_reg <= 'd0;com <= 'd0;state <= idle;complete <= 'd0;trai_ter <= 'd0;end else case (state)idle:begin if (pos_valid)begin trai1_one <= 'd0; //單位寄存trai2_one <= 'd0; //單位寄存trai3_one <= 'd0; //單位寄存trai4_one <= 'd0; //單位寄存trai5_one <= 'd0; //單位寄存trai6_one <= 'd0; //單位寄存trai7_one <= 'd0; //單位寄存trai8_one <= 'd0; //單位寄存trai9_one <= 'd0; //單位寄存trail0_one <= 'd0; //單位寄存trail1_one <= 'd0;trail2_one <= 'd0;trail3_one <= 'd0;trail4_one <= 'd0;trail5_one <= 'd0;trail6_one <= 'd0;trail7_one <= 'd0;trail8_one <= 'd0;trail9_one <= 'd0;trai20_one <= 'd0;trai21_one <= 'd0;trai22_one <= 'd0;trai23_one <= 'd0;trai24_one <= 'd0;intpart <= 'd0;decpart <= 'd0;exponent_reg_d0 <= 'd0;trail_reg_d0 <= 'd0;start <= 'd0;etart <= 'd0;sum <= 'd0;count <= 'd0;trail_reg_d1 <= 'd0;trail_reg_d2 <= 'd0;trail_reg_d3 <= 'd0;trail_reg_d4 <= 'd0;cno_ride <= 'd0;cno_ride_reg <= 'd0;com <= 'd0;state <= expo;complete <= 'd0;trai_ter <= 'd0;end else begin complete <= 'd0;state <= idle;end end expo:begin if ( exponent >= 127 )begin state <= trai;exponent_reg_d0 <= exponent - 127;end else state <= idle;end trai:begin start <= 1'd1;if (judge) begin //刪除后面0trail_reg_d0 <= trail>>cnt;start <= 1'd0; state <= trai_1;sum <= 23-cnt;end else state <= trai;end trai_1:begin if (trai_ter == 5)begin trai_ter <= 3'd0;state <= trai_2;end else begin trai1_one <= 1'b1;trai2_one <= trail_reg_d0[22-cnt];trai3_one <= trail_reg_d0[21-cnt];trai4_one <= trail_reg_d0[20-cnt];trai5_one <= trail_reg_d0[19-cnt];trai6_one <= trail_reg_d0[18-cnt];trai7_one <= trail_reg_d0[17-cnt];trai8_one <= trail_reg_d0[16-cnt];trai9_one <= trail_reg_d0[15-cnt];trail0_one <= trail_reg_d0[14-cnt];trail1_one <= trail_reg_d0[13-cnt];trail2_one <= trail_reg_d0[12-cnt];trail3_one <= trail_reg_d0[11-cnt];trail4_one <= trail_reg_d0[10-cnt];trail5_one <= trail_reg_d0[9 -cnt];trail6_one <= trail_reg_d0[8 -cnt];trail7_one <= trail_reg_d0[7 -cnt];trail8_one <= trail_reg_d0[6 -cnt];trail9_one <= trail_reg_d0[5 -cnt];trai20_one <= trail_reg_d0[4 -cnt];trai21_one <= trail_reg_d0[3 -cnt];trai22_one <= trail_reg_d0[2 -cnt];trai23_one <= trail_reg_d0[1 -cnt];trai24_one <= trail_reg_d0[0 -cnt];state <= trai_1;trai_ter <= trai_ter + 1'b1;end endtrai_2:begin if (count == exponent_reg_d0) begin trail_reg_d2 <= trail_reg_d1;if (trail_reg_d2 == trail_reg_d1)begin state <= trai_3;count <= count + 'd1;end else trail_reg_d2 <= trail_reg_d1;end else if (count <= exponent_reg_d0) count <= count + 'd1;case (count)0 : trail_reg_d1[exponent_reg_d0 - count] <= trai1_one;1 : trail_reg_d1[exponent_reg_d0 - count] <= trai2_one;2 : trail_reg_d1[exponent_reg_d0 - count] <= trai3_one;3 : trail_reg_d1[exponent_reg_d0 - count] <= trai4_one;4 : trail_reg_d1[exponent_reg_d0 - count] <= trai5_one;5 : trail_reg_d1[exponent_reg_d0 - count] <= trai6_one;6 : trail_reg_d1[exponent_reg_d0 - count] <= trai7_one;7 : trail_reg_d1[exponent_reg_d0 - count] <= trai8_one;8 : trail_reg_d1[exponent_reg_d0 - count] <= trai9_one;9 : trail_reg_d1[exponent_reg_d0 - count] <= trail0_one;10: trail_reg_d1[exponent_reg_d0 - count] <= trail1_one;11: trail_reg_d1[exponent_reg_d0 - count] <= trail2_one;12: trail_reg_d1[exponent_reg_d0 - count] <= trail3_one;13: trail_reg_d1[exponent_reg_d0 - count] <= trail4_one;14: trail_reg_d1[exponent_reg_d0 - count] <= trail5_one;15: trail_reg_d1[exponent_reg_d0 - count] <= trail6_one;16: trail_reg_d1[exponent_reg_d0 - count] <= trail7_one;17: trail_reg_d1[exponent_reg_d0 - count] <= trail8_one;18: trail_reg_d1[exponent_reg_d0 - count] <= trail9_one;19: trail_reg_d1[exponent_reg_d0 - count] <= trai20_one;20: trail_reg_d1[exponent_reg_d0 - count] <= trai21_one;21: trail_reg_d1[exponent_reg_d0 - count] <= trai22_one;22: trail_reg_d1[exponent_reg_d0 - count] <= trai23_one;23: trail_reg_d1[exponent_reg_d0 - count] <= trai24_one;default: ;endcase end trai_3:begin if (count == sum+1)begin state <= decparti;trail_reg_d4 <= trail_reg_d3;com <= sum - exponent_reg_d0;end else if ((count > exponent_reg_d0)&&(count<=sum))count <= count + 'd1;case (count)0 : trail_reg_d3[sum] <= trai1_one;1 : trail_reg_d3[sum-1] <= trai2_one;2 : trail_reg_d3[sum-2] <= trai3_one;3 : trail_reg_d3[sum-3] <= trai4_one;4 : trail_reg_d3[sum-4] <= trai5_one;5 : trail_reg_d3[sum-5] <= trai6_one;6 : trail_reg_d3[sum-6] <= trai7_one;7 : trail_reg_d3[sum-7] <= trai8_one;8 : trail_reg_d3[sum-8] <= trai9_one;9 : trail_reg_d3[sum-9] <= trail0_one;10: trail_reg_d3[sum-10]<= trail1_one;11: trail_reg_d3[sum-11]<= trail2_one;12: trail_reg_d3[sum-12]<= trail3_one;13: trail_reg_d3[sum-13]<= trail4_one;14: trail_reg_d3[sum-14]<= trail5_one;15: trail_reg_d3[sum-15]<= trail6_one;16: trail_reg_d3[sum-16]<= trail7_one;17: trail_reg_d3[sum-17]<= trail8_one;18: trail_reg_d3[sum-18]<= trail9_one;19: trail_reg_d3[sum-19]<= trai20_one;20: trail_reg_d3[sum-20]<= trai21_one;21: trail_reg_d3[sum-21]<= trai22_one;22: trail_reg_d3[sum-22]<= trai23_one;23: trail_reg_d3[sum-23]<= trai24_one;default :;endcase end decparti:begin chic <= 'd1;if (ltate_done)begin chic <= 'd0;cno_ride <= cno*1000; //擴(kuò)展1000倍state <= resu;end else state <= state;end resu:begin cno_ride_reg <= cno_ride>>20;state <= stop;end stop:begin count <= 'd0;intpart <= trail_reg_d2;decpart <= cno_ride_reg;complete <= 'd1;state <= idle;end default: ;endcase
end always @ (*) begin case (select)// 小數(shù)放大 33554432 倍 (25個(gè))0: bucket = 524288; //0.51: bucket = 262144; //0.252: bucket = 131072; //0.1253: bucket = 65536; //0.06254: bucket = 32768; //0.031255: bucket = 16384; //0.0156256: bucket = 8192; //0.00781257: bucket = 4096; //0.003906258: bucket = 2048; //0.0019531259: bucket = 1024; //0.000976562510:bucket = 512; //0.0004882812511:bucket = 256; //0.00024414062512:bucket = 128; //0.000122070312513:bucket = 64; //0.0000610351562514:bucket = 32; //0.00003051757812515:bucket = 16; //0.000015258789062516:bucket = 8; //7.62939453125e-617:bucket = 4;18:bucket = 2;19:bucket = 1;20:bucket = 0;default:;endcase
end always @ (posedge clk or negedge rst_n) begin if (!rst_n)begin cno <= 'd0;select <= 'd20;ltate <= 'd0;a0 <= 'd0;a1 <= 'd0;a2 <= 'd0;a3 <= 'd0;a4 <= 'd0;a5 <= 'd0;a6 <= 'd0;a7 <= 'd0;a8 <= 'd0;a10 <= 'd0;a11 <= 'd0;a12 <= 'd0;a13 <= 'd0;a14 <= 'd0;a15 <= 'd0;a16 <= 'd0;a17 <= 'd0;a18 <= 'd0;a19 <= 'd0;ltate_done <= 'd0;end else case (ltate)//8'b1000_1100;0: begin if (pos_chic)begin cno <= 'd0;select <= 'd20;ltate <= 'd1;a0 <= 'd0;a1 <= 'd0;a2 <= 'd0;a3 <= 'd0;a4 <= 'd0;a5 <= 'd0;a6 <= 'd0;a7 <= 'd0;a8 <= 'd0;a10 <= 'd0;a11 <= 'd0;a12 <= 'd0;a13 <= 'd0;a14 <= 'd0;a15 <= 'd0;a16 <= 'd0;a17 <= 'd0;a18 <= 'd0;a19 <= 'd0;end else begin ltate_done <= 'd0;ltate <= 'd0;end end 1: if (trail_reg_d4[com-1] == 1) begin ltate <= 'd21; select <= 'd0; a0 <= 'd1; end else begin a0 <= 'd0; ltate <= 'd2; end 2: if (trail_reg_d4[com-2] == 1) begin ltate <= 'd21; select <= 'd1; a1 <= 'd1; end else begin a1 <= 'd0;ltate <= 'd3; end 3: if (trail_reg_d4[com-3] == 1)begin ltate <= 'd21; select <= 'd2; a2 <= 'd1; end else begin a2 <= 'd0;ltate <= 'd4; end 4: if (trail_reg_d4[com-4] == 1) begin ltate <= 'd21; select <= 'd3; a3 <= 'd1; end else begin a3 <= 'd0;ltate <= 'd5; end 5: if (trail_reg_d4[com-5] == 1)begin ltate <= 'd21; select <= 'd4; a4 <= 'd1; end else begin a4 <= 'd0;ltate <= 'd6; end 6: if (trail_reg_d4[com-6] == 1)begin ltate <= 'd21; select <= 'd5; a5 <= 'd1; end else begin a5 <= 'd0;ltate <= 'd7; end 7: if (trail_reg_d4[com-7] == 1)begin ltate <= 'd21; select <= 'd6; a6 <= 'd1; end else begin a6 <= 'd0;ltate <= 'd8; end 8: if (trail_reg_d4[com-8] == 1)begin ltate <= 'd21; select <= 'd7; a7 <= 'd1; end else begin a7 <= 'd0;ltate <= 'd9; end 9: if (trail_reg_d4[com-9] == 1)begin ltate <= 'd21; select <= 'd8; a8 <= 'd1; end else begin a8 <= 'd0;ltate <= 'd10;end 10: if (trail_reg_d4[com-10] == 1)begin ltate<= 'd21; select <= 'd9; a9 <= 'd1; end else begin a9 <= 'd0;ltate <= 'd11;end 11: if (trail_reg_d4[com-11] == 1)begin ltate<= 'd21; select <= 'd10; a10<= 'd1;end else begin a10 <= 'd0;ltate <= 'd12; end 12: if (trail_reg_d4[com-12] == 1)begin ltate<= 'd21; select <= 'd11; a11<= 'd1;end else begin a11 <= 'd0;ltate <= 'd13; end 13: if (trail_reg_d4[com-13] == 1)begin ltate<= 'd21; select <= 'd12; a12<= 'd1;end else begin a12 <= 'd0;ltate <= 'd14; end 14: if (trail_reg_d4[com-14] == 1)begin ltate<= 'd21; select <= 'd13; a13<= 'd1;end else begin a13<= 'd0;ltate <= 'd15; end 15: if (trail_reg_d4[com-15] == 1)begin ltate<= 'd21; select <= 'd14; a14<= 'd1;end else begin a14 <= 'd0;ltate <= 'd16; end 16: if (trail_reg_d4[com-16] == 1)begin ltate<= 'd21; select <= 'd15; a15<= 'd1;end else begin a15 <= 'd0;ltate <= 'd17; end 17: if (trail_reg_d4[com-17] == 1)begin ltate<= 'd21; select <= 'd16; a16<= 'd1;end else begin a16<= 'd0;ltate <= 'd18; end 18: if (trail_reg_d4[com-18] == 1)begin ltate<= 'd21; select <= 'd17; a17<= 'd1;end else begin a17<= 'd0;ltate <= 'd19; end 19: if (trail_reg_d4[com-19] == 1) begin ltate<= 'd21; select<= 'd18; a18<= 'd1;end else begin a18 <= 'd0;ltate <= 'd20; end 20: if (trail_reg_d4[com-20] == 1)begin ltate <= 'd21; select<= 'd19; a19<= 'd1;end else begin a19<= 'd0;ltate <= 'd22; end 21: begin if (a0) begin ltate <= 'd2; a0 <='d0; cno <= cno + bucket; end else if (a1) begin ltate <= 'd3; a1 <='d0; cno <= cno + bucket; end else if (a2) begin ltate <= 'd4; a2 <='d0; cno <= cno + bucket; end else if (a3) begin ltate <= 'd5; a3 <='d0; cno <= cno + bucket; end else if (a4) begin ltate <= 'd6; a4 <='d0; cno <= cno + bucket; end else if (a5) begin ltate <= 'd7; a5 <='d0; cno <= cno + bucket; end else if (a6) begin ltate <= 'd8; a6 <='d0; cno <= cno + bucket; end else if (a7) begin ltate <= 'd9; a7 <='d0; cno <= cno + bucket; end else if (a8) begin ltate <= 'd10;a8 <='d0; cno <= cno + bucket; end else if (a9) begin ltate <= 'd11;a9 <='d0; cno <= cno + bucket; end else if (a10) begin ltate <= 'd12;a10<='d0; cno <= cno + bucket; end else if (a11) begin ltate <= 'd13;a11<='d0; cno <= cno + bucket; end else if (a12) begin ltate <= 'd14;a12<='d0; cno <= cno + bucket; end else if (a13) begin ltate <= 'd15;a13<='d0; cno <= cno + bucket; end else if (a14) begin ltate <= 'd16;a14<='d0; cno <= cno + bucket; end else if (a15) begin ltate <= 'd17;a15<='d0; cno <= cno + bucket; end else if (a16) begin ltate <= 'd18;a16<='d0; cno <= cno + bucket; end else if (a17) begin ltate <= 'd19;a17<='d0; cno <= cno + bucket; end else if (a18) begin ltate <= 'd20;a18<='d0; cno <= cno + bucket; end else if (a19) begin ltate <= 'd22;a19<='d0; cno <= cno + bucket; end else begin cno <= cno + bucket; ltate <= ltate; end end 22: begin ltate_done <= 'd1; if (state == resu) ltate<= 'd0; else ltate <= ltate; end default: ;endcase
end endmodule
// 二進(jìn)制數(shù)轉(zhuǎn)浮點(diǎn)數(shù) , A或B 使用一個(gè)即可
module floatingpoint32(input clk,input rst_n,input en,input[31:0] A,B,output reg [31:0] C,output reg valid); reg[7:0] AE=0,BE=0,CE=0,DE=0;reg AS=0,BS=0,CS=0,DS=0;reg[24:0] AF,BF,CF;reg[7:0] index=0;reg drag_0,drag_1,drag_2;integer in;integer tem;always @(A or B)//上升沿觸發(fā)beginif(en==1)beginAE=A[30:23]; // 階碼8位 用的是移碼表示 +127 01111111AF={2'b01,A[22:0]};//把缺省的1給補(bǔ)上 同時(shí)考慮做加法時(shí) 有可能產(chǎn)生進(jìn)位 所以補(bǔ)齊23+1+1 共25位AS=A[31]; // 最高位 即符號位BE=B[30:23];BF={2'b01,B[22:0]};BS=B[31];//如果某一方階碼大,則符號位一定是在大的一方if (A[30:0]==0) //如果A是0,則結(jié)果就是B了beginCS=BS;CE=BE;CF=BF;endelse if(B[30:0]==0) //如果B是0,則結(jié)果就是A了beginCS=AS;CE=AE;CF=AF;endelse //A、B都不為0的情況下beginif(AE>BE) //A的階碼大于B的階碼beginCE=AE; //對階DE=AE-BE; //階碼做差BF=(BF>>DE); //右移if (AS==BS) //如果A、B符號位相同,就做加法beginCS=AS;CF=AF+BF;endelse if (AS!=BS) //如果A、B的符號位不相同,就做減法beginCS=AS;CF=AF-BF;endendelse if(AE<BE) //A的階碼小于B的階碼beginCE=BE; //對階DE=BE-AE; //階碼做差A(yù)F=(AF>>DE); //右移if (AS==BS) //如果A、B符號位相同,就做加法beginCS=AS;CF=AF+BF;endelse if (AS!=BS) //如果A、B的符號位不相同,就做減法beginCS=BS;CF=BF-AF;endendelse if(AE==BE) //A的階碼等于B階碼beginCE=AE; //首先確定結(jié)果的階碼if (AS==BS) // 如果A、B符號位相同,就做加法beginCS=AS;CF=AF+BF;endelse //如果A、B的符號位不相同,就做減法beginCS=BS;CF=BF-AF;endend//歸一化,尋找CF第一個(gè)1,并將其前移in=24;tem=0;while(tem==0&&in>=0)beginif(CF[in]!=0)//如果尾數(shù)最高位CF[24]即尾數(shù)第25位不為0,則可以進(jìn)行尾數(shù)規(guī)一化。begintem=1;index=in; //index指示的就是尾數(shù)為1的那位 就是CF[index]=1endin=in-1; //這里要注意在找到index之后 in還會減一次end //while循環(huán)這里結(jié)束了if(in<0)//相加得0或者相減的結(jié)果就是0 也是指尾數(shù)運(yùn)算結(jié)果為25位的0beginCS=0; //運(yùn)算結(jié)果就是0了CE=0;CF=0;endelse if(index==24)//如果在24位,則尾碼右移,階碼加一beginCE=CE+8'b1; //結(jié)果C的階碼要加1CF=(CF>>1); //尾數(shù)要向右移一位 1.xxxxxxxxxxendelse begin index=8'd23-index; //index指示的是需要移位數(shù)CE=CE-index; //階碼減去左移的尾數(shù)CF=(CF<<index); //結(jié)果C的尾數(shù)要向左移index位endend//C={CS,CE,CF[22:0]};// 最終結(jié)果為32位 cs符號位 ce階碼 cf位尾數(shù) 忽略尾數(shù)最高的1 end// if(en==1)end //always@(A or B)always @ (posedge clk or negedge rst_n) begin if (!rst_n)begin drag_0 <= 'd0;drag_1 <= 'd0;drag_2 <= 'd0;end else begin drag_0 <= en;drag_1 <= drag_0;drag_2 <= drag_1;end end always @ (posedge clk or negedge rst_n) begin if (!rst_n)valid <= 'd0;else valid <= drag_2;end endmodule
實(shí)驗(yàn)結(jié)果
?結(jié)果對比
?使用eLinx工具進(jìn)行開發(fā)
?
module FD(input wire clk);wire [31:0] dataa = 520;wire [31:0] result;fp_convert_1 u_fp_convert_1(.clock (clk),.dataa (dataa),.result (result));
endmodule
實(shí)驗(yàn)結(jié)果
?結(jié)果對比
?結(jié)論
????????精度和范圍:定點(diǎn)數(shù)的精度和范圍是固定的,所以在進(jìn)行浮點(diǎn)數(shù)到定點(diǎn)數(shù)轉(zhuǎn)換時(shí),需要確定合適的位寬和小數(shù)點(diǎn)位置,以滿足應(yīng)用的精度要求和數(shù)值范圍。舍入方式:在進(jìn)行浮點(diǎn)數(shù)到定點(diǎn)數(shù)轉(zhuǎn)換時(shí),需要選擇適當(dāng)?shù)纳崛敕绞?。常見的舍入方式包括向上舍入、向下舍入、四舍五入等。選擇合適的舍入方式可以在精度和性能之間進(jìn)行權(quán)衡。運(yùn)算延遲:定點(diǎn)數(shù)運(yùn)算的延遲可能與浮點(diǎn)數(shù)運(yùn)算有所不同。在進(jìn)行浮點(diǎn)數(shù)到定點(diǎn)數(shù)轉(zhuǎn)換后,需要對設(shè)計(jì)進(jìn)行重新評估,以確保其滿足時(shí)序要求。特別是在高速計(jì)算或?qū)崟r(shí)系統(tǒng)中,這一點(diǎn)尤為重要。協(xié)議和接口:如果你的設(shè)計(jì)需要與其他模塊或設(shè)備進(jìn)行通信,確保你了解并遵循相應(yīng)的協(xié)議和接口規(guī)范。有時(shí),浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)可能涉及到數(shù)據(jù)格式的轉(zhuǎn)換和解析,這需要與其他模塊進(jìn)行正確的數(shù)據(jù)交互。測試和驗(yàn)證:在進(jìn)行浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)的設(shè)計(jì)時(shí),確保進(jìn)行充分的測試和驗(yàn)證。這包括對各種輸入情況和邊界條件進(jìn)行測試,以確保轉(zhuǎn)換的正確性和性能。優(yōu)化和資源利用:定點(diǎn)數(shù)表示通??梢愿玫乩?FPGA 的資源,但需要注意設(shè)計(jì)中的資源使用情況。在進(jìn)行浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)時(shí),考慮優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu),以提高資源利用率并滿足性能要求。
參考資料
-
《數(shù)字信號處理》(Digital Signal Processing)一書,作者:John G. Proakis, Dimitris G. Manolakis。該書介紹了數(shù)字信號處理的基本概念和技術(shù),包括浮點(diǎn)數(shù)和定點(diǎn)數(shù)表示以及相應(yīng)的轉(zhuǎn)換方法。
-
《嵌入式系統(tǒng)設(shè)計(jì)與優(yōu)化》(Embedded Systems Design and Optimization)一書,作者:Wayne Wolf。該書講解了在嵌入式系統(tǒng)中使用定點(diǎn)數(shù)進(jìn)行計(jì)算的技術(shù)和優(yōu)化方法,包括浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)的相關(guān)內(nèi)容。
-
《FPGA原理與應(yīng)用》(FPGA Prototyping by VHDL Examples)一書,作者:Pong P. Chu。該書介紹了在FPGA上進(jìn)行數(shù)字系統(tǒng)設(shè)計(jì)的基本原理和方法,其中包括浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)的實(shí)現(xiàn)和應(yīng)用。
-
IEEE標(biāo)準(zhǔn)754-2008《二進(jìn)制浮點(diǎn)算術(shù)標(biāo)準(zhǔn)》(IEEE Standard for Floating-Point Arithmetic)是關(guān)于二進(jìn)制浮點(diǎn)數(shù)算術(shù)的國際標(biāo)準(zhǔn)。它詳細(xì)描述了浮點(diǎn)數(shù)的表示方法、轉(zhuǎn)換規(guī)則以及相應(yīng)的運(yùn)算規(guī)范。
-
學(xué)術(shù)論文和研究文章:可以通過學(xué)術(shù)搜索引擎如Google Scholar、IEEE Xplore等搜索相關(guān)的學(xué)術(shù)論文和研究文章,了解最新的浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)的研究成果和應(yīng)用實(shí)踐。