User Tag List

Показано с 1 по 10 из 2727

Тема: Цифровая археология: 1801 и все-все-все

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    613
    Спасибо Благодарностей отдано 
    18
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    136 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С регистрами в условии чувствительности разобрался, даже вроде как реализовал рабочий вариант.
    А вот с wireм в условии чувствительности возникли проблемы. Возьмём этот always
    Код:
    always @(posedge pin_clk_n or negedge qbus_tena)
    begin
        if (~qbus_tena)
            qbus_timer <= 6'o00;
        else
            if (~qbus_tovf)
                qbus_timer <= qbus_timer + 6'o01;
    end
    допустим, где-то между фронтами частоты, произошло событие "qbus_tena 1->0", при этом этот always сработал, выполнилась часть
    Код:
    qbus_timer <= 6'o00;
    затем случилось событие "posedge pin_clk_n", но qbus_tena остался равен 0, должен ли при этом выполняться код
    Код:
    if (~qbus_tovf)
                qbus_timer <= qbus_timer + 6'o01;
    игнорируя условие "if (~qbus_tena)" или нет?
    У меня работает только такой вариант:
    Код:
    void C1801VM1::eval_all_n()
    {
    ...
    	if (wire.qbus_tena) 
    	{
    		if (!snap_reg.qbus_tovf)
    	        {
    		        reg.qbus_timer = (snap_reg.qbus_timer + 1) & 077;
    	        }
    	}
    ...
    }
    т.е. код по событию "posedge pin_clk_n" выполняется только если qbus_tena == 1, а иначе, если закомментировать строку "if (wire.qbus_tena)" перестаёт работать команда RESET, т.е. она становится бесконечной, и вызывает ошибку зависания на шине.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от gid Посмотреть сообщение
    допустим, где-то между фронтами частоты, произошло событие "qbus_tena 1->0"
    Это событие не может произойти между фронтами частоты. Находим источник qbus_tena:
    Код:
    assign qbus_tena = dout_out | din_out;
    и видим что он зависит от двух регистров dout_out и din_out, которые, в свою очередь
    меняются по clk_p и mjres, последний меняется тоже только по clk_p.
    Поэтому оптимальный порядок при событии clk_p такой:
    - вычислили значение mjres, abort, reset
    - занесли, в виде исключения эти три новых значения в исходное состояние, на базе которого
    будет вычисляться все остальное
    - вычислили din_out, dout_out и производный qbus_tena
    - для qbus_tena опять сделали исключение, сразу заносим в исходное
    - тут можно повычислять еще "исключительные" сигналы, типа tve_reset
    - вычисляем все остальное

    В исходное состояние можно не заносить (если там есть какой анализ изменения ил чего еще),
    но вычисление зависимых блоков надо делать на основе нового значения "исключительных" сигналов.

    Если делать совсем правильно, то считать несколько событий:
    - posedge clk_p
    - posedge reset
    - posedge abort
    - posedge mjres
    - negedge qbus_tena

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

    Цитата Сообщение от gid Посмотреть сообщение
    затем случилось событие "posedge pin_clk_n", но qbus_tena остался равен 0, должен ли при этом выполняться код
    Код:
    if (~qbus_tovf)
                qbus_timer <= qbus_timer + 6'o01;
    игнорируя условие "if (~qbus_tena)" или нет?
    Не должен, почему следует игнорировать условие ~qbus_tena? Оно как раз выполняется при qbus_tena==0, там же инверсия ~. А код стоит в ветке else и он не выполняется.

    Цитата Сообщение от gid Посмотреть сообщение
    У меня работает только такой вариант:
    Код:
    	if (wire.qbus_tena) 
    	{
    		if (!snap_reg.qbus_tovf)
    	        {
    		        reg.qbus_timer = (snap_reg.qbus_timer + 1) & 077;
    	        }
    	}
    Да, тут все правильно, соответствует исходному Верилогу. Если qbus_tena нулевой, то таймер удерживается в сбросе, если ненулевой - идет счет до появления флага переполнения, на нем счет останавливается.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 7
    Последнее: 28.06.2014, 17:50
  2. Микросхемы МПК 580,1801,1810 и другие...
    от Alex_Vac в разделе Барахолка (архив)
    Ответов: 44
    Последнее: 07.04.2012, 08:03
  3. ЦИФРОВАЯ МУЗЫКА НА ZX
    от AAA в разделе Музыка
    Ответов: 98
    Последнее: 18.09.2011, 22:33
  4. Учебный стенд УМПК-1801
    от dk_spb в разделе ДВК, УКНЦ
    Ответов: 2
    Последнее: 12.05.2010, 16:52
  5. Цифровая музыка от Вадима Ермеева
    от zxmike в разделе Музыка
    Ответов: 2
    Последнее: 06.08.2007, 23:13

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •