|
|
  |
Не работает схема верхнего уровня, Помощь в освоении VHDL |
|
|
|
May 11 2018, 09:18
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 12-12-06
Из: Москва
Пользователь №: 23 439

|
Код library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_signed.all; use IEEE.std_logic_unsigned.all;
entity \3REG\ is port( CLKT : in STD_LOGIC; RS : in STD_LOGIC; RST : in STD_LOGIC; Q : out STD_LOGIC_VECTOR(0 to 3):= (others => '0') ); end \3REG\;
architecture \3REG\ of \3REG\ is
component \4DFF\ port ( CLK : in STD_LOGIC; D0,D1,D2,D3 : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC ); end component;
signal D0 : STD_LOGIC; signal QT0,QT1,QT2,QT3 : STD_LOGIC := '0';
begin U10 : \4DFF\ port map( CLK => CLKT, D0 => D0, D1 => QT0, D2 => QT1, D3 => QT2, Q0 => QT0, Q1 => QT1, Q2 => QT2, Q3 => QT3, RS0 => RST, RS1 => RST, RS2 => RST, RS3 => RST );
Q(3) <= QT3; Q(2) <= QT2; Q(1) <= QT1; Q(0) <= QT0; D0 <= RS or QT3;
end \3REG\; и исправленный тригер Код library IEEE; use IEEE.STD_LOGIC_1164.all;
entity \4DFF\ is port( D0,D1,D2,D3 : in STD_LOGIC; CLK : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC := '0' ); end \4DFF\;
architecture \4DFF\ of \4DFF\ is begin process( CLK,RS0,RS1,RS2,RS3 ) begin if ( RS0='1') then Q0 <= '0'; elsif ( rising_edge (CLK)) then Q0 <= D0; end if; if ( RS1='1') then Q1 <= '0'; elsif ( rising_edge (CLK)) then Q1 <= D1; end if; if ( RS2='1') then Q2 <= '0'; elsif ( rising_edge (CLK)) then Q2 <= D2; end if; if ( RS3='1') then Q3 <= '0'; elsif ( rising_edge (CLK) ) then Q3 <= D3; end if; end process; end \4DFF\;
|
|
|
|
|
May 11 2018, 09:39
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Запустил на Modelsim 1. Пока не убрал слеши из названия модулей не работало. Теперь файлы регистра выглядит так: CODE library ieee; use ieee.std_logic_1164.all;
entity DFF_aclr is port ( D0,D1,D2,D3 : in STD_LOGIC; CLK : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC := '0' ); end DFF_aclr;
architecture DFF_aclr of DFF_aclr is begin process ( CLK, RS0, RS1, RS2, RS3 ) begin if (RS0='1') then Q0 <= '0'; elsif (rising_edge (CLK)) then Q0 <= D0; end if;
if (RS1='1') then Q1 <= '0'; elsif (rising_edge (CLK)) then Q1 <= D1; end if;
if (RS2='1') then Q2 <= '0'; elsif (rising_edge (CLK)) then Q2 <= D2; end if;
if (RS3='1') then Q3 <= '0'; elsif (rising_edge (CLK)) then Q3 <= D3; end if; end process; end DFF_aclr; 2. Убрал ненужные библиотеки. Зачем Вы их подключали я не знаю. Но в принципе они не влияли никак. CODE library IEEE; use IEEE.std_logic_1164.all; entity reg_aclr is port( CLKT : in STD_LOGIC; RS : in STD_LOGIC; RST : in STD_LOGIC; Q : out STD_LOGIC_VECTOR(0 to 3):= (others => '0') ); end reg_aclr;
architecture reg_aclr of reg_aclr is
component DFF_aclr port ( CLK : in STD_LOGIC; D0,D1,D2,D3 : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC ); end component;
signal D0 : STD_LOGIC; signal QT0,QT1,QT2,QT3 : STD_LOGIC := '0';
begin U10 : DFF_aclr port map( CLK => CLKT, D0 => D0, D1 => QT0, D2 => QT1, D3 => QT2, Q0 => QT0, Q1 => QT1, Q2 => QT2, Q3 => QT3, RS0 => RST, RS1 => RST, RS2 => RST, RS3 => RST );
Q(3) <= QT3; Q(2) <= QT2; Q(1) <= QT1; Q(0) <= QT0; D0 <= RS or QT3; end reg_aclr; С таким тестбенчем все работает как и должно: CODE LIBRARY ieee; USE ieee.std_logic_1164.all;
ENTITY reg_aclr_vhd_tst IS END reg_aclr_vhd_tst; ARCHITECTURE reg_aclr_arch OF reg_aclr_vhd_tst IS -- constants -- signals SIGNAL CLKT : STD_LOGIC; SIGNAL Q : STD_LOGIC_VECTOR(0 TO 3); SIGNAL RS : STD_LOGIC := '0'; SIGNAL RST : STD_LOGIC := '0'; COMPONENT reg_aclr PORT ( CLKT : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(0 TO 3); RS : IN STD_LOGIC; RST : IN STD_LOGIC ); END COMPONENT; --▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ --======================================================================== -- Формирование констант для вычисления периодв CLK от частоты работы --======================================================================== constant clk_freq : real := 100.0; -- MHz constant clk_prd : time := (1000.0/clk_freq) * 1.0 ns; -- Вычисление периода CLK BEGIN i1 : reg_aclr PORT MAP ( -- list connections between master ports and signals CLKT => CLKT, Q => Q, RS => RS, RST => RST ); --========================================== -- Задание тактовой частоты проекта --========================================== process begin CLKT <= '0'; wait for clk_prd/2; CLKT <= '1'; wait for clk_prd/2; end process; process begin wait for 15*clk_prd; RS <= '1'; wait for clk_prd; RS <= '0'; wait; end process; process begin wait for 50*clk_prd; RST <= '1'; wait for 3*clk_prd; RST <= '0'; wait; end process;
END reg_aclr_arch; Вывод : я предполагаю, что некорректные имена вида \name\
|
|
|
|
|
May 11 2018, 09:39
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
А в чем проблема теперь? Подайте сброс, подайте ваш RS меньше чем на такт, на такт, два, четыре. Посмотрите, как именно у вас не работает. Подскажу, если подадите на один такт, работать будет, но, скорее всего, только один раз. А потом послушайте совета, сбрасывайте один из тригеров в '1' и используйте для перезапуска сигнал RST.
|
|
|
|
|
May 11 2018, 09:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(призрак @ May 11 2018, 12:18)  use IEEE.std_logic_arith.all; use IEEE.std_logic_signed.all; use IEEE.std_logic_unsigned.all; Во-первых, эти библиотеки вам не нужны, если вы не используете математические функции. В-вторых, использование std_logic_signed и std_logic_unsigned в одном модуле несколько странно. В-третьих, не используйте их вообще. Используйте стандартную библиотеку numeric_std Цитата(Flip-fl0p @ May 11 2018, 12:39)  Пока не убрал слеши из названия модулей не работало. Там имя архитектуры совпадает с именем модуля. Почему-то.
|
|
|
|
|
May 11 2018, 10:03
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 7-02-11
Пользователь №: 62 755

