您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 基于FPGA的正整数除法器设计
1.顶层模块`timescale1ns/1ps////////////////////////////////////////////////////////////////////////////////////Company:西安电子科技大学//Engineer:piger朱////CreateDate:16:08:4205/11/2012//DesignName:基于FPGA的正整数除法器设计(被除数8位,除数4位)//ModuleName:div//ProjectName:div//TargetDevices:virtex-5//Toolversions:ISE12.4modelsim6.5se//Description:除法运算的过程就是被除数不断的减去除数,直到二者的差为负数为止//但这样做有一个缺点,比如100/100,只需要减一次就能得出结果,//而100/1需要减100次才能得出结果,如果一个时钟周期做一次减法的//话,100/1需要100个时钟周期,效率太低了!!!我们可以这样做//以23/3为例,23(用a表示)的二进制为0001_0111,3(用b表示)的//二进制为0011,首先设置一个16为的寄存器reg16,用以辅助计算//令reg16={8'b0,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....如此重复8个周期,也就是reg16左移八次之后,//reg16[7:0]中存储的值就是最终的商,reg16[15:8]1的值就是//最终的余数。至于为什么会这样,大家把这个流程走一边自然就能明白了//Dependencies:////Revision://Revision0.01-FileCreated//AdditionalComments:////////////////////////////////////////////////////////////////////////////////////modulediv(clk,rst,start,dividend,divisor,quotient,remainder,sample,error);inputclk;inputrst;inputstart;input[7:0]dividend;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=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:0]}1;divn[0]=1;endelsebegindivn=divn1;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=(state==ERROR);endmodule2.测试文件`timescale1ns/1psmodulediv_tb;//Inputsregclk;regrst;regstart;reg[7:0]dividend;reg[3:0]divisor;//Outputswire[7:0]quotient;wire[7:0]remainder;wiresample;wireerror;integeri;//InstantiatetheUnitUnderTest(UUT)divuut(.clk(clk),.rst(rst),.start(start),.dividend(dividend),.divisor(divisor),.quotient(quotient),.remainder(remainder),.sample(sample),.error(error));initialbegin//InitializeInputsclk=0;rst=1;start=0;dividend=23;divisor=3;i=0;#30rst=0;#100rst=1;start=1;#10000$stop;endalways#50clk=~clk;always@(negedgeclk)beginif(!rst)begindividend=23;divisor=3;endelsebeginif(i==9)begindividend={$random}%256;divisor={$random}%16;i=1;endelsei=i+1;endendendmodule3.仿真波形(dividend表示被除数,divisor表示除数,quotient表示商,remainder表示余数,sample表示对最终结果的采样,如图中13/13,采样点处的值为商=1,余数=0;101/2,采样点处的值为商=50,余数=1,从而确定了结果的正确性。从结果中还可以看出,不管是多少除以多少,都只需要9个时钟周期就能得出结果))
本文标题:基于FPGA的正整数除法器设计
链接地址:https://www.777doc.com/doc-2569691 .html