Tausinov 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба То есть если на элемент ИЛИ на один вход подаётся 1 а другой - неопределённый - логика не сработает? Выход просто окажется в том же самом неопределенном состоянии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Приветствую! И вопрос остался - надо делать отдельный проект для каждого уровня или в одном можно, сейчас вот так ... Вот симуляция триггера - всё работает ... То есть если на элемент ИЛИ на один вход подаётся 1 а другой - неопределённый - логика не сработает? Ну теперь понятнее - судя по всему у Вас что то с выходами Q - как они в TB подключенны ? Поэтому вместо 1 выход триггеров в X переключается - кофликтует с другим источником на Q. Давно в Aledc не работал - но насколько помню можете выбрать любой файл в иерархии и сгенерировать для него TB в том же самом проекте. В доке Aldec или в сети можно (и нужно) найти табличку результата логических операций в зависимости от типа сигналов (0,1,X,U...). Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
npu3pak13 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Добавил установку в триггер, но теперь вопрос - где делать установку в правой программе? Потому что не повлияло на работу обнуление триггера в правой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Потому-что начальное значение задается в области декларации сигнала Например: architecture RTL of testing signal shreg : std_logic_vector(2 downto 0) := (others => '0'); -- вот тут задаем начальное значние ! begin И вообще. Я боюсь представить себе, как бы у Вас выглядел 256 битный регистр... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Потому что не повлияло на работу обнуление триггера в правой. Если сигналу в процессе значение присваивается несколько раз, то актуальным окажется самое последнее из выполненных присвоений, поэтому ничего и не изменилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Приветствую! Добавил установку в триггер, но теперь вопрос - где делать установку в правой программе? Потому что не повлияло на работу обнуление триггера в правой. ... Правая часть генерируется автоматом из вашей схемы. Там нет сигналов из которых получается "триггеры" - только соединения - Добавлять какую либо инициализацию туда бессмыслено. Покажите лучше TB для модуля 3REG Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
npu3pak13 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Потому-что начальное значение задается в области декларации сигнала Например: architecture RTL of testing signal shreg : std_logic_vector(2 downto 0) := (others => '0'); -- вот тут задаем начальное значние ! begin И вообще. Я боюсь представить себе, как бы у Вас выглядел 256 битный регистр... Регистры инициализировались.но ..не работают.. А разработка планируется чтобы не использовать 3 1024-битных регистра))) Приветствую! Правая часть генерируется автоматом из вашей схемы. Там нет сигналов из которых получается "триггеры" - только соединения - Добавлять какую либо инициализацию туда бессмыслено. Покажите лучше TB для модуля 3REG Удачи! Rob. А разве вставленный блок 4DFF не должен выполнять функцию логики? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
npu3pak13 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Я так понимаю у меня где-то должна появиться функция process(CLK,RS,RST) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KalashKS 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Внесу свои пять копеек. Первое, из-за чего код нерабочий: сигналы Q0...Q3 присваиваются одновременно внутри процесса и вне его. Симулятор создаст для них по два драйвера один - в '0' по изменению любого сигнала из списка чувствительности, второй - в значение сигналов FF0...FF3. В результате при моделировании получите либо '0', либо 'X'. Про синтез пока даже говорить не стоит. Cудя по коду вы хотите сделать схему, в которой '1' циклически бегает по выхохам Q0...Q3. Сдвиг вы описали, зацикливание тоже. Осталось задать то, что должно там крутиться. Например, сразу по сбросу выставить схему в одно из устраивающих вас состояний. Потом посмОтрите, как вы будете это все рушить своим входным сигналом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
npu3pak13 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Внесу свои пять копеек. Первое, из-за чего код нерабочий: сигналы Q0...Q3 присваиваются одновременно внутри процесса и вне его. Симулятор создаст для них по два драйвера один - в '0' по изменению любого сигнала из списка чувствительности, второй - в значение сигналов FF0...FF3. В результате при моделировании получите либо '0', либо 'X'. Про синтез пока даже говорить не стоит. Cудя по коду вы хотите сделать схему, в которой '1' циклически бегает по выхохам Q0...Q3. Сдвиг вы описали, зацикливание тоже. Осталось задать то, что должно там крутиться. Например, сразу по сбросу выставить схему в одно из устраивающих вас состояний. Потом посмОтрите, как вы будете это все рушить своим входным сигналом. Да, предполагается потом на логике реализовать чтобы при сбросе всё выставлялось в ноль, а младший регистр в 1, которая при каждом следующем клоке будет сдвигаться в следующий разряд и переходить в нулевой через или, при этом схема не будет зависеть от количества триггеров (сейчас 4 потом хоть 10) а обнуление приходится делать чтобы не было неопределённых значений. И можжно ссылку на номера строк листинга где двойное присваивание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KalashKS 0 10 мая, 2018 Опубликовано 10 мая, 2018 (изменено) · Жалоба младший регистр в 1 Вот этого пока не описано. А стоило бы. а обнуление приходится делать чтобы не было неопределённых значений. Необязательно обнулять. Достаточно чтобы были какие-либо определенные значения. В вашем случае "0001". И можжно ссылку на номера строк листинга где двойное присваивание? 30-я строка блока 4DFF и строки 56-59. при этом схема не будет зависеть от количества триггеров (сейчас 4 потом хоть 10). Почитайте, как пишутся сдвиговые регистры на VHDL, про тип std_logic_vector и про generic. Как уже намекали выше, ваш код можно сделать параметризируемым и сжать его до нескольких строк (без учета заголовков и объявлений). Изменено 10 мая, 2018 пользователем KalashKS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
npu3pak13 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Вот этого пока не описано. А стоило бы. Необязательно обнулять. Достаточно чтобы были какие-либо определенные значения. В вашем случае "0001". 30-я строка блока 4DFF и строки 56-59. Почитайте, как пишутся сдвиговые регистры на VHDL, про тип std_logic_vector и про generic. Как уже намекали выше, ваш код можно сделать параметризируемым и сжать его до нескольких строк (без учета заголовков и объявлений). 1. Для этого я пока ввёл промежуточный сигнал и 1 генерю им 2. Без обнулений были неопределённые значения 3. 56-59 - почему? это же просто сброс, он может потом раздельным быть, да и на не подключенные выводы ругается симулятор, до этого просто на земле сидел. 4. до generic я ещё не дошёл, мне бы простую схему запустить чтобы с ней разобраться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба 1. Для этого я пока ввёл промежуточный сигнал и 1 генерю им 2. Без обнулений были неопределённые значения Если все равно уже добавлен ресет, то можно устанавливать начальное значение по нему, без всяких промежуточных сигналов. Еще раз - дело не в обнулении, а в присвоении конкретных значений вместо дефолтных U, а нулевые они или нет - роли не играет. 3. 56-59 - почему? это же просто сброс, он может потом раздельным быть, да и на не подключенные выводы ругается симулятор, до этого просто на земле сидел. Не важно, что это в вашем или чьем-либо другом понимании, с точки зрения языка сигнал может иметь несколько драйверов только в одном процессе. Из приведенного описания получается, что Qi ВСЕГДА равен FFi, но при этом по любому изменению сигналов из списка чувствительности еще и оказывается равен нулю - так не бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба с точки зрения языка сигнал может иметь несколько драйверов только в одном процессе.С точки зрения языка сигнал может иметь сколько угодно драйверов в сколько угодном количестве процессов. Результат определяется функцией разрешения (если для используемого типа она определена). Вот с точки зрения железа -- да, драйвер может быть только один. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Вообще я бы посоветовал автору делать сразу правильно. Всё Ваше устройство легко уместить в такой код: 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; И опять же. В такое описание легко добавить параметры для задания разрядности регистра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться