使用VHDL的RTL硬件设计,示例7.1 7.1 -考虑一个可以执行四个运算的算术电路:A+B、AB、A+ 1和A-1,其中A和B是16位无符号数,所需的操作由2位控制信号CTRL.指定。

使用VHDL的RTL硬件设计,示例7.1 7.1 -考虑一个可以执行四个运算的算术电路:A+B、AB、A+ 1和A-1,其中A和B是16位无符号数,所需的操作由2位控制信号CTRL.指定。,vhdl,fpga,Vhdl,Fpga,有没有可能只用一个加法器而不用顺序逻辑来设计这个电路 我用2的互补逻辑设计了这个电路,但是我不能把逻辑(a+(不是b)+1)仅仅加上一个没有内存元件的加法器 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Ex_7_1_b is generic( BUS_WIDTH : integer := 16 ); port ( a :

有没有可能只用一个加法器而不用顺序逻辑来设计这个电路


我用2的互补逻辑设计了这个电路,但是我不能把逻辑(a+(不是b)+1)仅仅加上一个没有内存元件的加法器

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.NUMERIC_STD.ALL;

    entity Ex_7_1_b is
         generic( BUS_WIDTH : integer := 16 );
        port ( a : in  STD_LOGIC_VECTOR (BUS_WIDTH - 1 downto 0);
               b : in  STD_LOGIC_VECTOR (BUS_WIDTH - 1 downto 0);
               ctrl : in  STD_LOGIC_VECTOR (1 downto 0);
               y : out  STD_LOGIC_VECTOR (BUS_WIDTH - 1 downto 0)
                );
    end Ex_7_1_b;

    architecture Behavioral of Ex_7_1_b is
        signal adder : unsigned(BUS_WIDTH - 1 downto 0);
        signal mux_sign : unsigned(BUS_WIDTH - 1 downto 0);
        signal mux_inp_sel : unsigned(BUS_WIDTH - 1 downto 0);
        signal mux_val : unsigned(BUS_WIDTH - 1 downto 0);
        signal result : unsigned(BUS_WIDTH - 1 downto 0);
    begin
        mux_val <= to_unsigned(0, mux_val'length) when ctrl(1) = '1' else to_unsigned(1, mux_val'length);
        mux_inp_sel <= mux_val when ctrl(0) = '1' else unsigned(b);
        mux_sign <= not (mux_inp_sel) when ctrl(1) = '1' else mux_inp_sel;

        result <= unsigned(a) + mux_sign;
        y <= std_logic_vector(result);

    end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体Ex_7_1_b为
通用(总线宽度:整数=16);
端口(a:标准逻辑向量(总线宽度-1到0);
b:标准逻辑向量(总线宽度-1到0);
ctrl:在标准逻辑向量中(1到0);
y:输出标准逻辑向量(总线宽度-1到0)
);
结束Ex_7_1_b;
Ex_7_1_b的架构行为是
信号加法器:无符号(总线宽度-1到0);
信号多路复用符号:无符号(总线宽度-1至0);
信号多路输入选择:无符号(总线宽度-1至0);
信号复用值:无符号(总线宽度-1到0);
信号结果:无符号(总线宽度-1到0);
开始

mux_val我用雷诺·帕卡莱设计了这个电路

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Ex_7_1_b is
    generic( g_BUS_WIDTH : integer := 16    );
    port ( 
            i_a : in  std_logic_vector (g_BUS_WIDTH - 1 downto 0);
            i_b : in  std_logic_vector (g_BUS_WIDTH - 1 downto 0);
            i_ctrl : in  std_logic_vector (1 downto 0);
            o_y : out  std_logic_vector (g_BUS_WIDTH - 1 downto 0)
         );
end Ex_7_1_b;

architecture RTL of Ex_7_1_b is
    signal r_A_Ext, r_B_Ext : unsigned(g_BUS_WIDTH downto 0);
    signal r_Carry_In : std_logic;
    signal r_Adder : unsigned(g_BUS_WIDTH - 1 downto 0);
    signal w_Mux_Inv : unsigned(g_BUS_WIDTH - 1 downto 0);
    signal w_Mux_Sel : unsigned(g_BUS_WIDTH - 1 downto 0);
    signal r_Result : unsigned(g_BUS_WIDTH downto 0);
begin
    r_A_Ext <= unsigned(i_a & '1');

    w_Mux_Sel <= to_unsigned(1, w_Mux_Sel'length) when i_ctrl(1) = '1' else unsigned(i_b);
    w_Mux_Inv <= not (w_Mux_Sel) when i_ctrl(0) = '1' else w_Mux_Sel;

    r_Carry_In <= '1' when i_ctrl(0) = '1' else '0';

    r_B_Ext <= w_Mux_Inv & r_Carry_In;

    r_Result <= r_A_Ext + r_B_Ext;
    o_y <= std_logic_vector(r_Result(g_BUS_WIDTH downto 1));
end RTL;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体Ex_7_1_b为
通用(g_总线宽度:整数=16);
港口(
i_a:标准逻辑向量(g_总线宽度-1到0);
i_b:标准逻辑向量(g_总线宽度-1到0);
i\u ctrl:在标准逻辑向量中(1到0);
输出标准逻辑向量(g总线宽度-1到0)
);
结束Ex_7_1_b;
Ex_7_1_b的体系结构RTL是
信号r_A_Ext,r_B_Ext:无符号(g_总线宽度下降至0);
信号r_进位:标准逻辑;
信号r_加法器:无符号(g_总线宽度-1到0);
信号w_Mux_Inv:无符号(g_总线宽度-1到0);
信号w_Mux_Sel:无符号(g_总线宽度-1到0);
信号r_结果:无符号(g_总线宽度下降至0);
开始

r_A_Ext您自己找到的解决方案很好,但它使用17位加法器而不是16位加法器。有了足够智能的合成器,它应该不会有任何区别。为了完整起见,这里有另一个16位(稍微简单一点)的解决方案:

architecture RTL of Ex_7_1_b is
    signal x, y0, y1: unsigned(g_BUS_WIDTH - 1 downto 0);
begin
    x   <= unsigned(i_a);
    y0  <= unsigned(i_b) when i_ctrl(1) = '0' else x"0001";
    y1  <= not y0 when i_ctrl(0) = '1' else y0;
    o_y <= std_logic_vector(x + y1 + i_ctrl(0));
end architecture RTL;

您需要一个带进位输入的16位加法器:
s=x+y+c
,其中
x
y
为16位无符号,
c
为一位进位输入。您已经很清楚,必须在加法器前面使用多路复用器,以便根据
ctrl
计算
a+b+0
a+(非b)+1
a+1+0
a-1+0
。因此,
x
总是等于
a
y
等于
b
不是b
x“0001”
(十六进制表示法)或
x“ffff”
c
等于
'0'
'1'
。使用并发信号分配,完全像这样编码,您就可以完成了。非常感谢,我错过了进位逻辑。这个问题会解决的。
architecture RTL of Ex_7_1_b is
    signal x, y0, y1: unsigned(g_BUS_WIDTH - 1 downto 0);
    signal c: natural range 0 to 1;
begin
    x   <= unsigned(i_a);
    y0  <= unsigned(i_b) when i_ctrl(1) = '0' else x"0001";
    y1  <= not y0 when i_ctrl(0) = '1' else y0;
    c   <= 1 when i_ctrl(0) = '1' else 0;
    o_y <= std_logic_vector(x + y1 + c);
end architecture RTL;