资源描述:
《基于fpga的正整数除法器设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1.顶层模块`timescale1ns/1ps////////////////////////////////////////////////////////////////////////////////////Company:西安电子科技大学//Engineer:piger朱////CreateDate:16:08:4205/11/2012//DesignName:基于FPGA的正整数除法器设计(被除数8位,除数4位)//ModuleName:div//ProjectName:div//TargetDevices:virtex-5//To
2、olversions: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,
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....如此重复8个周期,也就是reg16左移八次之后,//reg16[7:0]中存储的值就是最终的商,reg16[15:8]>>1的值就是//最终的余数。至于为什么会这样,大家把这个流程走一边自然就能明白
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