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

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

То есть если на элемент ИЛИ на один вход подаётся 1 а другой - неопределённый - логика не сработает?

 

Выход просто окажется в том же самом неопределенном состоянии.

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


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

Приветствую!

 

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

...

Вот симуляция триггера - всё работает

...

То есть если на элемент ИЛИ на один вход подаётся 1 а другой - неопределённый - логика не сработает?

Ну теперь понятнее - судя по всему у Вас что то с выходами Q - как они в TB подключенны ?

Поэтому вместо 1 выход триггеров в X переключается - кофликтует с другим источником на Q.

 

Давно в Aledc не работал - но насколько помню можете выбрать любой файл в иерархии и сгенерировать для него TB в том же самом проекте.

 

В доке Aldec или в сети можно (и нужно) найти табличку результата логических операций в зависимости от типа сигналов (0,1,X,U...).

 

Удачи! Rob.

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


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

Добавил установку в триггер, но теперь вопрос - где делать установку в правой программе? Потому что не повлияло на работу обнуление триггера в правой.

image.jpg

 

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


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

Потому-что начальное значение задается в области декларации сигнала

Например:

architecture RTL of testing
    signal shreg : std_logic_vector(2 downto 0) := (others => '0'); -- вот тут задаем начальное значние !
begin

 

И вообще. Я боюсь представить себе, как бы у Вас выглядел 256 битный регистр...

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


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

Потому что не повлияло на работу обнуление триггера в правой.

 

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

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


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

Приветствую!

 

Добавил установку в триггер, но теперь вопрос - где делать установку в правой программе? Потому что не повлияло на работу обнуление триггера в правой.

...

 

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

 

Покажите лучше TB для модуля 3REG

 

Удачи! Rob.

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


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

Потому-что начальное значение задается в области декларации сигнала

Например:

architecture RTL of testing
    signal shreg : std_logic_vector(2 downto 0) := (others => '0'); -- вот тут задаем начальное значние !
begin

 

И вообще. Я боюсь представить себе, как бы у Вас выглядел 256 битный регистр...

 

image.jpg

 

Регистры инициализировались.но ..не работают..

А разработка планируется чтобы не использовать 3 1024-битных регистра)))

 

Приветствую!

 

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

 

Покажите лучше TB для модуля 3REG

 

Удачи! Rob.

 

А разве вставленный блок 4DFF не должен выполнять функцию логики?

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


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

Внесу свои пять копеек.

Первое, из-за чего код нерабочий: сигналы Q0...Q3 присваиваются одновременно внутри процесса и вне его. Симулятор создаст для них по два драйвера один - в '0' по изменению любого сигнала из списка чувствительности, второй - в значение сигналов FF0...FF3. В результате при моделировании получите либо '0', либо 'X'. Про синтез пока даже говорить не стоит.

Cудя по коду вы хотите сделать схему, в которой '1' циклически бегает по выхохам Q0...Q3. Сдвиг вы описали, зацикливание тоже. Осталось задать то, что должно там крутиться. Например, сразу по сбросу выставить схему в одно из устраивающих вас состояний. Потом посмОтрите, как вы будете это все рушить своим входным сигналом.

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


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

Внесу свои пять копеек.

Первое, из-за чего код нерабочий: сигналы Q0...Q3 присваиваются одновременно внутри процесса и вне его. Симулятор создаст для них по два драйвера один - в '0' по изменению любого сигнала из списка чувствительности, второй - в значение сигналов FF0...FF3. В результате при моделировании получите либо '0', либо 'X'. Про синтез пока даже говорить не стоит.

Cудя по коду вы хотите сделать схему, в которой '1' циклически бегает по выхохам Q0...Q3. Сдвиг вы описали, зацикливание тоже. Осталось задать то, что должно там крутиться. Например, сразу по сбросу выставить схему в одно из устраивающих вас состояний. Потом посмОтрите, как вы будете это все рушить своим входным сигналом.

 

Да, предполагается потом на логике реализовать чтобы при сбросе всё выставлялось в ноль, а младший регистр в 1, которая при каждом следующем клоке будет сдвигаться в следующий разряд и переходить в нулевой через или, при этом схема не будет зависеть от количества триггеров (сейчас 4 потом хоть 10) а обнуление приходится делать чтобы не было неопределённых значений.

И можжно ссылку на номера строк листинга где двойное присваивание?

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


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

младший регистр в 1

Вот этого пока не описано. А стоило бы.

 

а обнуление приходится делать чтобы не было неопределённых значений.

Необязательно обнулять. Достаточно чтобы были какие-либо определенные значения. В вашем случае "0001".

 

И можжно ссылку на номера строк листинга где двойное присваивание?

30-я строка блока 4DFF и строки 56-59.

 

при этом схема не будет зависеть от количества триггеров (сейчас 4 потом хоть 10).

Почитайте, как пишутся сдвиговые регистры на VHDL, про тип std_logic_vector и про generic. Как уже намекали выше, ваш код можно сделать параметризируемым и сжать его до нескольких строк (без учета заголовков и объявлений).

Изменено пользователем KalashKS

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


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

Вот этого пока не описано. А стоило бы.

 

Необязательно обнулять. Достаточно чтобы были какие-либо определенные значения. В вашем случае "0001".

 

30-я строка блока 4DFF и строки 56-59.

 

Почитайте, как пишутся сдвиговые регистры на VHDL, про тип std_logic_vector и про generic. Как уже намекали выше, ваш код можно сделать параметризируемым и сжать его до нескольких строк (без учета заголовков и объявлений).

1. Для этого я пока ввёл промежуточный сигнал и 1 генерю им

2. Без обнулений были неопределённые значения

3. 56-59 - почему? это же просто сброс, он может потом раздельным быть, да и на не подключенные выводы ругается симулятор, до этого просто на земле сидел.

4. до generic я ещё не дошёл, мне бы простую схему запустить чтобы с ней разобраться

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


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

1. Для этого я пока ввёл промежуточный сигнал и 1 генерю им

2. Без обнулений были неопределённые значения

 

Если все равно уже добавлен ресет, то можно устанавливать начальное значение по нему, без всяких промежуточных сигналов. Еще раз - дело не в обнулении, а в присвоении конкретных значений вместо дефолтных U, а нулевые они или нет - роли не играет.

 

3. 56-59 - почему? это же просто сброс, он может потом раздельным быть, да и на не подключенные выводы ругается симулятор, до этого просто на земле сидел.

 

Не важно, что это в вашем или чьем-либо другом понимании, с точки зрения языка сигнал может иметь несколько драйверов только в одном процессе. Из приведенного описания получается, что Qi ВСЕГДА равен FFi, но при этом по любому изменению сигналов из списка чувствительности еще и оказывается равен нулю - так не бывает.

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


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

с точки зрения языка сигнал может иметь несколько драйверов только в одном процессе.
С точки зрения языка сигнал может иметь сколько угодно драйверов в сколько угодном количестве процессов. Результат определяется функцией разрешения (если для используемого типа она определена). Вот с точки зрения железа -- да, драйвер может быть только один.

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


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

Вообще я бы посоветовал автору делать сразу правильно. Всё Ваше устройство легко уместить в такой код:

library ieee;
   use ieee.std_logic_1164.all;

entity reg_aclr is
   port
   (
       clk       : in  std_logic;
       aclr      : in  std_logic;
       D         : in  std_logic;
       Q         : out std_logic_vector(3 downto 0)
   );
end entity;

architecture RTL of reg_aclr is
   signal shreg: std_logic_vector(3 downto 0) := (others => '0');
begin
   process(aclr, clk) 
   begin
       if (aclr = '1') then                      
           shreg <= (others => '0');                       
       elsif (rising_edge(clk)) then
           shreg <=   shreg(2 downto 0) & (D or shreg(3));
       end if;
   end process;
   Q <= shreg;
end architecture;

Более того, при необходимости можно добавить параметры для настройки разрядности такого регистра и хоть 1000 разрядов делайте :rolleyes:

 

Если цель состоит описать именно из отдельных триггеров (правда зачем ?) то можно:

1. Описать отдельно DFF с асинхронным сбросом :

 

library ieee;
   use ieee.std_logic_1164.all;

entity DFF_aclr is
   port
   (
       clk       : in  std_logic;
       aclr      : in  std_logic;
       D         : in  std_logic;
       Q         : out std_logic := '0'
   );
end entity;
architecture RTL of DFF_aclr is
begin
   reg_proc : process(aclr, clk)
   begin
       if (aclr = '1') then
           Q <= '0';
       elsif (rising_edge(clk)) then   
           Q <= D;
       end if;
   end process;  
end architecture;

 

2. И описать соединение триггеров между собой:

library ieee;
   use ieee.std_logic_1164.all;

entity reg_aclr is
   port
   (
       clk       : in  std_logic;
       aclr      : in  std_logic;
       D         : in  std_logic;
       Q         : out std_logic_vector(3 downto 0)
   );
end entity;

architecture RTL of reg_aclr is
   signal iQ: std_logic_vector(3 downto 0) := (others => '0');
begin
   --===============================================
   -- Первый триггер в цепочке сдвигового регистра
   --===============================================
   DFF0_aclr_comp : entity work.DFF_aclr
   port map
   (
       clk     => clk,
       aclr    => aclr,
       D       => D or iq(3),
       Q       => iQ(0)
   );

   --===============================================
   -- Остальные триггера
   --===============================================
   reg_3to1generate : for i in 0 to 2 generate
       DFF_aclr_comp : entity work.DFF_aclr
       port map
       (
           clk     => clk,
           aclr    => aclr,
           D       => iQ(i),
           Q       => iQ(i + 1)
       );
   end generate;
   Q <= iQ;
end architecture;

И опять же. В такое описание легко добавить параметры для задания разрядности регистра.

 

 

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


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

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

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

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

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

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

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

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

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

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