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

Описание конечных автоматов

вот как раз за такие финты, я бы своим подаванам уши открутил ... %)) В пределах одного модуля нужно ссылаться только на один уникальный клок идущий из одного места.

 

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

 

...
temp_sub   : entity work.temp_sub port map (clk, a,b,c,d); 
temp_sub_1 : entity work.temp_sub port map (clk1, a1,b1,c1,d1); 
...

 

Ваш код не эквивалентен моему. Смысл моего примера, в том что c и с1 формируются по clk, d и d1 по clk1; Сигналы с,c1,d,d1 должны быть одинаковыми, но сигнал d1 формируется неправильно из за delta задержки clk1. Это фундаментальная проблема симулятора, и для Aldec и для Mentor.

 

 

Для написания теста все средства хороши, лишь бы понятно было и наглядно.

Но, елы-палы, вас же дети читать будут!

К синтезу и проекту для ПЛИС эта конструкцияя имеет отношение 0%.

Если при моделировании синтезируемой схемы хочется наблюдать фронты сигналов с выходов асинхронных элементов, то для этого вам, барин, нужна ¨post place and route simulation model¨. Долго будет думать симулятор, но покажет.

 

Эта конструкция работает на 100 %. При моделировании проекта я хочу видеть фронт сигнала который отличается от фронта клока. Само значение задержки мне не важно, можно 1 ns, можно 0.1. Но эта задержка гарантирует адекватность поведения схемы на модели и в ПЛИС. И всё это мне надо видеть до "post place and route"

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


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

Это фундаментальная проблема симулятора, и для Aldec и для Mentor.

 

Я бы сказал, скорее, что это фундаментальное свойство языка. Поэтому действительно, переназначать клок внутри модуля не стоит

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


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

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

До меня дошло наконец-то. Такого я не встречал еще.

Проблема возникает тут:

clk1 <= clk

В PLD оба сигнала станут одной сетью, но симулятор их не воспринимает как эквивалентные, будут гонки.

Поизучаю, как еще можно с этим бороться.

 

DSMV, а можно ли привести пример такого межмодульного взаимодействия?

 

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

 

Написал этот же код, увидел проблему в симуляторе.

 

--  -----------------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;

entity delta_demo_tb is
    generic (
        CLOCK_PERIOD    : time := 10 ns
    );
end delta_demo_tb;

architecture model of delta_demo_tb is

procedure gen_clock(period : time; signal clk: out std_logic) is
    begin
        loop 
            clk <= '1';
            wait for period /2;
            clk <= '0';
            wait for period /2;
        end loop;
    end gen_clock;

procedure gen_reset(signal clk: in std_logic; signal reset: out std_logic; duration : natural) is
    begin
        reset <= '1';
        for i in 1 to duration loop
            wait until rising_edge(clk);
        end loop;
        reset <= '0';
        loop
            wait for 1000 sec;
        end loop;
    end gen_reset;

signal clk, clk1, reset : std_logic;
signal a,b,c,d : std_logic;

begin

    gen_reset(clk, reset, 3);        -- формируется сигнал reset длиной 3 такта
    gen_clock(10 ns, clk);            -- формируется клок
    clk1 <= clk;                    -- клок клонируется

    process(reset, clk)
        begin
            if reset='1' then
                a <= '0';
                b <= '0';
                c <= '0';
            elsif rising_edge(clk) then
                a <= not a;
                if (a='1') then
                    b <= not b;
                end if;
                c <= a and b;
            end if;
        end process;

    process(reset, clk1)
        begin
            if reset='1' then
                d <= '0';
            elsif rising_edge(clk1) then
                d <= a and b;
            end if;
        end process;
    
end model;

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


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

Поизучаю, как еще можно с этим бороться.

Написал этот же код, увидел проблему в симуляторе.

 

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

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


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

DSMV, а можно ли привести пример такого межмодульного взаимодействия?

 

Вот есть образцово-показательный проект.

 

adp201cp5_v20_adm212x100m.zip

 

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

Это не единственная проблема, встречаются ещё ситуации которые лечатся after 1 ns, хотя такого явного присвоения клока не было.

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


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

Вот есть образцово-показательный проект.

Посмотрел.

Есть какое-то характерное место, чтобы тупо grep-ом не искать?

Симулятор не запускал, просто пролистал.

Нашел тесты, в них можно делать что угодно.

Видел FIFO с разными клоками. Это немного другое. Гонки там - нормальное дело. Но вот если на такое FIFO подать один клок, то будут, хм, отличия между симуляцией и железом. Вы это имеете в виду?

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


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

Это не единственная проблема, встречаются ещё ситуации которые лечатся after 1 ns, хотя такого явного присвоения клока не было.

 