|
Цитата(andrew_b @ May 11 2018, 12:45)  Там имя архитектуры совпадает с именем модуля. Почему-то. Я практически всегда так пишу, еще никто не ругался  .
|
|
|
|
|
May 11 2018, 10:49
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(andrew_b @ May 11 2018, 13:40)  С именами \name\ всё нормально. Это расширенные идентификаторы, появившиеся в VHDL'93. А вот Modelsim ALTERA STARTER EDITION 10.1d не нравится. Сейчас специально проверил. Пишет что : Цитата Component instance "U10 : DFF_aclr" is not bound.
|
|
|
|
|
May 11 2018, 12:09
|

Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 12-12-06
Из: Москва
Пользователь №: 23 439

|
Переписал проект Код library IEEE; use IEEE.STD_LOGIC_1164.all;
entity REG30 is port( CLKR : in STD_LOGIC; RS0 : in STD_LOGIC; RST : in STD_LOGIC; Q : out STD_LOGIC_VECTOR(0 to 3) := (others => '0') ); end REG30;
architecture RTL of REG30 is component DFF4 port ( CLK : in STD_LOGIC; D0,D1,D2,D3 : in STD_LOGIC; RS0,RS1,RS2,RS3 : in STD_LOGIC; Q0,Q1,Q2,Q3 : out STD_LOGIC ); end component;
signal D0 : STD_LOGIC; signal QT0,QT1,QT2,QT3 : STD_LOGIC := '0';
begin
U1 : DFF4 port map( CLK => CLKR, D0 => D0, D1 => QT0, D2 => QT1, D3 => QT2, Q0 => QT0, Q1 => QT1, Q2 => QT2, Q3 => QT3, RS0 => RS0, RS1 => RS0, RS2 => RS0, RS3 => RS0 );
Q(3) <= QT3; Q(2) <= QT2; Q(1) <= QT1; Q(0) <= QT0; D0 <= RST or QT3;
end architecture;  Тестбенч генерил методами синтезатора, не знаю как текст такой ввести, вот результат - тот же самый, тригеры не переключаются. На совпадение имён не обращайте внимания, заметил, поправил, ничего не изменилось
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|