1 бит ALU, чьи операции зависят от переноса в
Я должен спроектировать 1-битный ALU для назначения, который затем будет повторно использован для создания 4-х блоков и 4-битного ALU.
1 бит ALU имеет 2 строки выбора и входы A, B и перенос.
Моя проблема в том, что строки выбора И флаг переноса выбирают, какую операцию выбрать. Я просто понятия не имею, как использовать строки выбора и флаг переноса одновременно для выбора операции.
Например, строки выбора "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 ответ
Похоже, что вам не хватает того, что вы можете иметь вложенные операторы case. Ваш код:
carryIn <= '0';
case operation is
when...
carryIn <= '1';
case operation is
when...
Находится на правильных строках, но оператор case должен находиться внутри процесса, и, как говорит Брайан, вы пытаетесь присвоить "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 (возможно, в отдельном процессе), который использует эти простые читаемые операции, чтобы сделать что-то:
case aluOp is
when ADD => ...
when SUBTRACT => ...
и т. д. Ваш код тогда хорошо разделен на "отрабатывать то, что мы собираемся делать" и "делать что-то". Если у вас нет повторяющихся комбинаций переноса / операции, то это, вероятно, не стоит усилий.