我必须为一个赋值设计一个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;
答案 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组合,那么这可能是不值得的。