Flip 0 Posted December 28, 2019 · Report post Подскажите пожалуйста! Обучаюсь на отладочной плате Altera. Задача следующая: нужно передавать постоянно данные по USB-порту, вроде написал программу, но передача данных не происходит. module bufer_forusb (Clk,f_data); input Clk; output [7:0] f_data; reg [7:0] bufs [0:15]; integer i; reg [7:0] f_data; initial begin i = 0; bufs[0] = 0; bufs[1] = 16; bufs[2] = 31; bufs[3] = 45; bufs[4] = 58; bufs[5] = 67; bufs[6] = 74; bufs[7] = 77; bufs[8] = 74; bufs[9] = 68; bufs[10] = 67; bufs[11] = 45; bufs[12] = 31; bufs[13] = 25; bufs[14] = 15; bufs[15] = 0; end always@ (posedge(Clk)) begin f_data = bufs[i]; i = i + 1; if(i == 16) i = 0; end endmodule Quote Ответить с цитированием Share this post Link to post Share on other sites
Maverick_ 10 Posted December 28, 2019 · Report post Какая плата? Можно ссылку на описание Quote Ответить с цитированием Share this post Link to post Share on other sites
des00 0 Posted December 29, 2019 · Report post 6 hours ago, Maverick_ said: Какая плата? Можно ссылку на описание да ладно бы плата, мне интересно на какой корке возможна вот такая передача) Quote Ответить с цитированием Share this post Link to post Share on other sites
dtmf73 0 Posted December 30, 2019 · Report post Это не корка - это FTDI chip. FIFO - USB Quote Ответить с цитированием Share this post Link to post Share on other sites
Skryppy 0 Posted December 30, 2019 · Report post Для начала оставьте только одно значение - константу и все время ее посылайте. Каким образом ваша плата стыкуется с юсб портом компьютера? Давайте временные диаграммы данного ftdi чипа с мануала. Насколько я помню у данных микросхем надо дергать порты rxf, Rd, data( прием данных) и txe, we, data (передача данных) Второй вопрос, как вы принимаете данные в компьютере, какие ftdi драйвера используете, команды? Quote Ответить с цитированием Share this post Link to post Share on other sites
xvr 0 Posted December 30, 2019 · Report post Судя по приведённому 'коду' передача по USB происходит чисто телепатически. Ибо, как правльно заметил Skryppy для общения с FTDI чипом одной шины данных недостаточно (я уже не говорю, что общение с ней на тактовой частоте FPGA и без всякой синхронизации вообще приведёт к букету глюков чудных) Про Verilog RTL вообще молчу, (мат здесь вроде не приветствуется) Quote Ответить с цитированием Share this post Link to post Share on other sites
Strob 0 Posted December 30, 2019 (edited) · Report post Ну и, кстати, в блоке always сплошные блокирующие присвоения, оно так работать то вообще должно? Плюс в условии ошибка. Edited December 30, 2019 by Strob Quote Ответить с цитированием Share this post Link to post Share on other sites
Nick_K 0 Posted December 31, 2019 · Report post 13 hours ago, Strob said: Ну и, кстати, в блоке always сплошные блокирующие присвоения, оно так работать то вообще должно? Плюс в условии ошибка. Это конечно ошибка, но на результат синтеза не повлияет. А вот при моделировании будет чёрт и что - это другой вопрос. Quote Ответить с цитированием Share this post Link to post Share on other sites
MrGalaxy 0 Posted December 31, 2019 · Report post 22 минуты назад, Nick_K сказал: на результат синтеза не повлияет. Согласен со Strob, нельзя так писать, это не компьютерная программа. Flip, оператор инкремента i введите в конструкцию else, оператор присвоения также поместите в if - else (продублировав и учитывая, что bufs[16] не существует). Quote Ответить с цитированием Share this post Link to post Share on other sites
andrew_b 0 Posted December 31, 2019 · Report post 1 час назад, Nick_K сказал: А вот при моделировании будет чёрт и что - это другой вопрос. А с чего вы взяли, что при моделировании будет что-то не так? Там сплошные блокирующие присваивания друг за другом, поэтому всё однозначно. Но, конечно, так писать не надо. Не «нельзя», а «не надо». Quote Ответить с цитированием Share this post Link to post Share on other sites
MrGalaxy 0 Posted December 31, 2019 · Report post Коллеги, позвольте нубский вопрос. У ТС простой счётчик i на 4 разряда, я в таких случаях обхожусь без if: Спойлер ... Shared variable i : integer range 0 to 15; ... Process(clk) begin if(Clk'event)and(Clk='1') then i := i + 1; end if; end process; ... На Верилоге такое возможно? Посмотрел учебник, там переменная может быть только integer 32-разрядная. Или это при синтезе автоматически учитывается Квартусом и переменная усекается до младших разрядов? Quote Ответить с цитированием Share this post Link to post Share on other sites
Strob 0 Posted December 31, 2019 (edited) · Report post 1 hour ago, MrGalaxy said: У ТС простой счётчик i на 4 разряда, я в таких случаях обхожусь без if: При поведенческой симуляции, ISim, по крайней мере раньше, range не учитывал. Соответственно счетчик продолжал считать и после 15. Но в железе счетчик урезался и считало правильно. Это я про vhdl и xilinx ise. Имейте ввиду что подобная небрежность в коде рано или поздно может создать проблемы. Edited December 31, 2019 by Strob Quote Ответить с цитированием Share this post Link to post Share on other sites
andrew_b 0 Posted December 31, 2019 · Report post 1 час назад, MrGalaxy сказал: я в таких случаях Если переменная используется в одном процессе, то зачем она shared? Если в нескольких, то зачем переменная для простых сигналов? Приключений хотите? 2 часа назад, MrGalaxy сказал: обхожусь без if Странно. У вас что происходит, если i = 15, а i + 1 = 16 и мы выходим за границы диапазона? Тут должна возникать ошибка. Без if не обойтись. Quote Ответить с цитированием Share this post Link to post Share on other sites
MrGalaxy 0 Posted December 31, 2019 · Report post 38 минут назад, andrew_b сказал: Странно. У вас что происходит, если i = 15, а i + 1 = 16 и мы выходим за границы диапазона? Тут должна возникать ошибка. Без if не обойтись. На самом деле ошибки здесь нет, при переполнении счётчика он автоматически сбрасывается в ноль. 15 + 1 = 0 Это, кстати, и в чистом программировании работает. 1 час назад, Strob сказал: При поведенческой симуляции, ISim, по крайней мере раньше, range не учитывал. Соответственно счетчик продолжал считать и после 15. Но в железе счетчик урезался и считало правильно. Это я про vhdl и xilinx ise. Имейте ввиду что подобная небрежность в коде рано или поздно может создать проблемы. При симуляции тоже всё правильно считается (пользуюсь встроенным квартусовским). Это не небрежность. Впрочем, даже если поставить явное условие сброса счётчика, вопрос остаётся: в Верилоге разрядность переменной можно указывать или нет? 51 минуту назад, andrew_b сказал: Если в нескольких, то зачем переменная для простых сигналов? Загадками говорите... Затем, что используется только внутри блока и наружу не выводится. Quote Ответить с цитированием Share this post Link to post Share on other sites
Strob 0 Posted December 31, 2019 · Report post 12 minutes ago, MrGalaxy said: в Верилоге разрядность переменной можно указывать или нет? Есть типы с предопределенной длиной. Впрочем они могут быть оптимизированы системой. Если использовать например тип reg, можно задать произвольную разрядность. Это небрежность в том смысле, что если завтра Вам придется писать под спартан 6, можно на ровном месте схлопотать проблем. Quote Ответить с цитированием Share this post Link to post Share on other sites