基于fpga的乘法器和除法器

更新时间:2023-10-26 23:41:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

任务书:

1、 十六位硬件乘法器电路 2、 八位硬件除法器电路 摘要:

设计一个16位硬件乘法器电路。要求2位十进制乘法,能用LED数码管同时显示乘数,被乘数和积的值.本设计利用Quartus II软件为设计平台,通过移位相加的乘法原理:即从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。经软件仿真和硬件测试验证后,以达到实验要求。

设计一个8位硬件除法器电路。要求2位十进制除法,能用LED数码管显示结果、除数和被除数的值。根据被除数(余数)和除数的大小来上商,被除数低位补零,再减去右移后的除数也可以改为左移余数,减去除数,这样可以确保参与运算的寄存器具有相同位数。商写到寄存器的低位,然后再左移一位。经软件仿真和硬件验证后,以达到实验要求。

目录

2.任务书………………………………………………………………………………………………2 3.摘要…………………………………………………………………………………………………2 4.目录…………………………………………………………………………………………………3 5.正文…………………………………………………………………………………………………4 5.1.1 乘法器系统设计……………………………………………………………………………4 5.1.1.1 设计要求…………………………………………………………………………4 5.1.2.2系统设计方案……………………………………………………………………4 5.1.2 单元电路设计………………………………………………………………………………4 十进制计算模块…………………………………………………………………5 BCD码转二进制模块……………………………………………………………5 8位右移寄存器模块……………………………………………………………6 8位加法器模块…………………………………………………………………7 1位乘法器multi_1模块…………………………………………………………7 16位移位寄存器reg_16模块…………………………………………………8 16位二进制转BCD码B_BCD模块………………………………………………9 8位乘法器multi_8x8顶层设计…………………………………………………10

5.1.3 乘法器的系统测试…………………………………………………………………………14 仿真分析………………………………………………………………………………14 硬件验证………………………………………………………………………………15 5.2.1 除法器系统设计……………………………………………… 5.2.2单元电路设计………………………………………………

5.2.3 除法器的系统设计……………………………………………… 仿真分析……………………………………………… 硬件验证………………………………………………

6. 结论……………………………………………………………………………………………15 7. 参考文献………………………………………………………………………………………15 8. 分工……………………………………………………………………………………………15

2

5.正文

题目要求设计基于fpga的乘法器和除法器。本小组想出的方案是利用位移相加和相减来制作乘法器和除法器。运用的模块主要包括:

1、 输入模块:运用计数器设编码器将bcd码编译为二进制码; 2、 运算模块:包括运算器和寄存器;

3、 输出模块:将运算器运算的结果的二进制数译码位bcd码在数码管上显示出来。

其余方法:可以将输入的二进制数转为十进制再进行运算,此方法适用于人工初学者计算不适于利用芯片

计算,故不考虑。

方案先进性:简单易懂,将乘法器和除法器分开制作便于分工。但缺点也显而易见,乘法器和除法器按照

不同人的思维进行设计,不易于整合,变为两个独立的模块。

方案可行性:易于设计,但使用不便,需要重新烧入程序实现乘除法切换。

5.1乘法器系统设计

1.1 设计要求

题目要求设计一个16位硬件乘法器电路.要求2位十进制乘法;能用LED数码管同时显示乘数,被乘数和积的信息.设置一个乘法使能端,控制乘法器的计算和输出. 1.2 系统设计方案

此设计问题可分为乘数和被乘数输入控制模块,乘法模块和输出乘积显示模块基本分.

乘数和被乘数的输入模块使输入的十进制数转化为二进制数输入乘法模块,乘法模块利用移位相加的方法将输入的两组二进制数进行相乘,并将16位乘积输出到乘积输出显示模块.显示模块将输入的二进制数按千,百,十,个位分别转化为十进制数输出.

