基于FPGA的正整数除法器设计.doc_第1页
基于FPGA的正整数除法器设计.doc_第2页
基于FPGA的正整数除法器设计.doc_第3页
基于FPGA的正整数除法器设计.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.顶层模块timescale 1ns / 1ps/ Company: 西安电子科技大学/ Engineer: piger朱/ / Create Date: 16:08:42 05/11/2012 / Design Name: 基于FPGA的正整数除法器设计(被除数8位,除数4位)/ Module Name: div / Project Name: div/ Target Devices: virtex-5/ Tool versions: ISE12.4 modelsim6.5se/ Description: 除法运算的过程就是被除数不断的减去除数,直到二者的差为负数为止/ 但这样做有一个缺点,比如100/100,只需要减一次就能得出结果,/ 而100/1需要减100次才能得出结果,如果一个时钟周期做一次减法的/ 话,100/1需要100个时钟周期,效率太低了!我们可以这样做/ 以23/3为例,23(用a表示)的二进制为0001_0111,3(用b表示)的/ 二进制为0011,首先设置一个16为的寄存器reg16, 用以辅助计算/ 令reg16=8b0,a=0000_0000, 0001_0111, 每个周期令/ reg16左移一位,如果reg16的高8位(reg1615:8)大于b, 则令/ reg1615:8=reg15:8-b,同时令reg16的最低位(reg160)/ 等于1; 如果reg16的高8位小于b,则reg16:8保持不变,同时令/ reg160=0.如此重复8个周期,也就是reg16左移八次之后,/ reg167:0中存储的值就是最终的商,reg1615:81的值就是/ 最终的余数。至于为什么会这样,大家把这个流程走一边自然就能明白了/ Dependencies: / Revision: / Revision 0.01 - File Created/ Additional Comments: /module div(clk, rst, start, dividend, divisor, quotient, remainder, sample, error);input clk;input rst;input start;input7:0 dividend;input3:0 divisor;output7:0 quotient;output7:0 remainder;output sample;output error;reg15:0 divn;reg3:0 divr;reg1:0 state;reg2:0 counter;reg do_sig;parameter IDLE = 2b00, ERROR = 2b01, SHIFT = 2b10;always (posedge clk)beginif(!rst) begindivn = 0;divr = 0;counter = 0;state = IDLE;endelse begincase(state)IDLE: begincase(start)0: state = IDLE;1: begindivn = 8b0, dividend 1;divr = divisor;counter = 0;do_sig = 0;if(divisor = 0)state = ERROR;elsestate = SHIFT;endendcaseendSHIFT: begincounter = divisor) begindivn = divn15:8 - divr, divn7:0 1;divn0 = 1;endelse begindivn = divn 1;divn0 = 0;endif(counter = 7) beginstate = IDLE;do_sig = 1;endelsestate = SHIFT;endERROR: begin/state = IDLE;end default: state 1;assign sample = do_sig;assign error = (state = ERROR);endmodule2.测试文件timescale 1ns / 1psmodule div_tb;/ Inputsreg clk;reg rst;reg start;reg 7:0 dividend;reg 3:0 divisor;/ Outputswire 7:0 quotient;wire 7:0 remainder;wire sample;wire error;integer i;/ Instantiate the Unit Under Test (UUT)div uut (.clk(clk), .rst(rst), .start(start), .dividend(dividend), .divisor(divisor), .quotient(quotient), .remainder(remainder), .sample(sample), .error(error);initial begin/ Initialize Inputsclk = 0;rst = 1;start = 0;dividend = 23;divisor = 3;i = 0;#30 rst = 0;#100 rst = 1; start = 1;#10000 $stop; endalways #50 clk = clk;always (negedge clk) beginif(!rst) begindividend = 23;divisor = 3;endelse beginif(i = 9) begindividend = $random%256;divisor = $random%16;i = 1;endelsei = i + 1;endendendmodule3.仿真波形(dividend表示被除数,divisor表示除数,quotient表示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论