flammmable 0 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба В микроконтроллерах для запуская всевозможных аппаратных модулей (АЦП, UART, I2C и т.д.) часто применяется бит запуска. В состоянии покоя он равен лог.0. Если мы хотим запустить модуль, мы устанавливаем данный бит в лог.1. Когда задача завершается, модуль опускает этот же бит в лог.0. В общих чертах, какова концепция написания такого механизма на HDL, что бы не получать "can't resolve multiple constant drivers for net"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба Quote Компилятор не хочет синтезировать устройство, которое будет работать непонятно как. Что должно быть с этим битом, если снаружи его устанавливают в 1, а модуль хочет сбросить в 0? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба 11 минут назад, flammmable сказал: В микроконтроллерах для запуская всевозможных аппаратных модулей (АЦП, UART, I2C и т.д.) часто применяется бит запуска. Делаем автомат. На вход ему подаем сигнал "Старт", в ответ он отдает сигнал "Выполнено". По этому ответному сигналу, сбрасываем "Старт"... Либо сигнал "Старт" ставится на 1 клок и этого может быть достаточно.... На самом деле, в проекте может быть иерархия автоматов, каждый из которых управляет своим уровнем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба Приветствую! 1 minute ago, flammmable said: В микроконтроллерах для запуская всевозможных аппаратных модулей (АЦП, UART, I2C и т.д.) часто применяется бит запуска. В состоянии покоя он равен лог.0. Если мы хотим запустить модуль, мы устанавливаем данный бит в лог.1. Когда задача завершается, модуль опускает этот же бит в лог.0. В общих чертах, какова концепция написания такого механизма на HDL, что бы не получать "can't resolve multiple constant drivers for net"? В общих чертах это триггер с приоритетной логикой установки|сброса always @(posedge clk) begin if (rst) ctrl_bit <=0; else begin if (cpu_wr_ena && (reg_addr==CTRL_ADDR)) begin ctrl_bit <= cpu_wdata[CTRL_BIT_N]; end else if (clear_sig) begin ctrl_bit <= 0; end end end Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 6 декабря, 2018 Опубликовано 6 декабря, 2018 (изменено) · Жалоба Большое спасибо за ответы, но не совсем ясен подход. Грубо говоря, бит старта нужен для обмена сообщениями в обе стороны между двумя независимыми автоматами (для МК - FSM АЛУ и FSM блока I2C, например). В общем случае (как верно указал novikovfb) ситуация неоднозначна, если программа МК со стороны АЛУ пытается удержать бит в лог.1, а блок пытается этот бит опустить. Но это лишь значит, что надо как-то указать, какой автомат для этого бита главнее или, что какое либо из двух состояний бита приоритетнее. В подходе iosifk я так понял, что условное АЛУ отправляет по одному биту ("Старт") команду запуска. Условный блок I2C доделав работу по другому биту ("Выполнено") передает в АЛУ признак завершения. И само АЛУ по получении этого признака переключает бит "Старт" в лог.0. Есть ли какая либо возможность, что бы передача команды запуска и признака завершения велась через один бит? В подходе RobFPGA я так понял, что бит для внешней команды запуска это cpu_wdata [CTRL_BIT_N]. Эмм. Так представленный конечный автомат же не сбрасывает этот бит в лог.0 У AVR была тема, что бит на запуск не сбрасывался периферийным блоком. Т.е. АЛУ должно было для повторного запуска сбросить бит и снова поднять его. Это было не круто. А вот у PIC - именно так, блок сам сбрасывает бит :) P.S. Спасибо за выражение "триггер с приоритетом сброса" попробую оттолкнуть от этого дела. P.P.S. Кажется, есть идея! Изменено 6 декабря, 2018 пользователем flammmable Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба Именно, триггер. Одним сигналом устанавливается, другим сбрасывается, а выход его самого - третий сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба Приветствую! 38 minutes ago, flammmable said: Грубо говоря, бит старта нужен для обмена сообщениями в обе стороны между двумя независимыми автоматами (для МК - FSM АЛУ и FSM блока I2C, например). Вы видите логический единичный бит со стороны CPU и это не значит что он физически и одновременно работает и на ввод и на вывод (если конечно вы не Шредингер и не владеете котом ;) ) 38 minutes ago, flammmable said: ... если программа МК со стороны АЛУ пытается удержать бит в лог.1, а блок пытается этот бит опустить. Но это лишь значит, что надо как-то указать, какой автомат для этого бита главнее или, что какое либо из двух состояний бита приоритетнее. Для таких случаем есть wire_OR - в 1 линию тянут резистором, а в 0 каждое устройство через буфер с открытым стоком. Но в этом случае арбитраж, управление и передача статуса разнесены во времени и требуют реализации протокола внутри каждого устройства (как пример I2C). Ну и в FPGA такое не применяется. 38 minutes ago, flammmable said: ... Есть ли какая либо возможность, что бы передача команды запуска и признака завершения велась через один бит? Да можно (см. I2C, one_wire,...) - но зачем? Вам нужно чтобы выглядело как в MK или нужен физически один бит? 38 minutes ago, flammmable said: В подходе RobFPGA я так понял, что бит для внешней команды запуска это cpu_wdata [CTRL_BIT_N]. Эмм. Так представленный конечный автомат же не сбрасывает этот бит в лог.0 Не совсем правильно поняли - у меня bit_ctrl это и есть тот бит "внешней команды запуска чего-то там" который устанавливается CPU, а забрасывается из чего-то там через сигнал clear_sig. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться