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

Здравствуйте. Есть такая проблема с написанием кода.

 

Есть шина SPI, по которой идут данные по ножке MOSI.16 бит данных идут побитово. Мне надо эти данные распихать в два регистра по 8 бит и выпустить наружу. Насколько я понимаю нужно использовать оператор сдвига.Клок присутствует.

 

Как это лучше всего написать на языке VERILOG? Микруха Altera EPM3064.

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


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

я не спец по VERILOG, но готовые шаблоны дают такой ответ:

 reg [15:0] <reg_name>;
   
   always @(posedge <clock>)  
      if (<clock_enable>)          
         <reg_name>  <= {<input>, <reg_name>[siso_shift-1:1]};
   
assign <output1> = <reg_name>[15:8];
assign <output2> = <reg_name>[7:0];
                    
//clock= spi_clk
//input=spi_mosi
//clock_enable = not spi_cs

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


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

   always @(posedge SCK)  
      if (!CS)          
         SPIDAT  <= {MOSI,SPIDAT[15:0]};
   
assign DTAO = SPIDAT[15:0];

 

вот я написал так, оно не работает...

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


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

   always @(posedge SCK)  
      if (!CS)          
         SPIDAT  <= {MOSI,SPIDAT[15:0]};
   
assign DTAO = SPIDAT[15:0];

 

вот я написал так, оно не работает...

 

Я думаю лучше SPIDAT <= {MOSI,SPIDAT[15:1]};

 

Ну и предусмотреть флаг готовности регистра к считыванию (счётчик на 4 бита)

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


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

а можно конретнее про флаг? я просто в active-hdl моделирую. Задал в модуляторе такое -

always #540 SCK=~SCK;

always #30 CLK=~CLK;

always #540 MOSI=~MOSI;

 

И по SPIDAT начинается сдвиг,но неправильный.

 

Если шлются одни единицы то должен быть 0 3 7 и тд, а у меня вот что : http://s6.hostingkartinok.com/uploads/imag...68ce31abde7.png

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


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

Я с spi не разбирался, но если там сопровождающий такт несинхронный я так понял SCK, его нужно простробировать тактом ПЛИС, потом вычислить фронт и по сигналу этого фронта делать сдвиг, я это так понимаю.

 

в клок нужно ставить CLK.

 

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

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

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


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

Есть шина SPI, по которой идут данные по ножке MOSI.16 бит данных идут побитово. Мне надо эти данные распихать в два регистра по 8 бит и выпустить наружу.

 

Значит делается так:

1. есть системная частота, под которую работает весь проект.

2. на системной частоте создается счетчик, который делает стробы передачи данных по SPI

3. на приеме с SPI частота приема стробируется системной и проект далее делается под системную частоту. Это CDC!

4. делаются сдвиговые регистры для приема-передачи....

5. делается автомат, который управляет передачей. Он выставляет Готовности, он переписывает данные из паралл. регистра в сдвиговый...

6. делается автомат, который управляет приемом.он работает аналогично...

 

Подробнее про верилог - у меня на сайте - "Краткий Курс"...

Удачи!

 

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


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

2 вопроса

что такое CDC?

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

 

 

а можно конретнее про флаг? я просто в active-hdl моделирую. Задал в модуляторе такое -

always #540 SCK=~SCK;

always #30 CLK=~CLK;

always #540 MOSI=~MOSI;

 

Если шлются одни единицы то должен быть 0 3 7 и тд, а у меня вот что : http://s6.hostingkartinok.com/uploads/imag...68ce31abde7.png

 

SPIDAT <= {MOSI,SPIDAT[15:1]}; - неправильно

SPIDAT <= {SPIDAT[14:0],MOSI}; - правильно

SPI лезет старшим битом вперед,

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


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

что такое CDC?

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

CDC? - Читайте, я же об этом подробно написал в "КК"...

Потому что на приеме синхронизировать 1 входящий бит проще, чем результат... И можно не бояться ложных пичков на фронтах, т.к. они фильтруются...

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


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

Есть такая проблема с написанием кода.

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

 

Есть шина SPI, по которой идут данные по ножке MOSI.16 бит данных идут побитово. Мне надо эти данные распихать в два регистра по 8 бит и выпустить наружу.

Насколько я понимаю нужно использовать оператор сдвига.Клок присутствует.

Какие дополнительные линии управления присутствуют? Данные идут непрерывным потоком или есть какая-то синхронизация? Как сконфигурирован SPI? Старшим или младшим битом вперед? Какие линии для считывания? Синхронна ли тактовая Альтеры и периферийных микросхем?

 

P.S. Скорее всего для понимания сути Вам будет проще переформулировать вопрос в виде "как мне прочитать SPI микросхемы ААА в Альтеру МАХ3064 и выдать в параллельном коде в микросхему BBB".

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


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

а что такое siso_shift-1:1]?

это хвост от параметризуемого шаблона остался

siso_shift - длина сдвигового регистра, в вашем случае = 16

понимать надо так:

<reg_name>  <= {<input>, <reg_name>[15:1]};

 

по фен-шую надо делать так, как пишет iosifk.

но в простейшем случае никто не мешает тактироваться от самого spi.

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


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

CDC? - Читайте, я же об этом подробно написал в "КК"...

Потому что на приеме синхронизировать 1 входящий бит проще, чем результат... И можно не бояться ложных пичков на фронтах, т.к. они фильтруются...

CDC - я думал может это что-то типа IMHO, в смысле устойчивая аббревиатура...

 

Работая по клоку SPI можно иметь скорость выше и сравнимую с частотой основного клока, а ложных пичков бит не должно на схемном уровне IMHO.

 

 

Откуда взялся SPI младшим битом вперед? Разве у кого-то есть такой вариант? Полярность клока и фронт - да бывают разными, но вроде бы все старшим битом лезут, нет?

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


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

CDC - я думал может это что-то типа IMHO, в смысле устойчивая аббревиатура...

 

Работая по клоку SPI можно иметь скорость выше и сравнимую с частотой основного клока, а ложных пичков бит не должно на схемном уровне IMHO.

 

Clock Domain Crossing и есть устойчивая аббревиатура... И если Вы знаете что это такое, то я удивлен Вашим вопросом...

А то, что SPI сможет работать на частотах выше 20 - 200 Мгц - не верю... Да и не к чему гонять по плате такие сигналы... А вот системный клок - легко может работать на таких частотах...

При системной тактовой 100 Мгц, фронт сигнала в 1Мгц будет представляться пологой линией на скопе. А потому " бит не должно на схемном уровне" - это Вы так считаете. А ПЛИС может считать и по другому...

 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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