#vhdl
#vhdl
Вопрос:
Я бьюсь головой три дня подряд из-за этой проблемы .. то есть я не могу вставить задержки в полные сумматоры 3-битного RCA. К сожалению, я пытался добавить их в код полного сумматора, но только один полный сумматор учитывает задержку, а два других — нет. Итак, я хотел узнать, можно ли добавить задержки к 3-битному коду RCA конкретно в разделе карта портов.
Помогите мне выбраться из этого.
Спасибо
Вот мой код…
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity RCA_3 is
Port (
A : in STD_LOGIC_VECTOR (2 downto 0);
B : in STD_LOGIC_VECTOR (2 downto 0);
Cin : in STD_LOGIC;
S : out STD_LOGIC_VECTOR ( 2 downto 0);
Cout : out STD_LOGIC);
end RCA_3;
architecture Behavioral of RCA_3 is
component full_adder
Port (
a : in STD_LOGIC;
b : in STD_LOGIC;
cin : in STD_LOGIC;
sum : out STD_LOGIC;
cout : out STD_LOGIC);
end component;
signal c1,c2: STD_LOGIC;
begin
--here i have a trouble
process is
begin
wait for 10 ns;
FA1: full_adder port map( a => A(0), b => B(0), cin => Cin, sum => S(0), cout => c1);
wait for 10 ns;
FA2: full_adder port map( a => A(1), b => B(1), cin => c1, sum => S(1), cout => c2);
wait for 10 ns;
FA3: full_adder port map( a => A(2), b => B(2), cin => c2, sum => S(2), cout => Cout);
wait for 10 ns;
end process;
end Behavioral;
Комментарии:
1. Ваши экземпляры FA находятся в процессе, это неправильно.
2. и как мне добавить задержки к полным сумматорам?
Ответ №1:
Я не знаю вашего кода FullAdder, но я думаю, что это что-то вроде этого:
entity full_adder is
Port (
a : in STD_LOGIC;
b : in STD_LOGIC;
cin : in STD_LOGIC;
s : out STD_LOGIC;
cout : out STD_LOGIC);
end full_adder;
architecture bhv of full_adder is
begin
s <= a XOR b XOR cin;
cout <= (a AND b) OR (cin AND a) OR (cin AND b);
end bhv;
Теперь вы можете просто написать что-то вроде этого:
s <= a XOR b XOR cin after 10 ns;
cout <= (a AND b) OR (cin AND a) OR (cin AND b) after 10 ns;
Вам не понадобится дополнительная задержка при создании экземпляра полного сумматора.
К вашему сведению: вы можете использовать оператор for-generate-для создания более общей реализации вашего полного сумматора.
И я рекомендую вам использовать STD_ULOGIC вместо STD_LOGIC, потому что в большинстве случаев вы не хотите, чтобы у сигнала было несколько драйверов. Особенно при написании кода для ПЛИС или ASIC, вы должны избегать таких сигналов, пока не будете знать, что делаете или как с ними обращаться.
Комментарии:
1. Я пытался, как вы сказали, но проблема в том, что: -первый полный сумматор возвращает бит суммы через 10 нс -второй полный сумматор возвращает бит суммы через 20 нс — последний полный сумматор возвращает бит суммы через 20 нс. Сомнение заключается именно в третьем полном сумматоре. Почему он не возвращает бит суммы через 30 нс?
2. Экземпляры полного сумматора находятся внутри процесса без списка чувствительности. Вы можете либо удалить процесс (я предпочитаю этот способ), либо добавить необходимые сигналы в список чувствительности процесса. Итак, просто напишите: … процесс начинается FA1: карта портов full_adder (a => A (0), b => B (0), cin => Cin, sum => S (0), cout => c1); FA2: карта портов full_adder( a => A (1), b => B (1), cin => c1, sum => S(1), cout => c2); FA3: карта портов full_adder( a => A(2), b => B (2), cin => c2, sum =>S(2), cout => Cout); завершить процесс;
3. я сделал, как вы сказали, но я не понимаю, почему третий полный сумматор возвращает последний бит суммы через 20 нс вместо 30.
4. каковы ваши тестовые значения для a и b? Может быть, попробуйте что-нибудь, где cout FA2 равен 1, тогда вывод FA3 задерживается на 30 нс. Просто попробуйте «010» для a и b
5. вот скриншот моделирования: ibb.co/FJ5XZQg