МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Входы и выходы

Входы и выходы 10 мес. 2 нед. назад #7520

  • kolyan
  • kolyan аватар Автор темы
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 0
Здравствуйте.

Всех с наступившим Новым Годом и у меня новый вопрос.

У ПЛИСин все хорошо, но выход может быть только в двух состояниях:
Вход и выход (тристэйт - не рассматриваем, это, как я понимаю - отсутствие подтяжки). А если там читать надо и писать? Например, I2C, где надо писать, а потом Аки читать?

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от kolyan.

Входы и выходы 10 мес. 2 нед. назад #7521

Для этого используются буферры ввода/вывода с 3-м состоянием, т.е. Z - высокоимпедансным состоянием (например в библиотеке buffers->primitives->alt_iobuf если в схематике). В случае I2C используется "монтажное или", в этом случае с точки зрения устройства выход может быть либо "0" либо "Z", которое с помощью внешнего подтягивающего резистора превращается в "1". Все зависит от конкретной реализации.
Спасибо сказали: kolyan

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Входы и выходы 10 мес. 1 нед. назад #7522

  • kolyan
  • kolyan аватар Автор темы
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 0
Еще раз, - Спасибо!

Схемку посмотрел и стало понятно. Для такого надо не одну, а две лапы. Одна на вход, вторая на выход. Расточительно, если много двунаправленных ножек надо.

Уже даже представил, как это описать.

module inout (in, out);
input wire in;
output reg out;
reg state; // 0 - write, 1 - read
....
endmodule

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

Я правильно понял?

UPD
А есть возможность не описывать лапы отдельно, а тупо объединить?

UPD2
Разная переферия работает на разных частотах (для i2c надо делить до килогерц, у SPI - свои чатоты). Корректно ли в ПЛИС использовать что-то типа прерываний?
Ну, там загрузилось все, выставил регистр, что данные есть и ПЛИСина их начинает обрабатывать.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от kolyan.

Входы и выходы 10 мес. 1 нед. назад #7523

Не совсем так. Забудь о микроконтроллерном подходе "а ля прерывания", ты здесь пишешь не программу а описываешь то как будет работать железо. Представь себе что у тебя есть простые цифровые микрухи рассыпухой (логические элементы) и ты собираешь схему, но не паяльником а описываешь это текстом. Это подход ПЛИС. Из рассыпухи тоже можно собрать процессор, и только тогда можно говорить о прерываниях. Почитай инфу по архитектуре процессоров и я думаю ситуация проясниться. В ПЛИС есть только сигналы, никаких программ в понятии процессора или микроконтроллера. Одно время сам немного недопонимал в чем разница.
Приведу простой пример. Например на Verilog цикл "for" плодит элементы сколько укажешь в "цикле" столько и создаст по одной копии на один "цикл" и выполняться это будет не так как в микроконтроллере на каждый цикл определенное количество тактов, а паралельно. Надеюсь внятно объяснил.
Теперь вернусь к входам/выходам. Есть буфферный элемент в котором есть спец сигнал включения 0 или 1, и по этому сигналу определяешь что это будет вход или выход. теперь немного о коде.
С официального сайта можно позаимствовать такой пример для двунаправленного буфера. Скопипастил, но добавлю пояснений на русском.

module bidirec (oe, clk, inp, outp, bidir); // Модуль с реализацией вход-выход

input oe; //сигнал включающий выход
input clk; //естественно тактируем синхронную логику
input [7:0] inp; // регистр для записи данных
output [7:0] outp; // регистр для записи данных
inout [7:0] bidir; // двунаправленный буфер

reg [7:0] a;
reg [7:0] b;

assign bidir = oe ? a : 8'bZ ; // А вот здесь происходит магия если "1" на выход подаем значение регистра "а"
assign outp = b; // А на выход регистр b

// Always Construct

always @ (posedge clk) // ну вот собственно сам процесс
begin
b <= bidir; //втягиваем в регистр "b" значение из двунаправленного порта, суть в том что в регистр "b" тянем данные с входа в любом случае
a <= inp; // а в регистр а втягиваем значение "inp",
//а здесь продолжение "магии". Мы ведь помним что если oe=1 то "а" попадет на выход, а если oe=0, то на выходе высокий импеданс не позволит bidir сделать КЗ извне, т.е. а будет висеть в воздухе
end

endmodule

Ну а теперь вышеописанный модуль синхронизировать еще каким то образом чтобы не получилось так что мы выдаем на выход 1, а извне пытаются прислать 0, либо наоборот (выход 0 а вход 1) т.к. получается КЗ и как следствие сгорит внешний источник, либо выход на ПЛИС. Аналогичным образом можно и I2C организовать, только выходы всегда будут с открытым коллектором. Тут програмно КЗ устроить не получится.
Так что никаких двух пинов не нужно, учим матчасть, курим мануалы. :)
Спасибо сказали: kolyan

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Входы и выходы 10 мес. 1 нед. назад #7524

  • kolyan
  • kolyan аватар Автор темы
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 0
Я уже начинаю ощущать, что схожу с ума!

>Надеюсь внятно объяснил.