не поверите, ни разу не сталкивался с этим, за исключением специально созданных тестов, за все время работы с фпга на 3-х языках. И даже если бы столкнулся, то не пачкал бы код постоянными after а завернул бы в обертку с транспортными задержками.

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


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

Посмотрел.

Есть какое-то характерное место, чтобы тупо grep-ом не искать?

 

В этом проекте всё работает. Это просто как пример, причём не самый большой.

Кстати, например cl_fifo_control_v2 - автомат написан в виде двух процессов, причём не везде добавлены after 1 ns; И давно работает.

 

не поверите, ни разу не сталкивался с этим, за исключением специально созданных тестов, за все время работы с фпга на 3-х языках. И даже если бы столкнулся, то не пачкал бы код постоянными after а завернул бы в обертку с транспортными задержками.

 

Почему не поверю. Поверю. Работать можно по разному.

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


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

В этом проекте всё работает. Это просто как пример, причём не самый большой.

Кстати, например cl_fifo_control_v2 - автомат написан в виде двух процессов, причём не везде добавлены after 1 ns; И давно работает.

Вы меня пугаете. В cl_fifo_control_v2 один клок, упомянутому эффекту при присвоении клоков взяться неоткуда.

Классически записанный автомат кого-то из Милей с Мурами.

 

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

Если сбой был, то ошибка есть, но если сбоя не было, это не значит, что ошибок нет.

Нужны более убедительные доказательства.

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


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

ко всему, что сказано, почему-то никто не узрел ещё один косяк:

 type stp_type is (s0, s1, s2,s3 );   -- описание типа

 

dsmv, пожалейте себя и разработчиков, которые будут ваш код использовать: не пишите состояния автомата безымянными s0,s1,s2 и т.д. И даже state0,state1 и т.д. не пишите.

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

используйте нормальные, понятные имена - это и наглядней и понятней.

 

поверьте на слово, состояния idle, read_reg,end_packet, wr_data намного понятней и приятней для обозрения, чем s0,s1,s20,s100.

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


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

поверьте на слово, состояния idle, read_reg,end_packet, wr_data намного понятней и приятней для обозрения, чем s0,s1,s20,s100.

 

Верю, иногда даже называю, но редко. Но я хочу сказать, что даже s0,s1 понятней чем если напрямую записывать "001" "010"

 

 

Классически записанный автомат кого-то из Милей с Мурами.

 

Конечно, это классический автомат, но по моему не удобный. В результате у меня получился автомат, который я привёл в начале темы.

Естественно, никому я его не навязываю, даже у себя на работе. Но интересуюсь кто и как пишет.

Пока что было очень интересное сообщение от Shtirlits: http://electronix.ru/forum/index.php?showt...t=0&start=0

Я такого ещё не встречал. Остальные - классические автоматы Мили и Мура. Или я ошибаюсь ?

 

 

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

Естественно, ряд ошибок уже выявлен и исправлен. Если ещё будут выявлены, то и они будут исправлены.

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


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

 

Почитайте вложение. Там дано очень хорошее объяснение. Рекомендую

В принципе например в Xilinx ISE примеры описаний различных конструкций(тригеры, счетчики и т.д.) - смотри скриншот. В квартусе я уверен тоже это есть. Пользуйтесь этим.

FSM_design.pdf

post-24839-1248860991_thumb.jpg

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


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

Почитайте вложение. Там дано очень хорошее объяснение. Рекомендую

В принципе например в Xilinx ISE примеры описаний различных конструкций(тригеры, счетчики и т.д.) - смотри скриншот. В квартусе я уверен тоже это есть. Пользуйтесь этим.

 

Я видел такой документ. Наиболее близкий к моему описанию последний автомат:

 

"VHDL for the “Mealy” machine generated from the Truth Table." Отличие - в формировании сбора, ну и after 1 ns конечно.

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


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

Я видел такой документ. Наиболее близкий к моему описанию последний автомат:

 

"VHDL for the ”Mealy” machine generated from the Truth Table." Отличие - в формировании сбора, ну и after 1 ns конечно.

Тогда в чем вопрос? :)

Зачем писать "after 1 ns" если это для функционального моделирования, а синтезатором это будет игнорироваться?

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


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

Тогда в чем вопрос? :)

Зачем писать "after 1 ns" если это для функционального моделирования, а синтезатором это будет игнорироваться?

 

Собственно меня интересуют нюансы описания КА. После изучения примеров Xilinx, литературы, собственных шишек, у меня получился вариант КА, я привёл его в начале темы.

 

after 1 ns - на мой взгляд обязательная часть, помогает избежать некорректного моделирования, но со мной очень многие не согласны. Я это принимаю как факт, причём совершенно спокойно :)

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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