реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Сброс SPI (Verilog), Начальное состояние триггеров
estel23
сообщение Sep 9 2015, 15:23
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 30-09-13
Пользователь №: 78 536



Добрый день уважаемые, хочу поделиться моей проблемой.

Имеется SPI Slave, вот код:

Код
module SPIslave(
    input wire RESET,
    input wire CSIN,
    input wire SCKIN,
    input wire MOSIIN,
    output wire MISOOUT,
    output reg [15:0] DATAOUT,
    );

reg [15:0] data;
reg [4:0] count;

assign MISOOUT = data[15];

always @ (negedge SCKIN)
    if (RESET & ~CSIN)
        data <= { data[14:0], MOSIIN };
        

always @ (posedge SCKIN)
    if (~RESET | CSIN)
        count <= 5'b00000;
    else
        count <= count + 1'b1;

always @ (count[4])
    DATAOUT <= data

endmodule


Вся проблема в RESETe. Хочу обходиться без лишних ног, ибо на CPLD итак много всего.
Если уберу из кода RESET, то счетчик начинает считать не с начала условий, под которые он подписан.
Т.е. Подаю клок, потом подаю CSIN = 1 (до этого она в нуле). Далее отпускаю CSIN = 0, но счетчик не начинает считать. И только по прошествии 7 - 8 клоков оживает.
Я думал что при включении питания CPLD выставляет все в "0", но получше глянув в Post-моделировании заметил что не все в нуле.

Мож я чет не понимаю? На Verilogе сижу не долго и прошу помощи у экспертов.
Go to the top of the page
 
+Quote Post
EvgenyNik
сообщение Sep 9 2015, 15:44
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402



Мастер-устройство работать с CS будет по словам (т.е. опускаться на 16 бит, а потом подниматься и для передачи следующих 16 бит снова опускаться) или в течении всего пакета будет в нуле, пока посылка не закончится? Если первый вариант, то счётчик Вам вообще не нужен.
По теме, предположу, что смОтрите, например, в Квартусе как post-fitting registers, а т.к. он у Вас внутренний и наружу не выводится, то компилятор представил всё так, как ему удобно.


--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 9 2015, 15:49
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 30-09-13
Пользователь №: 78 536



Цитата(EvgenyNik @ Sep 9 2015, 19:44) *
Мастер-устройство работать с CS будет по словам (т.е. опускаться на 16 бит, а потом подниматься и для передачи следующих 16 бит снова опускаться) или в течении всего пакета будет в нуле, пока посылка не закончится? Если первый вариант, то счётчик Вам вообще не нужен.
По теме, предположу, что смОтрите, например, в Квартусе как post-fitting registers, а т.к. он у Вас внутренний и наружу не выводится, то компилятор представил всё так, как ему удобно.


Спасибо за ответ. Но счетчик нужен для дальнейшей модификации кода. Некоторые биты информации нужно будет выдергивать, а некоторые вставлять на другое место, и без счетчика никуда.
Go to the top of the page
 
+Quote Post
EvgenyNik
сообщение Sep 9 2015, 19:12
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402



Выведите состояние регистра на внешние пины (как с dataout сделали). Временно. Будете видеть в том виде, в каком привыкли. Потом уберёте за ненадобностью.


--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 10 2015, 07:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Сдается мне что дело не в ресете.... конечно при наличии CS, RESET не нужен, на первом же клоке счетчик должен уйти в 0, а на следующем с падением CS пойти считать. И тут у меня возникает вопрос клок присутствует до CS? Выдержан ли фронт CS относительно клока, не может быть какой-то метастабильности? Нет ли какого-то выхода на режим всей схемы?

для того чтобы все было в тех состояниях что желаете не поможет ли такой ход?
Код
reg [15:0] data = 0;
reg [4:0] count = 0;


Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 10 2015, 07:42
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 30-09-13
Пользователь №: 78 536



Цитата(Golikov A. @ Sep 10 2015, 11:07) *
Сдается мне что дело не в ресете.... конечно при наличии CS, RESET не нужен, на первом же клоке счетчик должен уйти в 0, а на следующем с падением CS пойти считать. И тут у меня возникает вопрос клок присутствует до CS? Выдержан ли фронт CS относительно клока, не может быть какой-то метастабильности? Нет ли какого-то выхода на режим всей схемы?

для того чтобы все было в тех состояниях что желаете не поможет ли такой ход?
Код
reg [15:0] data = 0;
reg [4:0] count = 0;


Есть вариант что клок до CS не присутствует. ТАм схема такая: CPLD связана с микросхемой по SPI, та в свою очередь переводит данные из SPI в I2C и обратно. Т.е. так: (FMC-ПОРТ) <-I2C-> (SC18IS602IPW) <-SPI-> CPLD. Но на CPLD еще заведен клок от I2C (наверно постоянный).

Вот собственно мне и нужен SPI-Slave, ток как его сделать.
Go to the top of the page
 
+Quote Post
EvgenyNik
сообщение Sep 10 2015, 07:55
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402



Цитата(estel23 @ Sep 10 2015, 10:42) *
ТАм схема такая: CPLD связана с микросхемой по SPI, та в свою очередь переводит данные из SPI в I2C и обратно. Т.е. так: (FMC-ПОРТ) <-I2C-> (SC18IS602IPW) <-SPI-> CPLD. Но на CPLD еще заведен клок от I2C (наверно постоянный).
Вот собственно мне и нужен SPI-Slave, ток как его сделать.
Ничего не понятно sm.gif Зачем конвертировать SPI<>I2C и обратно? Ну ладно.
У SPI существует несколько режимов работы в плане того - в какой момент выдаются данные и когда их надо захватывать. Т.е. железно сделанный SPI для одного случая, может категорически не подойти для другого.
Например, из вики цитата:
Цитата
Возможны четыре комбинации фазы (CPHA) и полярности (CPOL) сигнала SCLK по отношению к сигналам данных. Режимы работы определяются комбинацией бит CPHA и CPOL:
CPOL = 0 — сигнал синхронизации начинается с низкого уровня;
CPOL = 1 — сигнал синхронизации начинается с высокого уровня;
CPHA = 0 — выборка данных производится по переднему фронту сигнала синхронизации;
CPHA = 1 — выборка данных производится по заднему фронту сигнала синхронизации.

Тактовый импульс I2C в общем случае не является регулярным сигналом. Как именно у Вас - надо смотреть.


--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 10 2015, 08:05
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 30-09-13
Пользователь №: 78 536



Цитата(EvgenyNik @ Sep 10 2015, 11:55) *
Ничего не понятно sm.gif Зачем конвертировать SPI<>I2C и обратно? Ну ладно.
У SPI существует несколько режимов работы в плане того - в какой момент выдаются данные и когда их надо захватывать. Т.е. железно сделанный SPI для одного случая, может категорически не подойти для другого.
Например, из вики цитата:

Тактовый импульс I2C в общем случае не является регулярным сигналом. Как именно у Вас - надо смотреть.


Конвертация нужна, потому что некоторые микросхемы только по I2C, а некоторые только по SPI (см. рисунок).
Про режимы я вроде разобрался.

И мне нужно реализовать SPI так, как на графиках.
Но для начала я пытаюсь сделать просто сдвиговый регистр. И из возможных пинов есть только 4 под SPI и один клок I2C. И я думаю как сделать сброс если клок не с начала подается, а при передачи информации.

Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 10 2015, 08:14
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Множество SPI slave режимов реализуются при асинхронном сбросе по CS. Это как раз по той причине что в 99% случаев клока при CS == 1 нету. Собственно CS в 1 микросхемном варианте и появляется из-за того что надо как-то синхронизовать начальное событие.

Если асинхронный сброс недопустим, то надо заводить клок заведомо большей частоты нежели клок SPI и синхронизироваться по нему.
Go to the top of the page
 
+Quote Post
EvgenyNik
сообщение Sep 10 2015, 10:12
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402



Вариант: выкинуть SC18IS602IPW, подставив вместо неё сразу CPLD и подключить AD9517 и ADC к CPLD не рассматриваете?
Кстати, на режим SPI у ADC смотрели? Он совместим с AD9517? И самое главное - SC18IS602 сможет реализовать SPI, нужный для ADC?


--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 10 2015, 11:24
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 30-09-13
Пользователь №: 78 536



Цитата(EvgenyNik @ Sep 10 2015, 14:12) *
Вариант: выкинуть SC18IS602IPW, подставив вместо неё сразу CPLD и подключить AD9517 и ADC к CPLD не рассматриваете?
Кстати, на режим SPI у ADC смотрели? Он совместим с AD9517? И самое главное - SC18IS602 сможет реализовать SPI, нужный для ADC?


Дело в том что плата не наша, она куплена. И после некоторых модификаций платы нужно воссоздать управление + дальнейшая доработка кода под наши модификации.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 10 2015, 12:26
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



в CPLD асинхронный сброс возможен?

Код
always @ (posedge SCKIN or posedge CSIN)
    if (CSIN == 1' b1)
        count <= 5'b00000;
    else
        count <= count + 1'b1;
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 23 2015, 13:37
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 30-09-13
Пользователь №: 78 536



Цитата(Golikov A. @ Sep 10 2015, 16:26) *
в CPLD асинхронный сброс возможен?

Код
always @ (posedge SCKIN or posedge CSIN)
    if (CSIN == 1' b1)
        count <= 5'b00000;
    else
        count <= count + 1'b1;


Спасибо. Почти заработало.
Точнее не очень почти.

И снова прошу вашей помощи.
Как видно на картинке сверху к MISO подключены сразу три устройства(будем рассматривать CPLD и АЦП), причем изначально CPLD работает когда начальная установка MISO в нуле, а АЦП наоборот, когда начальная установка MISO в единице, причем АЦП все время держит MISO в единице.

Первая мысль - использовать 3-state буфер на выходе CPLD, чтоб в момент выбора MISO опускался и CPLD могла разговаривать по MISO, все остальное время выход в 3-state, а значит в единице, АЦП следит за этим.

Внутри CPLD стоит на стреме регистр с заданными данными (которые к тому же подключены к выходам CPLD - это важно), и как только спадает CS и выбирается CPLD, то данные бегут по MISO. Когда все закончилось, то MISO возвращается в единицу и с ним работает АЦП.

Проверяю я это все дело через нашу прогу. И вроде все работает и данные передаются, и на пинах нужная комбинация с регистра прет.

Но есть косяк:
Если работать через уже включенную прогу, то все норм. Но когда только-только подать питание на плату, то нужные данные в регистре отсутствуют. Смотрел на осциле.
Заливаешь прогу, все есть. Перезагружаешь, ничего нет. Причем все остальное выполняется, и буфер работает, и регистры читаются, но только нули.

В коде единице, у меня нули. Перезаливаю, все норм, перезагружаю - болты.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 23 2015, 16:50
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
PLD работает когда начальная установка MISO в нуле, а АЦП наоборот, когда начальная установка MISO в единице, причем АЦП все время держит MISO в единице.

это в корне не правильно. Вам абсолютно все равно должно быть в каком состояние MISO и MOSI, важны сигналы CS - выбор устройства, и фронт клока. По фронту клока мастера каждый слейв должен выставить если он выбран на MISO свое значение, а мастер на MOSI свое. Остальное время пофиг что в каком состоянии

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


Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 24 2015, 08:27
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 30-09-13
Пользователь №: 78 536



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

Положение MISO важно, т.к. если я его оставлю без присмотра, то оно упадет в ноль, а дальше идет чтение АЦП, и прочитаются одни нули.

Передача DATA: 00011110

Сообщение отредактировал estel23 - Sep 24 2015, 08:28
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 21:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016