引言在数字计算中,加、减、乘、除运算经常使用。在FPGA中,有加、减、乘、除的算法指令,但除法中除数必须为2的幂,因此无法实现除数为任意数的除法;而二进制除法算法中包含了减法、乘法、数的分解与合成、试商的判断等多种操作过程。因此,除法运算过程非常复杂,用VHDL编写除法运算很难实现。因此,作者根据二进制乘法的原理,采用被除数与除数的倒数相乘的方法来实现二进制的除法。

1 十六位二进制乘法

二进制乘法是通过逐项移位相加原理来实现的。从被乘数的最低位开始,若为1,则乘数左移后送入寄存器进行累加;若为0,左移后以全零相加。如此往复,直至被乘数的最高位。乘法运算结束后,此时累加器中的输出值即为最后的积。图1所示为乘法原理框图。

图1 乘法原理框图

根据上述原理,设计VHDL算法,实现十六位二进制乘法。乘法在一个时钟周期内完成。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY MULTIPLY IS

PORT(CLK:IN STD_LOGIC;

A:IN STD_LOGIC_VECTOR(15 DOWNTO 0);

//乘数

B:IN STD_LOGIC_VECTOR(15 DOWNTO 0);

//被乘数

START:IN STD_LOGIC;

CH:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);

CL:OUT STD_LOGIC_VECTOR(15 DOWNTO O));

END MULTIPLY;

ARCHITECTURE BEHAV OF MULTIPLY IS

SIGNAL L8:STD_LOGIC_VECTOR(15 DOWNTO O);

BEGIN

PROCESS(CLK)

VARIABLE ACC:STD_LOGIC_VECTOR(31 DOWNTO 0);

VARIABLE N:STD_LOGIC_VECTOR(7 DOWNTO 0);

VARIABLE Q:STD_LOGIC_VECTOR(31 DOWNTO O);

VARIABLE MA:STD_LOGIC_VECTOR(31 DOWNTO O);

BEGIN

IF START='1'THEN

IF CLK'EVENT AND CLK='1'THEN

MA(31 DOWNTO 0):="0000000000000000"&A(15

DOWNTO 0);

ACC:="00000000000000000000000000000000";

FOR I IN 0 TO 15 LOOP

FOR JIN 0 TO 31 LOOP

Q(J):=B(I) AND MA(J); //B(I)与MA相"与"

END LOOP;

ACC:=ACC+Q; //累加

MA(31 DOWNTO 0):=MA(30 DOWNTO 0)&MA(31);

//左移

ENDLOOP;

CH<=ACC(31 downto 16); //乘积的高16位

CL<=ACC(15 downto 0); //乘积的低16位

ENDIF;

ENDIF;

END PROCESS;

END BEHAV;

综合后生成的乘法器宏如图2所示。

图2二进制乘法器

2 二进制除法的改进由于在FPGA中实现二进制除法的算法十分复杂,我们在实现二进制除法时,采取被除数与除数的倒数相乘的方法。因此,在给定除数的同时必须计算出除数的倒数,由于除数的倒数是小数形式(除数为1时,倒数为1),因此我们将此倒数的小数部分的16位和整数部分的最后1位(主要考虑除数为1时,倒数的整数部分为1)记录成17位二进制。这样可以与被除数进行二进制乘法运算。乘积的后16位为商的小数部分。前面为商的整数部分。

在FPGA中,我们将除数作为寄存器的地址,其倒数的小数部分作为寄存器的内容。这样,再计算除数的倒数,就相当于一次寄存器的寻址。图3为改进的除法原理框图。

图3改进的除法原理框图

用VHDL设计的查表程序如下(它可在一个时钟周期内将除数B转换成1/B,输出结果M的低16位为倒数的小数部分,M的第17位为倒数的整数部分):

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY TABLE IS

PORT(

N:IN STD_LOGIC_VECTOR (7 downto 0);

CLK:IN STD_LOGIC;

READ:IN STD_LOGIC;

M:out STD_LOGIC_VECTOR(16 downto 0)//倒数的

//整数M(16)和小数部分M(15:0)

);

END TABLE;

ARCHITECTURE TABLE_ARCH OF TABLE IS

SIGNAL L8:STD_LOGIC_VECTOR(16 DOWNTO 0);

BEGIN

PROCESS(CLK,READ)

IF READ='l'THEN

IF CLK'EVENT AND CLK='l'THEN

WHEN"00000001"=>L8<="10000000000000000";

WHEN"00000010"=>L8<="01000000000000000";

WHEN"00000011"=>L8<="00101010101010101";

WHEN"00000100"=>L8<="00100000000000000";

WHEN"00000101"=>L8<="00011001100110011";

WHEN"00000110"=>L8<="00010101010101010";

WHEN"00000111"=>L8<="00010010010010010";

WHEN"11111001"=>L8<="00000000100000111";

WHEN"11111010"=>L8<="00000000100000110";

WHEN"11111011"=>L8<="00000000100000101";

WHEN"11111100"=>L8<="00000000100000100";

WHEN"11111101"=>L8<="00000000100000011";

WHEN"11111110"=>L8<="00000000100000010";

WHEN"11111111"=>L8<="00000000100000001";

WHEN OTHERS=>L8<="ZZZZZZZZZZZZZZZZZ";

//以上为1-255的倒数

END CASE;

M<=L8;

ENDIF;

ENDIF;

END PROCESS;

END TABLE_ARCH;

