自控笔记

VHDL四位并行平方器的设计

一、设计方案

由十进制数乘法以及十进制和二进制的转换关系可知,四位二进制乘法可由下列公式表示:

1

公式可做进一步简化:

2

而平方器的设计就是乘法器的设计,即两个相同的无符号数相乘:

3

由公式1-3可知,设计四位并行平方器可以先用乘数A从低位开始按位乘以A,由于A的每一位只能是01两个值,所以

4

然后把Pi左移i位累计相加,即可得到A2的结果,四位并行平方器即可实现。

二、系统结构设计

四位并行平方器包括一个四位并行数据输入端,一个八位并行数据输出端,一个复位端和一个使能端,系统结构框图如下:

tu1

图2-1 系统结构框图

三、程序编写

四位并行平方器的VHDL具体程序如下:

1、库文件以及端口定义:

library ieee;
use ieee.std_logic_1164.All;
use ieee.std_logic_unsigned.All;
entity square_4 is
port(
RST:in std_logic;                  --定义复位端口RST
EN:in std_logic;                   --定义使能端口EN
A:in std_logic_vector(3 downto 0);    --定义平方器四位并行数据输入端口A
OT:out std_logic_vector(7 downto 0)  --定义平方器数据输出端口OT
);
end square_4;

2、公式1-4的编程实现:

--从低位开始相乘START---------------------------------
if A(0)='0' then P0<="0000"; else P0<=A; end if;
if A(1)='0' then P1<="0000"; else P1<=A; end if;
if A(2)='0' then P2<="0000"; else P2<=A; end if;
if A(3)='0' then P3<="0000"; else P3<=A; end if;
--END----------------------------------------------------------

3、公式1-3的编程实现:
--移位累加START-------------------------------------------
OQ<=("0000"&P0)+("000"&P1&'0')+("00"&P2&"00")+('0'&P3&"000");
--END-----------------------------------------------------------

四、时序仿真

设置仿真时间为20us,输入A为四位无符号十进制数,输出OT为八位无符号十进制数,Quartus II时序仿真波形如下图所示:

VHDL时序仿真波形图

图 4-1 仿真波形

五、程序源代码

library ieee;
use ieee.std_logic_1164.All;
use ieee.std_logic_unsigned.All;
entity square_4 is
port(
RST:in std_logic; --定义复位端口RST
EN:in std_logic; --定义使能端口EN
A:in std_logic_vector(3 downto 0); --定义平方器四位并行数据输入端口A
OT:out std_logic_vector(7 downto 0) --定义平方器数据输出端口OT
);
end square_4;

architecture one of square_4 is
signal P0,P1,P2,P3: std_logic_vector(3 downto 0);
signal OQ: std_logic_vector(7 downto 0);
begin
process(A,RST,EN)
begin
if RST='1' then OQ<=(others=>'0'); --当RST为1时系统复位,输出清零
elsif EN='1' then --当EN为1时平方器使能 ,否则输出保持
--从低位开始相乘START---------------------------------
if A(0)='0' then P0<="0000"; else P0<=A; end if;
if A(1)='0' then P1<="0000"; else P1<=A; end if;
if A(2)='0' then P2<="0000"; else P2<=A; end if;
if A(3)='0' then P3<="0000"; else P3<=A; end if;
--END-------------------------------------------------

--移位累加START---------------------------------------
OQ<=("0000"&P0)+("000"&P1&'0')+("00"&P2&"00")+('0'&P3&"000");
--END-------------------------------------------------
end if;
OT<=OQ;
end process;
end;