Перейти к содержанию
    

Не работает схема верхнего уровня

Спасибо за помощь, воспользуюсь обязательно всеми советами, но сейчас хочется разобраться почему мой код не работает и как его запустить, чтобы понять где ошибка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за помощь, воспользуюсь обязательно всеми советами, но сейчас хочется разобраться почему мой код не работает и как его запустить, чтобы понять где ошибка.

А скиньте код в виде текста )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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\;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запустил на Modelsim

1. Пока не убрал слеши из названия модулей не работало.

Теперь файлы регистра выглядит так:

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. Убрал ненужные библиотеки. Зачем Вы их подключали я не знаю. Но в принципе они не влияли никак.

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;

 

С таким тестбенчем все работает как и должно:

 

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\

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в чем проблема теперь? Подайте сброс, подайте ваш RS меньше чем на такт, на такт, два, четыре. Посмотрите, как именно у вас не работает. Подскажу, если подадите на один такт, работать будет, но, скорее всего, только один раз. А потом послушайте совета, сбрасывайте один из тригеров в '1' и используйте для перезапуска сигнал RST.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Пока не убрал слеши из названия модулей не работало.
Там имя архитектуры совпадает с именем модуля. Почему-то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я даже и не заметил :rolleyes: . Во всяком случае ни Quartus ни Modelsim не ругались на это. Да и навскидку не помню, чтобы так нельзя было делать. Хотя я даже не думаю про это. Ибо у меня они всегда называются одинаково: либо RTL либо Behavoral

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там имя архитектуры совпадает с именем модуля. Почему-то.

Я практически всегда так пишу, еще никто не ругался :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всю жизнь думал, что имена entity и связанного с ним архитектурного тела должны быть разными.

Ну и ладно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вывод : я предполагаю, что некорректные имена вида \name\

 

Убрал слэши и стало ещё хуже, их то генерила сама прога, поэтому когда я их убрал - вся структура проекта рухнула

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убрал слэши и стало ещё хуже, их то генерила сама прога, поэтому когда я их убрал - вся структура проекта рухнула

Значит симулятор кривой, либо настройки где-то не те. Код работает правильно. Modelsim я доверяю больше чем ActiveHDL. То что я скинул работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас же раньше все моделировалось. Иксы были, почти там, где надо. Там, где не надо, вероятно, вызывались рукописной задержкой присвоения на 1 ns. Покажите, что получается сейчас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С именами \name\ всё нормально. Это расширенные идентификаторы, появившиеся в VHDL'93.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С именами \name\ всё нормально. Это расширенные идентификаторы, появившиеся в VHDL'93.

А вот Modelsim ALTERA STARTER EDITION 10.1d не нравится. Сейчас специально проверил.

Пишет что :

Component instance "U10 : DFF_aclr" is not bound.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переписал проект

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;

image.png

Тестбенч генерил методами синтезатора, не знаю как текст такой ввести, вот результат - тот же самый, тригеры не переключаются.

 

На совпадение имён не обращайте внимания, заметил, поправил, ничего не изменилось

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...