К Вам - претензий нет. Надо как-то в мозгах это наладить. Вот это и не получается. Думал куплю, почитаю язык и быстренько нафигачу все, что хочу. А тут... Потому и исчезаю на пару недель, что многое осмыслить надо. Спасибо большое.

Не обижайтесь, если туплю. Ушел анализировать.

С бидиром не очень понял. Квартус дает назначить лапе вход, или выход. И все. Может, я что-то недоконфигал.

UPD
Все, перечитал, про ое и начал понимать!

UPD2
Но физической лапе-то что надо выставить?

UPD3
Тут я затупил. Извините. Вопрос про лапы - снят. Это я с другой архитектурой перепутал.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от kolyan.

Входы и выходы 10 мес. 1 нед. назад #7525

Тоже пережил подобное когда МК перешел на ПЛИС.
Попробую разъяснить немного еще для описания сути процесса.
module bidirec (oe, clk, inp, outp, bidir) - берем макетную плату, у нас проводками будут подключены: (oe, clk, inp, outp, bidir) и назовем это дело bidirec

input oe; // это проводок (как вариант описывается input wire oe;) который будет подключен к макетке.
inout [7:0] bidir // а это шина из 8 проводков

assign outp = b; - подключем проводок outp напрямую к регистру
assign bidir = oe ? a : 8'bZ ; - а этот проводок будет буффером с разрешающим сигналом oe (это Тернарная условная операция, в данном случае oe - это условие, перед двоеточием - условие выполнено, после двоеточия - условие не выполнено. В двуичном виде 0 это false (условие не выполняется), 1 это true (условие выполняется)

reg [7:0] a; - возьмем микруху а именно 8-разрядный регистр и поместим на плату.

always @ (posedge clk) берем D-триггер, и подключаем к входу синхронизации проводок "clk"

b <= bidir -- тут читаем о блокирующих и не блокирующих присвоениях, здесь на сайте есть ( marsohod.org/verilog )

Еще к слову о "почитать". Выражения "inout [7:0]" и "[7:0]inout " -разные вещи, хотя и передают одну и ту же суть.
вот собственно и все. Дальше компилятор по тексту не выполняет программу а пытается всунуть эту макетку в ПЛИС.
Как то так.

PS: Чтобы разрулить ситуацию с вводом выводом (за исключением монтажного или и обработки коллизий I2C), нужно определиться с главным устройством, которое по проводам будет всем говорить, всем тихо, передаю данные, и все устройства должны выход перевести в высокоимпедансное состояние. А потом устройство по адресу скажи мне что у тебя с регистром, и сам перевести выходы на высокий импеданс. В общем дополнительно понадобится шина управления и определенная иерархия.
Спасибо сказали: kolyan

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от inflamer.

Входы и выходы 10 мес. 1 нед. назад #7526

UPD2
Разная переферия работает на разных частотах (для i2c надо делить до килогерц, у SPI - свои чатоты). Корректно ли в ПЛИС использовать что-то типа прерываний?
Ну, там загрузилось все, выставил регистр, что данные есть и ПЛИСина их начинает обрабатывать.


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

Вообще если так разобраться прежде чем выбирать ПЛИС или микроконтроллер нужно определиться что на самом деле нужно. Если есть алгоритм действий, переферии и скорости достаточно можно использовать микроконтроллер. Если нужна какая то специальная обработка быстрые паралельные вычисления то лучше ПЛИС. Еще одно достоинство в том что на базе ПЛИС можно создать процессор и не выделять отдельный микроконтроллер со своей периферией главное чтобы в ПЛИС хватило логических элеменов (но это может быть затратно), а потом писать под него программу. В микроконтроллере что дали с тем и работай, пиши алгоритм как это делать.
Спасибо сказали: kolyan

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от inflamer.

Входы и выходы 10 мес. 1 нед. назад #7527

  • kolyan
  • kolyan аватар Автор темы
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 0
Я уже Вас благодарить устал. Столько пищи для ума накидали. :)

Спасибо! Хотя, чувствую, что еще глупые вопросы будут!!!

UPD
А с прерываниями - грустно. Они - клевые.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от kolyan.

Входы и выходы 10 мес. 1 нед. назад #7528

kolyan пишет: Я уже Вас благодарить устал. Столько пищи для ума накидали. :)

Спасибо! Хотя, чувствую, что еще глупые вопросы будут!!!

UPD
А с прерываниями - грустно. Они - клевые.


А зачем нужны прерывания и кому они нужны, если ядра процессора (для которого нужны прерывания) по умолчанию нет. А зачем нужны прерывания если все выполняется паралельно, прерывать просто некого... :)

Нарисую 2 схемы с прерываниями и без.
SPI -> прерывание -> процессор -> I2C - Микроконтроллер
SPI -> буффер -> I2C - ПЛИС.

Конечно утрировано но информативно. Естественно в случае ПЛИС еще понадобится обвязка для контроллирования буффера, например счетчик принятых байт по которому I2C будет решать есть что отправить или нет. Так и хочется упомянуть "конечный автомат" (машина состояний)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от inflamer.
  • Страница:
  • 1
Время создания страницы: 0.194 секунд

facebook  GitHub  YouTube  Twitter