Jump to content

    

Передача данных по USB

Подскажите пожалуйста! Обучаюсь на отладочной плате 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

 

Share this post


Link to post
Share on other sites

Какая плата? Можно ссылку на описание

Share this post


Link to post
Share on other sites
6 hours ago, Maverick_ said:

Какая плата? Можно ссылку на описание

да ладно бы плата, мне интересно на какой корке возможна вот такая передача) 

Share this post


Link to post
Share on other sites

Для начала оставьте только одно значение - константу и все время ее посылайте. 

Каким образом ваша плата стыкуется с юсб портом компьютера? Давайте временные диаграммы данного ftdi чипа с мануала.  Насколько я помню у данных микросхем надо дергать порты rxf, Rd, data( прием данных) и txe, we, data (передача данных)

Второй вопрос, как вы принимаете данные в компьютере, какие ftdi драйвера используете, команды?

Share this post


Link to post
Share on other sites

Судя по приведённому 'коду' передача по USB происходит чисто телепатически. Ибо, как правльно заметил Skryppy для общения с FTDI чипом одной шины данных недостаточно (я уже не говорю, что общение с ней на тактовой частоте FPGA и без всякой синхронизации вообще приведёт к букету глюков чудных)

Про Verilog RTL вообще молчу, (мат здесь вроде не приветствуется) :crazy:

 

Share this post


Link to post
Share on other sites

Ну и, кстати, в блоке always сплошные блокирующие присвоения, оно так работать то вообще должно? Плюс в условии ошибка.

Edited by Strob

Share this post


Link to post
Share on other sites
13 hours ago, Strob said:

Ну и, кстати, в блоке always сплошные блокирующие присвоения, оно так работать то вообще должно? Плюс в условии ошибка.

Это конечно ошибка, но на результат синтеза не повлияет. А вот при моделировании будет чёрт и что - это другой вопрос.

Share this post


Link to post
Share on other sites
22 минуты назад, Nick_K сказал:

на результат синтеза не повлияет. 

:shok:

Согласен со Strob, нельзя так писать, это не компьютерная программа.

Flip,  оператор инкремента i введите в конструкцию else, оператор присвоения также поместите в if - else (продублировав и учитывая, что  bufs[16] не существует).

 

Share this post


Link to post
Share on other sites
1 час назад, Nick_K сказал:

А вот при моделировании будет чёрт и что - это другой вопрос.

А с чего вы взяли, что при моделировании будет что-то не так? Там сплошные блокирующие присваивания друг за другом, поэтому всё однозначно.

Но, конечно, так писать не надо. Не «нельзя», а «не надо».

Share this post


Link to post
Share on other sites

Коллеги, позвольте нубский вопрос.

У ТС простой счётчик 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-разрядная.

Или это при синтезе автоматически учитывается Квартусом и переменная усекается до младших разрядов?

Share this post


Link to post
Share on other sites
1 hour ago, MrGalaxy said:

У ТС простой счётчик i на 4 разряда, я в таких случаях обхожусь без if:

При поведенческой симуляции, ISim, по крайней мере раньше, range не учитывал. Соответственно счетчик продолжал считать и после 15. Но в железе счетчик урезался и считало правильно.

Это я про vhdl и xilinx ise. Имейте ввиду что подобная небрежность в коде рано или поздно может создать проблемы.

Edited by Strob

Share this post


Link to post
Share on other sites
1 час назад, MrGalaxy сказал:

я в таких случаях

Если переменная используется в одном процессе, то зачем она shared? Если в нескольких, то зачем переменная для простых сигналов? Приключений хотите?

2 часа назад, MrGalaxy сказал:

обхожусь без if

Странно. У вас что происходит, если i = 15, а i + 1 = 16 и мы выходим за границы диапазона? Тут должна возникать ошибка. Без if не обойтись.

Share this post


Link to post
Share on other sites
38 минут назад, andrew_b сказал:

 

Странно. У вас что происходит, если i = 15, а i + 1 = 16 и мы выходим за границы диапазона? Тут должна возникать ошибка. Без if не обойтись.

На самом деле ошибки здесь нет, при переполнении счётчика он автоматически сбрасывается в ноль.

15 + 1 = 0

Это, кстати, и в чистом программировании работает.

1 час назад, Strob сказал:

При поведенческой симуляции, ISim, по крайней мере раньше, range не учитывал. Соответственно счетчик продолжал считать и после 15. Но в железе счетчик урезался и считало правильно.

Это я про vhdl и xilinx ise. Имейте ввиду что подобная небрежность в коде рано или поздно может создать проблемы.

При симуляции тоже всё правильно считается (пользуюсь встроенным квартусовским). 

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

51 минуту назад, andrew_b сказал:

 Если в нескольких, то зачем переменная для простых сигналов? 

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

Share this post


Link to post
Share on other sites
12 minutes ago, MrGalaxy said:

в Верилоге разрядность переменной можно указывать или нет?

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

Это небрежность в том смысле, что если завтра Вам придется писать под спартан 6, можно на ровном месте схлопотать проблем.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now