综合后生成倒数转换寄存器的宏如图4所示。

图4除数转化其倒数寄存器

用原理图将上面所生成的宏连接成完整的除法器如图5所示。其中A[15:0]为被除数,B[7:0]为除数,c[31:16]为商的整数部分,C[15:0]为商的小数部分。

图5 完整的二进制除法器

我们选择几对被除数和除数进行了仿真,其结果如图6和表1所示。

表1部分仿真结果

被除数

除数

商的整数部分

商的小数部分

0450

68

000A

9CE0

0036

68

0000

84E4

0256

68

0005

BFA4

0256

39

000A

7BFE

0168

17

000F

A668

结语

应用上述的二进制乘法和二进制除法,我们解决了工程中所需的乘法和除法运算问题。其中除法运算的商可以精确到小数点后面16位,达到了工程中对运算精度的要求。二进制乘法可以扩展到任意位数,二进制除法中被除数可以为任意位数。由于本方法中除数转换为其倒数的过程是由作者手工输入,并作为寄存器的内容进行存储的, 因此只考虑了除数为8位的情况,当然,也可以完成更高位的寄存器寻址,但工作量很大。

vhdl变量除法_在VHDL中实现高精度快速除法相关推荐

  1. java变量同名_浅析Java中局部变量与成员变量同名解决技巧

    要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中 ...

  2. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  3. form action可以变量么_在 Laravel 中优雅处理 Form 表单

    php中文网最新课程 每日17点准时技术干货分享 在开发 Laravel 应用的时候,通常都会涉及到表单的处理,针对如何优雅处理和复用 Laravel 的 Form 表单,下面是小小的人生经验: 使用 ...

  4. 在python中是否可以使用if作为变量名_在Python中可以使用if 作为变量名_python使用符号 标示注释...

    在Python中可以使用if 作为变量名 答:× " src=" " style="max-width: 100%; display: inline;" ...

  5. python中none算变量吗_在python中对变量判断是否为None的三种方法总结

    三种主要的写法有: 第一种:if X is None; 第二种:if not X: 当X为None,  False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()这 ...

  6. 哪些不符合python语言变量名_以下选项中不符合 Python 语言变量命名规则的是( )_学小易找答案...

    [单选题]下列各项中,关于银行存款业务的表述中正确的是( ).(2012年) [单选题]下列各项中,关于企业无法查明原因的现金溢余,经批准后应贷记的会计科目是( ). [多选题]计价软件中,在人材机汇 ...

  7. unity中链接字符串和变量显示_理解Unity中的优化(六):字符串和文本

    字符串和文本: 在Unity项目中,处理字符串和文本经常会产生性能问题.在C#中,字符串是不变的.任何对字符串的操作都会重新分配新的字符串,这个代价是非常昂贵的.如果在多重循环中重复地执行字符串连接操 ...

  8. python所有变量更新_在python中,如何动态更新变量?

    您正在使用一个id(而不是一个id列表)在元组上循环:((1424794931452.0,), (1424794931645.0,), (1424794931821.0,), (14247949320 ...

  9. python变量图片_在Python中向3D图添加第4个变量

    Matplotlib允许将facecolors作为参数传递给例如 ax.plot_surface. 这意味着您必须在自己的电脑上执行2D插值 当前的颜色数组,因为您当前仅在 矩形面的角(您确实提到您有 ...

  10. python可以用else作为变量名_在Python中可以使用if作为变量名。

    [填空题]表达式 [1,2,3].count(4) 的值为_______________. [填空题]已知列表 x = [1, 2],那么连续执行命令 y = x和 y.append(3) 之后,x的 ...

最新文章

  1. 未能解析引用的程序集……因为它对不在当前目标框架……
  2. Django MTV模型思想
  3. Windows 命令行终端 PowerShell 美化计划
  4. mysql的配置和启动命令
  5. mysql和mongodb替换字段中某字符
  6. Python map, reduce, filter和sorted
  7. Mongo使用navicat解除14天限制
  8. c语言考博真题,中国科学院2015年考博英语真题及答案
  9. lms算法的verilog实现_数字通信同步技术的MATLAB与FPGA实现
  10. l298n电机哪一端为正_L298N控制直流电机正反转
  11. 【SOEM主站】一、SOEM主站环境搭建及连接板子测试
  12. 液相色谱质谱联用市场现状及未来发展趋势
  13. 微软服务器2016各版本区别,Win10系统有几个版本?Windows10各版本区别详细介绍
  14. Activiti in Action(实战Activiti)-目录
  15. js小学生图区_多种方式实现js图片预览
  16. Spring Native实战
  17. python输入数字并求和_Python如何输入数字并求和
  18. 多列 count(distinct)改写优化
  19. Cadence Virtuoso 原理图仿真报错问题解决
  20. 力扣题解-977. 有序数组的平方

热门文章

  1. select完还没释放可以执行其他sql语句吗
  2. 获取某一日期的毫秒数
  3. 【Python爬虫实战】 图片爬虫-淘宝图片爬虫--千图网图片爬虫
  4. 《滕王阁序》在古文中处于什么水平?
  5. 表格里加横线一分为二_我告诉你excel表格分割线一分为二
  6. excel导出动态表头以及二级三级表头,还有数据库动态的数据来源
  7. 【综合】系统架构设计师考试经历分享
  8. 怎么将拍的照片免费转成PDF文件呢
  9. 编程设计模式中委托 和代理模式的区别
  10. 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(概念篇)