1位ALU,其操作取决于进位

时间:2015-01-25 19:34:44

标签: vhdl alu

我必须为一个赋值设计一个1位ALU,然后重新使用它来制作4个单元和一个4位ALU。

1位ALU有2条选择线,输入A,B和a进位。

我的问题是选择行和进位标志选择要选择的操作。我不知道如何使用选择行和同时携带标志来选择操作。

例如,选择行" 00"和Cin" 0"是一个添加操作,而Cin" 1"是减法。

我能完成以下的工作吗?谢谢你的帮助。

entity ALU1Bit is
port(
    A:  IN std_logic_vector;
    B:  IN std_logic; 
    carryIn:      IN std_logic;                                  
    operation: IN std_logic_vector(1 downto 0); 

    F:   OUT std_logic;
    carryOut: OUT std_logic
    );
end ALU1Bit;

architecture Behavioral of ALU1Bit is

component Adder1Bit
port(
    carryIn:  IN std_logic;
    A: IN std_logic;
    B: IN std_logic;

    output:  OUT std_logic;
    F: OUT std_logic
    );
end component;

begin
carryIn <= '0';
    case operation is
        when...
carryIn <= '1';
    case operation is
        when...

end Behavioral;

1 个答案:

答案 0 :(得分:0)

您缺少的是您可以拥有嵌套的case语句。你的代码:

carryIn <= '0';
    case operation is
        when...
carryIn <= '1';
    case operation is
        when...

处于正确的行,但是case语句必须在一个进程中,并且正如Brian所说,你试图将“0”和“1”分配给carryIn输入,这是不允许的。我认为你对这两行的意思是让它们像另一个案例陈述一样工作。你想要更像的东西:

process (carryIn, operation, ...)
begin
    case carryIn is
        when '0' =>
            case operation is
                when "00" => ...
                when "01" => ..
            end case;
        when '1' =>
            case operation is =>
            ...
    end case;
end process;

您可能会遇到重叠的情况,即在此结构中实际执行相同操作的两个或更多个案例。这很糟糕,因为每次你需要改变这些情况下发生的事情时,你必须改变它们两次,这很容易出错。

在这种情况下,您可以使用一个case语句,如上所述,只是使用枚举类型分配操作模式,例如:

type ALU_OP_type is (ADD, SUBTRACT, ...);
signal aluOp : ALU_OP_type;

然后在你的过程中:

    case carryIn is
        when '0' =>
            case operation is
                when "00" => aluOp <= ADD;
                when "01" => aluOp <= SUBTRACT;

等。最后是另一个案例陈述(可能在一个单独的过程中),它使用这些简单的可读操作来做某事:

    case aluOp is
        when ADD => ...
        when SUBTRACT => ...

等。然后你的代码很好地分为“解决我们要做的事情”和“做点什么”。如果你没有重复的carryIn / operation组合,那么这可能是不值得的。