我是靠谱客的博主 过时盼望,最近开发中收集的这篇文章主要介绍VHDL程序设计——移位相加型乘法器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

--移位相加型乘法器的VHDL表述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;  

ENTITY MULT4B is 
   GENERIC (S: INTEGER := 4);  --使用GENERIC语句,将常量S定义为整数4
PORT(
	R : OUT STD_LOGIC_VECTOR(2*S DOWNTO 1);   --8位的R作最终输出
	A, B: IN STD_LOGIC_VECTOR(S DOWNTO 1));  --4位的A、B作为输入
END ENTITY MULT4B;
ARCHITECTURE ONE of MULT4B is
   SIGNAL A0: STD_LOGIC_VECTOR(2*S DOWNTO 1); --8位的信号A0
begin
   A0 <= CONV_STD_LOGIC_VECTOR(0,S) & A ; --通过转换函数生成4位的0000与A拼成8位数据

 PROCESS(A,B,A0)  --进程敏感信号A,B,A0
     VARIABLE R1 : STD_LOGIC_VECTOR(2*S DOWNTO 1);  --8位的中间变量R1
  BEGIN
     R1 := (others => '0');  --R1初始化为零
     FOR i IN 1 TO S LOOP  --4位二进制数A,B乘法循环判断4,i=1:4
         IF(B(i) ='1') then  --若检测到B的某一位为1,说明乘法有效(见二进制乘法原理)
            R1 := R1 + TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL(i-1)); --移位相加
         END IF;
     END LOOP;
     R <= R1; --返回输出值R
END PROCESS;
END ARCHITECTURE ONE;

效果:
在这里插入图片描述

问题1. CONV_STD_LOGIC_VECTOR()函数

该函数位于IEEE.STD_LOGIC_ARITH程序包中:
在这里插入图片描述

std_logic_arith程序包里定义的数据转换函数:
conv_std_logic_vector(A,位长)–INTEGER,SINGER,UNSIGNED转换std_logic_vector。

该函数的转换结果是将被转换的数据先转换成2进制补码形式,然后取其低“位长”,作为输出。

    如:
            a<=conv_std_logic_vector(100,6)-----100的二进制取低6位
            
            二进制100 = 01100100
            输出结果:a = 100100

问题2. 二进制移位相加问题

二进制A=0011 ---A=3
左移1位A=0110 ---A=6
左移2为A=1100  ---A=12

左移1位相当于乘2,
左移n位相当于乘 2 n 2^n 2n.

二进制A=0011 ---A=3
左移1位A1=0110 ---A1=6
左移2为B=1100  ---B=12

二进制加法:带进位相加,

A1+B=0110+1100=10010 --即二进制的18

问题3. 移位相加即二进制乘法原理

A=110010
B=1011

当检测到B的某一位为1时,A乘B有效(为0时无效,因为0乘任何数都为0),记录下当前乘积的值,继续移位判断到B的下一位为1时,将上一次的乘积值与当前乘积值累加,即实现了循环移位的乘法原理。

VHDL进程实现:

PROCESS(A,B,A0)  --进程敏感信号A,B,A0
     VARIABLE R1 : STD_LOGIC_VECTOR(2*S DOWNTO 1);  --8位的中间变量R1
  BEGIN
     R1 := (others => '0');  --R1初始化为零
     FOR i IN 1 TO S LOOP  --4位二进制数A,B乘法循环判断4,i=1:4
         IF(B(i) ='1') then  --若检测到B的某一位为1,说明乘法有效(见二进制乘法原理)
            R1 := R1 + TO_STDLOGICVECTOR(TO_BITVECTOR(A0) SLL(i-1)); --移位相加
         END IF;
     END LOOP;
     R <= R1; --返回输出值R
END PROCESS;

最后

以上就是过时盼望为你收集整理的VHDL程序设计——移位相加型乘法器的全部内容,希望文章能够帮你解决VHDL程序设计——移位相加型乘法器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部