資源描述:
《基于fpga的正整數(shù)除法器設(shè)計》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、1.頂層模塊`timescale1ns/1ps////////////////////////////////////////////////////////////////////////////////////Company:西安電子科技大學(xué)//Engineer:piger朱////CreateDate:16:08:4205/11/2012//DesignName:基于FPGA的正整數(shù)除法器設(shè)計(被除數(shù)8位,除數(shù)4位)//ModuleName:div//ProjectName:div//TargetDevices:virtex-5//To
2、olversions:ISE12.4modelsim6.5se//Description:除法運(yùn)算的過程就是被除數(shù)不斷的減去除數(shù),直到二者的差為負(fù)數(shù)為止//但這樣做有一個缺點,比如100/100,只需要減一次就能得出結(jié)果,//而100/1需要減100次才能得出結(jié)果,如果一個時鐘周期做一次減法的//話,100/1需要100個時鐘周期,效率太低了?。。∥覀兛梢赃@樣做//以23/3為例,23(用a表示)的二進(jìn)制為0001_0111,3(用b表示)的//二進(jìn)制為0011,首先設(shè)置一個16為的寄存器reg16,用以輔助計算//令reg16={8'b0,
3、a}={0000_0000,0001_0111},每個周期令//reg16左移一位,如果reg16的高8位(reg16[15:8])大于b,則令//reg16[15:8]=reg[15:8]-b,同時令reg16的最低位(reg16[0])//等于1;如果reg16的高8位小于b,則reg[16:8]保持不變,同時令//reg16[0]=0....如此重復(fù)8個周期,也就是reg16左移八次之后,//reg16[7:0]中存儲的值就是最終的商,reg16[15:8]>>1的值就是//最終的余數(shù)。至于為什么會這樣,大家把這個流程走一邊自然就能明白
4、了//Dependencies:////Revision://Revision0.01-FileCreated//AdditionalComments:////////////////////////////////////////////////////////////////////////////////////modulediv(clk,rst,start,dividend,divisor,quotient,remainder,sample,error);inputclk;inputrst;inputstart;input[7:0]d
5、ividend;input[3:0]divisor;output[7:0]quotient;output[7:0]remainder;outputsample;outputerror;reg[15:0]divn;reg[3:0]divr;reg[1:0]state;reg[2:0]counter;regdo_sig;parameterIDLE=2'b00,ERROR=2'b01,SHIFT=2'b10;always@(posedgeclk)beginif(!rst)begindivn<=0;divr<=0;counter<=0;state<=
6、IDLE;endelsebegincase(state)IDLE:begincase(start)0:state<=IDLE;1:begindivn<={8'b0,dividend}<<1;divr<=divisor;counter<=0;do_sig<=0;if(divisor==0)state<=ERROR;elsestate<=SHIFT;endendcaseendSHIFT:begincounter<=counter+1;if(divn[15:8]>=divisor)begindivn<={divn[15:8]-divr,divn[7
7、:0]}<<1;divn[0]<=1;endelsebegindivn<=divn<<1;divn[0]<=0;endif(counter==7)beginstate<=IDLE;do_sig<=1;endelsestate<=SHIFT;endERROR:begin//state<=IDLE;enddefault:state<=IDLE;endcaseendendassignquotient=divn[7:0];assignremainder=divn[15:8]>>1;assignsample=do_sig;assignerror=(st
8、ate==ERROR);endmodule2.測試文件`timescale1ns/1psmodulediv_tb;//Inputsregclk;regrst;reg