加法器在VHDL比较中的实现

加法器在VHDL比较中的实现,vhdl,Vhdl,有人能解释一下为什么这个实现是有效的吗 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; entity Adder is port(A: in std_logic_vector(3 downto 0); B: in std_logic_vector(3 downto 0); SUM: out std_logic_vector(3 downto 0); CO: out std_

有人能解释一下为什么这个实现是有效的吗

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity Adder is
    port(A: in std_logic_vector(3 downto 0);
    B: in std_logic_vector(3 downto 0);
    SUM: out std_logic_vector(3 downto 0);
    CO: out std_logic);
end;

architecture DescriptionAdders of Adder is

signal temp:  std_logic_vector(4 downto 0);
signal temp1: std_logic_vector(4 downto 0);
signal temp2: std_logic_vector(4 downto 0);

begin

temp1 <= '0' & A;
temp2 <= '0' & B;
temp <= std_logic_vector(unsigned(temp1) + unsigned(temp2));

SUM <= temp(3 downto 0);
CO <= temp(4);

end;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用ieee.numeric_std.all;
实体加法器是
端口(A:标准逻辑向量(3到0);
B:标准逻辑向量(3到0);
求和:输出标准逻辑向量(3到0);
CO:输出标准逻辑);
结束;
给出了加法器的结构描述
信号温度:标准逻辑向量(4到0);
信号temp1:std_逻辑_向量(4到0);
信号temp2:std_逻辑_向量(4到0);
开始

temp1这个问题似乎是基于对VHDL模拟如何工作的一个常见误解

process(A, B)
表示在发生
A
B
事件时将触发该过程。过程中发生的是对其他对象的指定

temp1 <= '0' & A;
temp2 <= '0' & B;
temp <= std_logic_vector(unsigned(temp1) + unsigned(temp2));
另一种解决方案是使用变量,变量可以在流程内部发生变化。但请注意,如果使用不当,变量可能会导致逻辑合成困难。此示例将起作用:

process(A, B) is
    variable temp1, temp2 : std_logic_vector(4 downto 0);
begin
    temp1 := '0' & A;
    temp2 := '0' & B;
    temp <= std_logic_vector(unsigned(temp1) + unsigned(temp2));
end process;
还是更灵活一点

process(A, B) is
begin
    temp <= std_logic_vector(
        resize(unsigned(A), temp'length) +
        resize(unsigned(B), temp'length));
end process;

这个问题似乎是基于对VHDL模拟如何工作的一个常见误解

process(A, B)
表示在发生
A
B
事件时将触发该过程。过程中发生的是对其他对象的指定

temp1 <= '0' & A;
temp2 <= '0' & B;
temp <= std_logic_vector(unsigned(temp1) + unsigned(temp2));
另一种解决方案是使用变量,变量可以在流程内部发生变化。但请注意,如果使用不当,变量可能会导致逻辑合成困难。此示例将起作用:

process(A, B) is
    variable temp1, temp2 : std_logic_vector(4 downto 0);
begin
    temp1 := '0' & A;
    temp2 := '0' & B;
    temp <= std_logic_vector(unsigned(temp1) + unsigned(temp2));
end process;
还是更灵活一点

process(A, B) is
begin
    temp <= std_logic_vector(
        resize(unsigned(A), temp'length) +
        resize(unsigned(B), temp'length));
end process;

将分配移动到进程外的临时(另一个进程或使所有三个分配同时进行,这将导致三个进程)。如果灵敏度列表中没有temp1和temp2,则在a或B上的下一个事件之前不会分配temp。Jim Lewis可能会突然出现并指出,VHDL标准的修订版-2008将保留字all作为单个灵敏度列表元素,并将根据规则为隐含的等待语句构造灵敏度列表可在IEEE Std 1076-2008 11.3过程声明和10.2等待声明中找到。(此处为进程中所有赋值语句右侧的任何信号表达式-A、B、temp1和term2)。将赋值移到进程外的temp(另一个进程或使所有三个赋值同时进行,这将详细说明为三个进程)。如果灵敏度列表中没有temp1和temp2,则在a或B上的下一个事件之前不会分配temp。Jim Lewis可能会突然出现并指出,VHDL标准的修订版-2008将保留字all作为单个灵敏度列表元素,并将根据规则为隐含的等待语句构造灵敏度列表可在IEEE Std 1076-2008 11.3过程声明和10.2等待声明中找到。(此处为流程中所有赋值语句右侧的任何信号表达式-A、B、temp1和term2)。或使用类型系统,而不是与之对抗;声明A、B和Temp的类型为unsigned,然后
Temp或更好地使用-2008和IEEE软件包numeric_std_unsigned,将std_logic_vector视为unsigned。或者使用类型系统,而不是与之对抗;声明类型为unsigned的A、B和Temp,然后
Temp或更好地使用-2008和IEEE软件包numeric_std_unsigned,将std_逻辑_向量视为unsigned。