VHDL程序设计——移位相加型乘法器

本文详细介绍了VHDL中如何表达移位相加型乘法器,通过GENERIC语句设定参数,利用CONV_STD_LOGIC_VECTOR将整数转换为二进制,并在进程中实现二进制移位相加的过程。通过对输入A和B的每一位进行判断,当B的某位为1时,进行相应位的A左移并累加,从而完成乘法运算。此设计适用于数字逻辑和FPGA设计领域。
摘要由CSDN通过智能技术生成
--移位相加型乘法器的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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayne_Fine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值