首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于VHDL的RTL硬件设计实例7.1

基于VHDL的RTL硬件设计实例7.1
EN

Stack Overflow用户
提问于 2018-08-29 06:48:13
回答 2查看 322关注 0票数 1

考虑一个算术电路,它可以执行四种操作: a+b、a+b、a+1和a-1,其中a和b是16位无符号数字,所需的操作由2位控制信号ctrl指定。

是否可以只使用一个加法器而不使用时序逻辑来设计这个电路?

我用2的互补逻辑设计了这个电路,但我不能只添加一个没有记忆元件的加法器(a +(不是b) + 1)。

代码语言:javascript
复制
    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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-29 08:55:28

你自己发现的解决方案是好的,但它使用17位加法器而不是16位加法器。有了足够聪明的合成器,它就不会有任何不同。为了完整起见,这里还有另一个16位(稍微简单一点)的解决方案:

代码语言:javascript
复制
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;

注意:这只适用于VHDL 2008,其中定义了unsignedstd_logic的添加。如果必须使用较早版本的VHDL标准,请使用以下方法:

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2018-08-29 07:37:33

我用Renaud Pacalet的贡献设计了这个电路。

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52071136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档