freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于modelsim的fft算法的設(shè)計(jì)學(xué)士學(xué)位論文(編輯修改稿)

2025-07-24 18:05 本頁面
 

【文章內(nèi)容簡介】 =x= Q12 8=x= Q11 16=x= Q10 32=x= Q9 64=x= Q8 128=x= Q7 256=x= Q6 512=x= Q5 1024=x= Q4 2048=x= Q3 4096=x= Q2 8192=x= Q1 16384=x= Q0 32768=x=32767 有限字長效應(yīng)和單片機(jī)、DSP等器件一樣,F(xiàn)PGA也是不能直接處理模擬信號(hào)的。模擬信號(hào)必須利用A/D轉(zhuǎn)換成數(shù)字信號(hào)以后才能利用FPGA處理。由于A/D器件的精度是一定的,所以轉(zhuǎn)換之后的數(shù)值和真實(shí)值之間存在著偏差,這就是輸入的量化誤差。當(dāng)利用FPGA實(shí)現(xiàn)乘法計(jì)算的時(shí)候,例如計(jì)算兩個(gè)N位寬的二進(jìn)制數(shù)的乘積,乘積的結(jié)果一般都會(huì)用2N位寬的二進(jìn)制數(shù)表示,這個(gè)時(shí)候都會(huì)將結(jié)果進(jìn)行適當(dāng)?shù)纳嵛惶幚?,否則再進(jìn)行后面的運(yùn)算的話最終的結(jié)果的數(shù)據(jù)寬度將是難以想象的。進(jìn)行舍位就會(huì)自然而然的引入誤差,這種誤差屬于運(yùn)算量化誤差,也稱為運(yùn)算噪聲。這些誤差就使得利用FPGA進(jìn)行數(shù)字信號(hào)處理的時(shí)候會(huì)產(chǎn)生有限字長效應(yīng)。為了得到精確結(jié)果,一方面可以選用合適的運(yùn)算結(jié)構(gòu),盡量減少有限字長效應(yīng),另一方面可以采用合適的字長以降低運(yùn)算噪聲[3]。 塊浮點(diǎn)數(shù)浮點(diǎn)數(shù)具有很大的動(dòng)態(tài)范圍,可以非常精確地表示一個(gè)數(shù)值。由于在執(zhí)行算術(shù)運(yùn)算時(shí)需要大量的硬件資源,所以浮點(diǎn)數(shù)記數(shù)方法的使用成本很高。塊浮點(diǎn)數(shù)記數(shù)方法廣泛用于信號(hào)處理領(lǐng)域,如執(zhí)行FFT變換,它消耗的硬件資源要比浮點(diǎn)數(shù)少得多。在用FPGA實(shí)現(xiàn)FFT算法的時(shí)候,經(jīng)常會(huì)使用塊浮點(diǎn)的方式來進(jìn)行。這一方法的初始輸入數(shù)據(jù)限制為|x(n)|l,計(jì)算方式按定點(diǎn)方式進(jìn)行。塊浮點(diǎn)數(shù)可以跟蹤數(shù)值動(dòng)態(tài)范圍的變化,例如做256點(diǎn)FFT變換,數(shù)據(jù)寬度為16位,動(dòng)態(tài)范圍是32768~32767,經(jīng)過FFT的第一級(jí)運(yùn)算后,取值范圍是65536~65535。為了保持?jǐn)?shù)據(jù)寬度不變,可以將所有256個(gè)點(diǎn)的數(shù)值均除以2,然后寄存器中置入一個(gè)“1”,這樣通過增加一位寄存器,達(dá)到了既增加了數(shù)據(jù)的動(dòng)態(tài)范圍,又未增加數(shù)據(jù)寬度的目的。這種記數(shù)方法就是塊浮點(diǎn)數(shù)記數(shù)方法??偟膩碚f,塊浮點(diǎn)數(shù)具有定點(diǎn)數(shù)的運(yùn)算速度,同時(shí)又有浮點(diǎn)數(shù)的計(jì)數(shù)思想,鑒于塊浮點(diǎn)數(shù)的這種優(yōu)點(diǎn),本課題選擇了塊浮點(diǎn)數(shù)的計(jì)數(shù)方式[3]。 3 FFT的算法設(shè)計(jì) FFT處理器的實(shí)現(xiàn)框圖本論文主要研究的是32點(diǎn)的按時(shí)間抽取的基2FFT算法的FPGA實(shí)現(xiàn),同時(shí)為了提高運(yùn)行速度還運(yùn)用了流水線結(jié)構(gòu),為了兼顧高精度和復(fù)雜度的特點(diǎn)還引入了塊浮點(diǎn)結(jié)構(gòu)?;?FFT模塊設(shè)計(jì)主要由6個(gè)部分組成:蝶形運(yùn)算單元、存儲(chǔ)單元、地址生成單元、功能切換單元、塊浮點(diǎn)單元和時(shí)序控制單元[4]。 FFT處理器結(jié)構(gòu)框圖:蝶算單元采用DIT方式來完成基2蝶形運(yùn)算,如果數(shù)據(jù)從雙口RAM1中讀出,則計(jì)算結(jié)果存入雙口RAM2中,反之亦然;存儲(chǔ)單元主要用來存儲(chǔ)輸入數(shù)據(jù)、中間結(jié)果(RAM),預(yù)置旋轉(zhuǎn)因子(ROM),以及最后的計(jì)算結(jié)果(RAM);地址產(chǎn)生單元產(chǎn)生RAM的讀、寫地址和ROM的讀地址;功能切換單元用來完成RAM1和RAM2間數(shù)據(jù)讀寫功能的切換;塊浮點(diǎn)單元記錄蝶算單元輸出數(shù)據(jù)的位信息,并完成蝶算單元輸入數(shù)據(jù)的截位;時(shí)序控制單元產(chǎn)生各個(gè)模塊的使能、控制信號(hào),使整個(gè)流程正常工作。 蝶形運(yùn)算單元的設(shè)計(jì) 給出了遞歸順序型FFT算法結(jié)構(gòu)框圖。這種形式的FFT只有一個(gè)蝶形運(yùn)算單元,蝶形運(yùn)算按遞歸的方式,根據(jù)蝶形圖從左向右、從上向下先計(jì)算第一級(jí)的每個(gè)蝶形,然后計(jì)算第二級(jí)、第三級(jí),逐級(jí)地循環(huán)運(yùn)算,直至第N/2 log2N個(gè)蝶形,完成N點(diǎn)FFT的全部運(yùn)算。若執(zhí)行一次蝶形運(yùn)算的時(shí)間為T,則完成N點(diǎn)FFT計(jì)算,所需的時(shí)間為N/2 log2NT。在實(shí)際應(yīng)用中,輸入緩沖單元和輸出緩沖單元可以是同一個(gè)存儲(chǔ)單元,完成N點(diǎn)FFT運(yùn)算最少只需要N個(gè)存儲(chǔ)單元來緩存輸入數(shù)據(jù)和中間計(jì)算結(jié)果。如果輸入數(shù)據(jù)是連續(xù)的,那么一次N點(diǎn)FFT運(yùn)算必須在下一組N點(diǎn)輸入數(shù)據(jù)輸入結(jié)束之前完成,這往往需要數(shù)倍于輸入數(shù)據(jù)時(shí)鐘的內(nèi)部運(yùn)算時(shí)鐘。這種結(jié)構(gòu)的優(yōu)點(diǎn)是只有一個(gè)蝶形運(yùn)算單元,所占的硬件資源少,結(jié)構(gòu)簡單,穩(wěn)定性能好,缺點(diǎn)是運(yùn)算速度緩慢,且時(shí)序控制較為復(fù)雜。其程序設(shè)計(jì)如下。 遞歸順序型FFT結(jié)構(gòu)框圖module cfft32( clk, rst_n, slice_number, normal_re, normal_im, normal_valid, startfft, fft_finish, address_a, dataout_a, address_b, dataout_b, dataout_valid, number)。input clk。 input rst_n。input [4:0] slice_number。 input [15:0] normal_re。input [15:0] normal_im。input normal_valid。input startfft。output fft_finish。output [3:0] address_a。output [13:0] dataout_a。output [3:0] address_b。output [13:0] dataout_b。output dataout_valid。output [3:0] number。wire d_valid。wire [15:0] d_re。wire [15:0] d_im。assign d_valid=normal_valid。assign d_re[15:0]=normal_re[15:0]。assign d_im[15:0]=normal_im[15:0]。reg [4:0] datain_t。 //ram control signal and databus ,address busreg [35:0] dina,dinb。reg wrda,wrdb。reg blka,blkb。reg [4:0] addra,addrb。wire [35:0] douta,doutb。parameter [4:0] st0=0, st1=1, st2=2, st3=3, st4=4, st5=5, st6=6, st7=7, st8=8,st9=9,st10=10,st11=11,st12=12,st13=13。reg [4:0] state。reg cf_address_gen_en。wire [31:0] datain_cf1,datain_cf2。wire [35:0] dataout_cf1,dataout_cf2。//cfft dataout output signalwire [4:0] addr_cf1,addr_cf2。//cfft addresswire blk_cf,rd_ram,wr_ram。//cfft read write and blk_en signalwire finish_butterfly。reg [31:0] datain。reg valid。wire start_cfft。reg datain_wr,datain_blk。wire [3:0] address_w。wire [31:0] twiddle_dataout。wire read_twiddle。wire [15:0] d_im_conj。wire fft_finish。reg dataout_valid。wire last_butterfly。wire [1:0] shift。assign fft_finish=finish_butterfly。assign blk_cf=rd_ramamp。amp。wr_ram。assign d_im_conj[15:0]=d_im[15:0]。assigndatain_cf1[31:0]=(shift[1:0]==0)?{douta[33:18],douta[15:0]}:(shift[1:0]==1)?{douta[34:19],douta[16:1]}:(shift[1:0]==2)?{douta[35:20],douta[17:2]}:3239。b0。assigndatain_cf2[31:0]=(shift[1:0]==0)?{doutb[33:18],doutb[15:0]}:(shift[1:0]==1)?{doutb[34:19],doutb[16:1]}:(shift[1:0]==2)?{doutb[35:20],doutb[17:2]}:3239。b0。wire [24:0] dataout_cf1_t,dataout_cf2_t,dataout_cf1_t2,dataout_cf2_t2。assigndataout_cf1_t[24:0]={dataout_cf1[35],dataout_cf1[35],dataout_cf1[35],dataout_cf1[35],dataout_cf1[35],dataout_cf1[35],dataout_cf1[35],dataout_cf1[35:18]}number[3:0]。assigndataout_cf2_t[24:0]={dataout_cf2[35],dataout_cf2[35],dataout_cf2[35],dataout_cf2[35],dataout_cf2[35],dataout_cf2[35],dataout_cf2[35],dataout_cf2[35:18]}number[3:0]。assign dataout_cf1_t2[24:0]=dataout_cf1_t[24:0]slice_number[4:0]。assign dataout_cf2_t2[24:0]=dataout_cf2_t[24:0]slice_number[4:0]。assign dataout_a[13:0]=(dataout_valid)?{dataout_cf1[35],dataout_cf1_t2[12:0]}:1439。b0。assign dataout_b[13:0]=(dataout_valid)?{dataout_cf2[35],dataout_cf2_t2[12:0]}:1439。b0。assign address_a[3:0]=(dataout_valid)?addra[4:1]:439。b0。assign address_b[3:0]=(dataout_valid)?addrb[4:1]:439。b0。always@(posedge clk or negedge rst_n) //input datain_valid sync。 if(!rst_n) valid=0。 else valid=d_valid。always@(posedge clk or negedge rst_n) //input datain sync。 if(!rst_n) datain[31:0]=0。 else if(d_valid) datain[31:0]={d_re[15:0],d_im_conj[15:0]}。always@(posedge clk or negedge rst_n) //input datain counter。 if(!rst_n) datain_t[4:0]=0。 else if(valid) datain_t[4:0]=datain_t[4:0]+1。always@(posedge clk or negedge rst_n)//write data into the pingpong ram if(!rst_n) begin datain_wr=1。 datain_blk=1。 end else if(d_valid) begin datain_wr=0。 da
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1