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

Как сделать двунаправленный бит (как в микроконтроллерах)?

В микроконтроллерах для запуская всевозможных аппаратных модулей (АЦП, UART, I2C и т.д.) часто применяется бит запуска.
В состоянии покоя он равен лог.0. Если мы хотим запустить модуль, мы устанавливаем данный бит в лог.1. Когда задача завершается, модуль опускает этот же бит в лог.0.

В общих чертах, какова концепция написания такого механизма на HDL, что бы не получать "can't resolve multiple constant drivers for net"?

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


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

Quote

 

Компилятор не хочет синтезировать устройство, которое будет работать непонятно как. Что должно быть с этим битом, если снаружи его устанавливают в 1, а модуль хочет сбросить в 0?

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


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

11 минут назад, flammmable сказал:

В микроконтроллерах для запуская всевозможных аппаратных модулей (АЦП, UART, I2C и т.д.) часто применяется бит запуска.

Делаем автомат. На вход ему подаем сигнал "Старт", в ответ он отдает сигнал "Выполнено". По этому ответному сигналу, сбрасываем "Старт"... Либо сигнал "Старт" ставится на 1 клок и этого может быть достаточно....

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

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


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

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

1 minute ago, flammmable said:

В микроконтроллерах для запуская всевозможных аппаратных модулей (АЦП, UART, I2C и т.д.) часто применяется бит запуска.
В состоянии покоя он равен лог.0. Если мы хотим запустить модуль, мы устанавливаем данный бит в лог.1. Когда задача завершается, модуль опускает этот же бит в лог.0.

В общих чертах, какова концепция написания такого механизма на HDL, что бы не получать "can't resolve multiple constant drivers for net"?

В общих чертах  это триггер  :unknw: с приоритетной логикой установки|сброса

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.

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


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

Большое спасибо за ответы, но не совсем ясен подход.
Грубо говоря, бит старта нужен для обмена сообщениями в обе стороны между двумя независимыми автоматами (для МК - FSM АЛУ и FSM блока I2C, например).
В общем случае (как верно указал novikovfb) ситуация неоднозначна, если программа МК со стороны АЛУ пытается удержать бит в лог.1, а блок пытается этот бит опустить. Но это лишь значит, что надо как-то указать, какой автомат для этого бита главнее или, что какое либо из двух состояний бита приоритетнее.
В подходе iosifk я так понял, что условное АЛУ отправляет по одному биту ("Старт") команду запуска. Условный блок I2C доделав работу по другому биту ("Выполнено") передает в АЛУ признак завершения. И само АЛУ по получении этого признака переключает бит "Старт" в лог.0.
Есть ли какая либо возможность, что бы передача команды запуска и признака завершения велась через один бит?
В подходе RobFPGA я так понял, что бит для внешней команды запуска это cpu_wdata [CTRL_BIT_N]. Эмм. Так представленный конечный автомат же не сбрасывает этот бит в лог.0

У AVR была тема, что бит на запуск не сбрасывался периферийным блоком. Т.е. АЛУ должно было для повторного запуска сбросить бит и снова поднять его. Это было не круто.
А вот у PIC - именно так, блок сам сбрасывает бит :)
P.S. Спасибо за выражение "триггер с приоритетом сброса" попробую оттолкнуть от этого дела.
P.P.S. Кажется, есть идея!

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

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


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

Именно, триггер. Одним сигналом устанавливается, другим сбрасывается, а выход его самого - третий сигнал.

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


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

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

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.

 

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


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

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

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

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

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

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

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

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

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

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