Nevox 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба Здравствуйте. Есть такая проблема с написанием кода. Есть шина SPI, по которой идут данные по ножке MOSI.16 бит данных идут побитово. Мне надо эти данные распихать в два регистра по 8 бит и выпустить наружу. Насколько я понимаю нужно использовать оператор сдвига.Клок присутствует. Как это лучше всего написать на языке VERILOG? Микруха Altera EPM3064. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба я не спец по 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nevox 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба а что такое siso_shift-1:1]? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба а что такое siso_shift-1:1]? разрядность регистра (цифры) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nevox 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба always @(posedge SCK) if (!CS) SPIDAT <= {MOSI,SPIDAT[15:0]}; assign DTAO = SPIDAT[15:0]; вот я написал так, оно не работает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mogwaika 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба always @(posedge SCK) if (!CS) SPIDAT <= {MOSI,SPIDAT[15:0]}; assign DTAO = SPIDAT[15:0]; вот я написал так, оно не работает... Я думаю лучше SPIDAT <= {MOSI,SPIDAT[15:1]}; Ну и предусмотреть флаг готовности регистра к считыванию (счётчик на 4 бита) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nevox 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба а можно конретнее про флаг? я просто в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mogwaika 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 (изменено) · Жалоба Я с spi не разбирался, но если там сопровождающий такт несинхронный я так понял SCK, его нужно простробировать тактом ПЛИС, потом вычислить фронт и по сигналу этого фронта делать сдвиг, я это так понимаю. в клок нужно ставить CLK. Флаг, готовности 16 бит к считыванию, но тогда нужно знать начало пакета этих 16 бит на последовательном интерфейсе. Изменено 29 ноября, 2013 пользователем Mogwaika Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба Есть шина SPI, по которой идут данные по ножке MOSI.16 бит данных идут побитово. Мне надо эти данные распихать в два регистра по 8 бит и выпустить наружу. Значит делается так: 1. есть системная частота, под которую работает весь проект. 2. на системной частоте создается счетчик, который делает стробы передачи данных по SPI 3. на приеме с SPI частота приема стробируется системной и проект далее делается под системную частоту. Это CDC! 4. делаются сдвиговые регистры для приема-передачи.... 5. делается автомат, который управляет передачей. Он выставляет Готовности, он переписывает данные из паралл. регистра в сдвиговый... 6. делается автомат, который управляет приемом.он работает аналогично... Подробнее про верилог - у меня на сайте - "Краткий Курс"... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба 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 лезет старшим битом вперед, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба что такое CDC? почему нельзя сделать SPI синхронным по его клоку, а с системой синхронизировать уже результат? CDC? - Читайте, я же об этом подробно написал в "КК"... Потому что на приеме синхронизировать 1 входящий бит проще, чем результат... И можно не бояться ложных пичков на фронтах, т.к. они фильтруются... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tiro 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба Есть такая проблема с написанием кода. Если Вы можете нарисовать схему, то тогда проблема действительно с написанием кода. Есть шина SPI, по которой идут данные по ножке MOSI.16 бит данных идут побитово. Мне надо эти данные распихать в два регистра по 8 бит и выпустить наружу. Насколько я понимаю нужно использовать оператор сдвига.Клок присутствует. Какие дополнительные линии управления присутствуют? Данные идут непрерывным потоком или есть какая-то синхронизация? Как сконфигурирован SPI? Старшим или младшим битом вперед? Какие линии для считывания? Синхронна ли тактовая Альтеры и периферийных микросхем? P.S. Скорее всего для понимания сути Вам будет проще переформулировать вопрос в виде "как мне прочитать SPI микросхемы ААА в Альтеру МАХ3064 и выдать в параллельном коде в микросхему BBB". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 29 ноября, 2013 Опубликовано 29 ноября, 2013 · Жалоба а что такое siso_shift-1:1]? это хвост от параметризуемого шаблона остался siso_shift - длина сдвигового регистра, в вашем случае = 16 понимать надо так: <reg_name> <= {<input>, <reg_name>[15:1]}; по фен-шую надо делать так, как пишет iosifk. но в простейшем случае никто не мешает тактироваться от самого spi. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 ноября, 2013 Опубликовано 30 ноября, 2013 · Жалоба CDC? - Читайте, я же об этом подробно написал в "КК"... Потому что на приеме синхронизировать 1 входящий бит проще, чем результат... И можно не бояться ложных пичков на фронтах, т.к. они фильтруются... CDC - я думал может это что-то типа IMHO, в смысле устойчивая аббревиатура... Работая по клоку SPI можно иметь скорость выше и сравнимую с частотой основного клока, а ложных пичков бит не должно на схемном уровне IMHO. Откуда взялся SPI младшим битом вперед? Разве у кого-то есть такой вариант? Полярность клока и фронт - да бывают разными, но вроде бы все старшим битом лезут, нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 30 ноября, 2013 Опубликовано 30 ноября, 2013 · Жалоба CDC - я думал может это что-то типа IMHO, в смысле устойчивая аббревиатура... Работая по клоку SPI можно иметь скорость выше и сравнимую с частотой основного клока, а ложных пичков бит не должно на схемном уровне IMHO. Clock Domain Crossing и есть устойчивая аббревиатура... И если Вы знаете что это такое, то я удивлен Вашим вопросом... А то, что SPI сможет работать на частотах выше 20 - 200 Мгц - не верю... Да и не к чему гонять по плате такие сигналы... А вот системный клок - легко может работать на таких частотах... При системной тактовой 100 Мгц, фронт сигнала в 1Мгц будет представляться пологой линией на скопе. А потому " бит не должно на схемном уровне" - это Вы так считаете. А ПЛИС может считать и по другому... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться