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

    

flammmable

Участник
  • Публикаций

    39
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о flammmable

  • Звание
    Участник

Посетители профиля

124 просмотра профиля
  1. Большое спасибо за ответы, но не совсем ясен подход. Грубо говоря, бит старта нужен для обмена сообщениями в обе стороны между двумя независимыми автоматами (для МК - FSM АЛУ и FSM блока I2C, например). В общем случае (как верно указал novikovfb) ситуация неоднозначна, если программа МК со стороны АЛУ пытается удержать бит в лог.1, а блок пытается этот бит опустить. Но это лишь значит, что надо как-то указать, какой автомат для этого бита главнее или, что какое либо из двух состояний бита приоритетнее. В подходе iosifk я так понял, что условное АЛУ отправляет по одному биту ("Старт") команду запуска. Условный блок I2C доделав работу по другому биту ("Выполнено") передает в АЛУ признак завершения. И само АЛУ по получении этого признака переключает бит "Старт" в лог.0. Есть ли какая либо возможность, что бы передача команды запуска и признака завершения велась через один бит? В подходе RobFPGA я так понял, что бит для внешней команды запуска это cpu_wdata [CTRL_BIT_N]. Эмм. Так представленный конечный автомат же не сбрасывает этот бит в лог.0 У AVR была тема, что бит на запуск не сбрасывался периферийным блоком. Т.е. АЛУ должно было для повторного запуска сбросить бит и снова поднять его. Это было не круто. А вот у PIC - именно так, блок сам сбрасывает бит :) P.S. Спасибо за выражение "триггер с приоритетом сброса" попробую оттолкнуть от этого дела. P.P.S. Кажется, есть идея!
  2. В микроконтроллерах для запуская всевозможных аппаратных модулей (АЦП, UART, I2C и т.д.) часто применяется бит запуска. В состоянии покоя он равен лог.0. Если мы хотим запустить модуль, мы устанавливаем данный бит в лог.1. Когда задача завершается, модуль опускает этот же бит в лог.0. В общих чертах, какова концепция написания такого механизма на HDL, что бы не получать "can't resolve multiple constant drivers for net"?
  3. interface connect(); logic flag; endinterface module main (input CLOCK_50, output [7:0]LED); connect main_conn(); assign main_conn.flag = 1; logic clk_main; assign clk_main = CLOCK_50; logic [7:0]my_out; sub_module sub_module(.clk_in(clk_main), .sub_conn(main_conn), .sub_out(my_out)); assign LED[ 7: 0]= my_out[7:0]; endmodule module sub_module(input clk_in, connect sub_conn, output [7:0]sub_out); enum{IDLE, DUMMY_1, DUMMY_2, DUMMY_3, DYMMU_4, STAGE_1//=== Пункт №1 === } FSM; always @(posedge clk_in) begin case(FSM) IDLE: begin sub_out[7:0]<='b10101010; if(sub_conn.flag) //=== Пункт №2 === begin FSM <= STAGE_1; end end STAGE_1: begin sub_out[7:0]<='b11000011; FSM <= STAGE_1;//=== Пункт №3 === end default begin sub_out[7:0]<=FSM; end endcase end endmodule По идее приведенный код должен выдавать на LED последовательность 11000011: 1) ПЛИС стартует с обнуленными регистрами 2) срабатывает IDLE 3) т.к. main_conn.flag = 1, то FSM переключается в состояние STAGE_1 4) на следующем клоке в LED выдается 11000011, а FSM переводится в состояние STAGE_1, хотя он уже и так в нем. И так действительно работает, если закомментировать "пункт №3" и/или "пункт №2". Или в пункте №2 в качестве условия поставить "1". Или пробрасывать в условие значение из модуля "main", но не через интерфейс, а через logic/wire. Если же всё выполняется, как написано, то результат будет 11111010. Т.е. у case срабатывает ветка default и выдается текущее значение FSM, а оно оказывается равно инвертированному значению STAGE_1 (т.е. если удалить DUMMY_3 и DUMMY_4, то результатом работы будет 11111100). Проверял на самодельной плате с 10M02SCE144C8G и на DE0-NANO c EP4CE22F17C6N. Среда - Quartus 17.1 Lite. Что это такое, господа?
  4. Спасибо за совет. Прочитал. Interface это - то, что надо :)
  5. В языках Си и SystemVerilog есть такой удобный элемент языка, как структуры. Он позволяет объединять переменные (и другие структуры) в иерархию, а в дальнейшем абстрагироваться от внутреннего устройства структуры. Благодаря абстрагированию возможно эффективно разделять большую задачу на малые и решать их по отдельности. В Си переменную структурного типа можно передавать в качестве аргумента, возвращать в качестве значения, создавать массив и т.д. Таким образом механизм структур удается активно задействовать в коде. Правильно ли я понимаю, что раз в структуре SV невозможно указать input/output/inout, то структуры не предназначены для передачи связей между модулями (а следовательно, если имеется иерархия модулей, то в каждой ветви иерархии порты нижнего модуля в тупую копипастятся через всю иерархию до верхнего модуля, логически объединяясь разве что префиксами в именах)? Если оно так, то зачем нужны структуры в SV? И используете ли вы их в своих проектах?
  6. module some_module (input A, output B); always @(A) begin if(A) B<=1; end endmodule А что присваивать "переменной" B в случае если А равно нулю? То, что у тернарного оператора обязана быть ветвь else - это важное замечание. Но не ясна связь с запретом на использование if-else. Даже если причина была бы в этом (хотя как тогда работает вышеприведенный пример?), то почему ограничение проведено так жестко? Т.е. ну и разрешили бы использовать if-else/case вне блоков, но только с наличием ветви else/default. Явно, компилятор бы не треснул. Я чего спрашиваю. Причина может быть или в идеологии verilog или в том, что на эту фичу языка забили создатели. Если забили - следует смириться. Если это идеологический момент, то желательно его понять.
  7. Что такое "последовательный мультиплексор"? Просто я набил в Гугле "logic mux is" и первая ссылка говорит, что "The multiplexer, shortened to “MUX” or “MPX”, is a combinational logic circuit designed to...".
  8. Почему тернарный оператор разрешен вне блока always, а if-else (и case) - нет? В чем скрытый смысл такого ограничения?
  9. IBIS - это модель входных-выходных буферов. Т.е. моделирование распространения сигнала в линии возможно, если с обоих сторон выводы микросхем с IBIS-моделями. А если я хочу промоделировать сигнал от микросхемы, который потом сниму осциллографом с разъема? Как быть тогда?
  10. - Создаю резистор в библиотеке. - В Library Component Properties снимаю галки в чекбоксах напротив Default Designator и Default Comment. - Добавляю резистору параметр №1 и параметр №2. - Ставлю параметру №1 галку в Visible, параметру №2 галку снимаю. - Сохраняю. - Кидаю на схему резистор - у него Designator, Comment и параметр №1 оказываются видимые. - Захожу на схеме в Properties for Schematic Component in Sheet, снимаю галки напротив Designator и Comment - они исчезают. Вопрос: на что влияет свойство Visible у Default Comment в Library Component Properties и как сделать так, что бы Default Comment не появлялся при броске компонента на схему?
  11. Правильно ли я понимаю, что для микросхем с фиксированным назначением выводов пара "Символ-футпринт" (компонент) является логической частью библиотеки. Путем подключения библиотеки мы используем один компонент в разных проектах (связь "один-ко-многим"). Но если мы работаем с ПЛИС, то "за скобки" может быть вынесен лишь футпринт, а символ становится частью проекта. Максимум - может быть символ-заготовка с отмеченными пинам для программирования и питания, который необходимо копировать и править его в конкретном проекте. Таков ли подход?
  12. Не, Qu не синтезирует ваш пример. И ModelSim не синтезирует ваш пример. Вообще, я не очень понимаю зачем и к чему вы его написали. Пример из первого поста Qu синтезирует стабильно, так же стабильно его не синтезирует ModelSim
  13. Хотелось бы увидеть нормальную группировку атрибутов сущности. Хотелось бы увидеть как атрибут сущности объявляется один раз (а не один раз во внешнем модуле, один раз во внутреннем модуле и еще два раза его имя нужно написать при подключении этого модуля). А какую задачу решает конструкция struct? Никак. Данный пример не соберется ни в Квартусе, ни в МоделСиме. Заглавный же пост о том, что один и тот же код одной системой считается верным, а другой системой - ошибочным. О том, что интерпретация инженерами Ментора стандарта SystemVerilog обессмысливает одну синтаксическую конструкцию. И о том, как бы побороть это зло.
  14. Звучит логично. Жаль. Не хотелось бы имена регистров копировать четыре раза вместо одного, используя module для группировки. Посмотрю что скажет Мегратек (и вообще) и покорюсь судьбе :)
  15. Спасибо за комментарии. Кое-что удалось выяснить. 1. Зачем вся эта тема нужна? Вот пара примеров группировки атрибутов (при помощи модуля и при помощи структуры): Модуль: module test013_LITERAL ( output some_output ); logic reg_C; logic reg_A_for_submodul;//первое упоминание reg_A logic reg_B_for_submodul; logic reg_C_for_submodul;//придумать уникальное название во избежание пересечения имен submodul(.reg_A(reg_A_for_submodul),//второе и третье упоминание reg_A .reg_B(reg_B_for_submodul), .reg_C(reg_C_for_submodul)); assign some_output = reg_C_for_submodul; endmodule module submodul( input reg_A,//четвертое упоминание reg_A input reg_B, output reg_C ); endmodule Структура: module test013_LITERAL ( output some_output ); logic reg_C; struct{logic reg_A; //только одно упоминание reg_A logic reg_B; logic reg_C;//можно не опасаться пересечения имен } struct_example; assign some_output = struct_example.reg_C; endmodule Вам как было бы удобней производить группировку? 2. Вопрос веры :) Некоторые полагают, что элементы enum не вызвать через точку. Другие полагают, что можно, но синтаксис SystemVerilog таков, что вынесет элементы enum во внешнюю область видимости. Рабочий пример: module test013_LITERAL ( output [3:0]first_literal, output [3:0]second_literal ); struct{enum{SOME_LITERAL_0_FIRST, SOME_LITERAL_1_FIRST, IDLE, SOME_LITERAL_3_FIRST, SOME_LITERAL_4_FIRST} enum_reg; } first_struct; struct{enum{SOME_LITERAL_0_SECOND, SOME_LITERAL_1_SECOND, SOME_LITERAL_2_SECOND, IDLE, SOME_LITERAL_4_SECOND} enum_reg; } second_struct; assign first_literal = first_struct.IDLE; assign second_literal = second_struct.IDLE; endmodule Результаты компиляции на Quartus Prime 17.1.0 для MAX-10 10M02SCE144C8G: Info (293000): Quartus Prime Full Compilation was successful. 0 errors, 32 warnings Результат работы прошивки на лампочках демоплаты (линейка из восьми светодиодов): 0010 0011 3. Кто что говорит. Altera-forum - молчит. Verification Academy от Mentor - молчит. StackOverflow - говорит, что на одном из трех симуляторов мой код заработал. Так же там ссылаются на раздел 23.9 стандарта IEEE 1800-2017 и утверждают, что struct не создает scope (пффф, а зачем он тогда вообще нужен?), но проверить это утверждение пока не представляется возможным ввиду отсутствия у меня IEEE 1800-2017. Мы продолжаем следить за событиями.