乘数和被乘数的输入可用数据开关K1~K10分别代表数字1,2,…,9,0,用编码器对数据开关K1~K10的电平信号进行编码后输入乘法器进行计算.但此方案所用硬件资源较多,输入繁琐,故不采取.

方案二是利用硬件箱自带16进制码发生器,由对应的键控制输出4位2进制构成的1位16进制码,数的范围是0000~1111,即0H~FH.每按键一次,输出递增1,输出进入目标芯片的4位2进制数将显示在该键对应的数码管.

乘数和被乘数的输入模块将16进制码的A~F码设计成输出为null.使得减少了无用码的输入. 两数相乘的方法很多,可以用移位相加的方法,也可以将乘法器看成计数器,乘积的初始值为零,每一个时钟周期将乘数的值加到积上,同时乘数减一,这样反复执行,直到乘数为零.本设计利用移位相加的方法使得程序大大简化.

系统总体电路组成原理图如下图所示:

3

5.1.2乘法器单元电路设计

下面分解8位乘法器的层次结构,分为以下7个模块:

1. 十进制计算模块:使用4个十进制计数模块,输入乘数的十位个位,被乘数的十位个位。 2. BCD码转二进制模块:实现将输入的8位BCD码转化成二进制

3. 右移寄存器模块:这是一个8位右移寄存器,可将乘法运算中的被乘数加载于其中,同时 进行乘法运算的移位操作。

4. 加法器模块:这是一个8位加法器,进行操作数的加法运算。 5. 1位乘法器模块:完成8位与1位的乘法运算。

6. 锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号的控制下完成输入数值的锁存与移位。

7. 二进制转BCD码模块:将16位寄存器的值(积)转化成BCD码,配合数码管显示

十进制加计数器设计

十进制计数器在每个时钟来临时计数,clk=1时清零,用于输入乘数,被乘数的个位,十位 Library ieee; --0到9计数器 Use ieee.std_logic_unsigned.all; Use ieee.std_logic_1164.all; Entity cnt10 is

Port (clk,clr: in std_logic;

q: out std_logic_vector(3 downto 0)); end cnt10;

architecture behav of cnt10 is begin

process(clk,clr)

variable cqi: std_logic_vector(3 downto 0); begin

if clr='1' then cqi:=\

elsif clk'event and clk='1' then if cqi=9 then cqi:=\ else cqi:=cqi+1; end if; end if; q<=cqi; end process; end behav;

4

BCD码转二进制码BCD_B的设计

将十进制计数器产生的十位和个位合并后,为BCD码,而计算时使用二进制码计算,所以采用该模块来转化

Library ieee; --(0到99)BCD码转二进制码 Use ieee.std_logic_unsigned.all; Use ieee.std_logic_1164.all; Entity BCD_B is

Port ( a: in std_logic_vector(7 downto 0); q: out std_logic_vector(7 downto 0)); end BCD_B;

architecture behav of BCD_B is

signal a1,a2,a3,a4,cq: std_logic_vector(7 downto 0); begin

process(a) begin

a1<=\ a2<=\ a3<=a2(6 downto 0)&'0'; a4<=a2(4 downto 0)&\ cq<=a4+a3+a1; q<=cq; end process; end behav;

8位移位寄存器reg_8的设计

8位移位寄存器是在时钟(r8_clk'event and r8_clk='1')信号作用下,当r8_load='1'时,将8位乘数加载进入;而当r8_load='0'时,对数据进行移位操作,同时定义一个信号reg8用来装载新数据及移位后的操作数,完成这些操作后,寄存器的最低位reg8(0)传送给r8_out输出。 library ieee; ---8位移位寄存器 use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity reg_8 is

port(r8_clk,clr,r8_load:in std_logic;

r8_in:in std_logic_vector(7 downto 0); r8_out:out std_logic); end reg_8;

architecture arc_reg_8 of reg_8 is

signal reg8:std_logic_vector(7 downto 0);

5

本文来源:https://www.bwwdw.com/article/5sn2.html

Top