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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Сброс SPI (Verilog), Начальное состояние триггеров
Golikov A.
сообщение Sep 24 2015, 09:30
Сообщение #16


Гуру
******

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



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

MISO - бит которым управляет СЛЕЙВ!!!! что он поставит то вы и должны как МАСТЕР читать. Что за бред то?
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 24 2015, 09:44
Сообщение #17


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

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



Цитата(Golikov A. @ Sep 24 2015, 13:30) *
MISO - бит которым управляет СЛЕЙВ!!!! что он поставит то вы и должны как МАСТЕР читать. Что за бред то?


Ды я понимаю что MISO управляет слейв.
Только не получается у меня управлять им.
Вот например: я пишу слейв для CPLD, и после прочтения данных мне как бы на MISO наплевать, что с ним будет делать другой слейв. Но на деле смотрю в осцилл и вижу что когда никаких данных не передается, то слейв в нуле. Но как только пришла очередь АЦП, то она не поднимает сигнал MISO. Т.е. должна передать 00010010, но передаёт 11111111.

Сообщение отредактировал estel23 - Sep 24 2015, 09:45
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 24 2015, 09:53
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Выход слейва - MISO - в каждом слейве дожден проходить через tri-state буфер, управляемый CS этого же слейва...
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 24 2015, 09:55
Сообщение #19


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

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



Цитата(Genadi Zawidowski @ Sep 24 2015, 13:53) *
Выход слейва - MISO - в каждом слейве дожден проходить через tri-state буфер, управляемый CS этого же слейва...


Это все уже сделано)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 24 2015, 10:00
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



OE буфера не должен ничем стробироваться, просто управляется от чипселекта.
Не понял, а зачем Вам счетчик? Задним фронтом CE защелкиваете на паралельный выход то, что накопилось в сдвиговом регистре за последние 16 тактос CLK. Или у Вашей CPLD на все только один единственный клок?

Сообщение отредактировал Genadi Zawidowski - Sep 24 2015, 10:03
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 24 2015, 10:07
Сообщение #21


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

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



Цитата(Genadi Zawidowski @ Sep 24 2015, 14:00) *
OE буфера не должен ничем стробироваться, просто управляется от чипселекта.
Не понял, а зачем Вам счетчик? Задним фронтом CE защелкиваете на паралельный выход то, что накопилось в сдвиговом регистре за последние 16 тактос CLK. Или у Вашей CPLD на все только один единственный клок?


У моей CPLD на все один единственный клок. И тот включается когда передаются данные. А счетчик нужет для того, чтобы из разных регистров CPLD в разные биты записывать и считывать инфу.
А буфер должен выключаться только при наступлении 8 бита, т.к. первые 8 бит - адрес регистра и указатель записи/считывания.
Но я это все уже сделал, и даже работает. Остается вопрос первоначального включения, инициализации CPLD и АЦП, которая не может поднять MISO.

Кстати тип АЦП: EV10AQ190A

Сообщение отредактировал estel23 - Sep 24 2015, 10:13
Go to the top of the page
 
+Quote Post
EvgenyNik
сообщение Sep 24 2015, 13:53
Сообщение #22


Знающий
****

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



Цитата(estel23 @ Sep 24 2015, 13:07) *
АЦП, которая не может поднять MISO. Кстати тип АЦП: EV10AQ190A
А Вы подтянули MISO к питанию как сказано в п. 6.6 даташита?


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


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

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



Цитата(EvgenyNik @ Sep 24 2015, 17:53) *
А Вы подтянули MISO к питанию как сказано в п. 6.6 даташита?


Да, конечно. Дело в том что плата не наша, она куплена. И после некоторых модификаций платы нужно воссоздать управление + дальнейшая доработка кода под наши модификации.

Сообщение отредактировал estel23 - Sep 24 2015, 14:29
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 24 2015, 19:49
Сообщение #24


Гуру
******

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



есть вещи которые я не понимаю и не смогу понять наверное никогда...

если ваша CPLD отпустила линию в 3 состояние, линия подтянута к питанию, то каким образом после этого она остается в 0?
Я думаю у вас какой-то баг с битами, и CPLD не отпускает линию, то есть она не понимает что передача закончилась, и даже поднятый CS ей побоку, что наверное логично если клоки пропадают, то последний бит так и стоит... Я думаю пора привести код, как вы сделали, а то происходит что-то уж совсем непонятное...
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 25 2015, 06:30
Сообщение #25


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

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



Цитата(Golikov A. @ Sep 24 2015, 23:49) *
есть вещи которые я не понимаю и не смогу понять наверное никогда...

если ваша CPLD отпустила линию в 3 состояние, линия подтянута к питанию, то каким образом после этого она остается в 0?
Я думаю у вас какой-то баг с битами, и CPLD не отпускает линию, то есть она не понимает что передача закончилась, и даже поднятый CS ей побоку, что наверное логично если клоки пропадают, то последний бит так и стоит... Я думаю пора привести код, как вы сделали, а то происходит что-то уж совсем непонятное...


С нулем все впорядке, все поднимается. После долгих мучений я это сделал).
Привожу код программы. Прошу не судить строго, т.к. я не очень силен в Verilogе и написал как смог, и даже почти работает. Т.е. MISO поднимается и данные передаются даже с инверсным клоком, как при начальном включении.

Код
module SPIslave(
     output wire led, //выход
    
    input wire SS_CPLD,
    input wire SCKIN,
    input wire MOSIIN,
    output wire MISOOUT,
     output wire [6:0] REGOUT, //выходные данные
     input wire    [3:0] REGIN    //входные данные
    );
/****************************************************************************/
reg MISO;

reg CS_CPLD;

reg [15:0] data;

reg [3:0]keyneg = 0; //выбор регистра
reg [3:0]keyreg = 0; //выбор регистра

reg [4:0] nBit; //счетчик записи
reg [4:0] rBit; //счетчик чтения

reg [7:0] REG00; //начальная установка синтезатора (да)
reg [7:0] REG01;
reg [7:0] REG02;
// 8'b00011110  ---reg00    
// 8'b01011110  ---reg02

/****************************************************************************/
assign led = SS_CPLD;
assign REGOUT [6:0] = REG00 [6:0];

/****************************************************************************/  
reg tstate = 1;

OBUFT OBUFT_inst (.O(MISOOUT), .I(MISO), .T(tstate)); //буфер 3-state

always @ (negedge SCKIN or posedge SS_CPLD) //управление буфером
    if(SS_CPLD==1)
      tstate = 1;
    else
      if (keyreg [3] == 1)
        tstate = 0;
      else
        tstate = 1;
      
/****************************************************************************/
always @ (negedge SCKIN or posedge SS_CPLD) //счетчик записи
   if(SS_CPLD==1)
      nBit <= 5'b00000;
    else if (SS_CPLD==0)
      nBit <= nBit + 1; //следующий бит

/****************************************************************************/    
always @ (posedge SCKIN or posedge SS_CPLD) //счетчик чтения
   if(SS_CPLD==1)
      rBit <= 5'b00000;
    else if (SS_CPLD==0)
      rBit <= rBit + 1; //следующий бит

/****************************************************************************/    


always @ (posedge SCKIN  or posedge SS_CPLD) //выбор регистра, запись/чтение
begin
   if (SS_CPLD == 1)
      keyreg = 0;
    else
    begin  
      if (nBit == 0)
        begin
         if (MOSIIN == 1) keyreg [0] = 1;
         end
      else
      if (nBit == 6)
        begin
         if (MOSIIN == 1) keyreg [1] = 1;
         end
      else
      if (nBit == 7)
        begin
         if (MOSIIN == 1) keyreg [2] = 1;
            //else
             //if (keyneg [0] == 1) keyneg [3] = 1;  
         end
        
        
        if (rBit == 0)
        begin
         if (MOSIIN == 1) keyreg [0] = 1;
         end
      else
      if (rBit == 6)
        begin
         if (MOSIIN == 1) keyreg [1] = 1;
         end
      else
      if (rBit == 7)
        begin
         if (MOSIIN == 1) keyreg [2] = 1;
            else
             if (keyreg [0] == 1) keyreg [3] = 1;  
         end
        
        
        
      end
end

/****************************************************************************/    
always @ (negedge SCKIN)
    if (SS_CPLD == 0)
        //data <= { data[14:0], 16'b00011110};
          data <= {MOSIIN, data[15:1]};
    
/****************************************************************************/
/****************************************************************************/
//чтение
always @ (negedge SCKIN  or posedge SS_CPLD)
begin
   if (SS_CPLD == 1)
      MISO = 0;
    else
    begin
      if(keyreg [0] == 1)  //бит на чтение
        begin
          case (keyreg)
        4'b1001: begin //reg00
                     case (nBit)
                      7: MISO = REG00[7];
                      8: MISO = REG00[6];
                      9: MISO = REG00[5];
                     10: MISO = REG00[4];
                     11: MISO = REG00[3];
                     12: MISO = REG00[2];
                     13: MISO = REG00[1];
                         14: MISO = REG00[0];
                      default: MISO = 1'bz;
                     endcase
                  end
           4'b1011: begin //reg00
                     case (nBit)
                      7: MISO = 0;
                      8: MISO = 1;
                      9: MISO = 0;
                     10: MISO = !(REGIN[0] & REGIN[1] & REGIN[2] & REGIN[3]);
                     11: MISO = REGIN[3];
                     12: MISO = REGIN[2];
                     13: MISO = REGIN[1];
                         14: MISO = REGIN[0];
                      default: MISO = 1'bz;
                     endcase
                  end
                     default: MISO = 1'bz;
                  endcase
      end
      else MISO = 1'bz;
   end
end            
/****************************************************************************/
/****************************************************************************/    

/****************************************************************************/
/****************************************************************************/                
//запись
always @ (posedge SCKIN)
begin
    if(SS_CPLD == 0)
    begin
      if(keyreg [0] == 0)  //бит на запись
        begin
          case (keyreg)
          4'b0000: begin //reg00
                  case (nBit)
                      8: REG00[7] = MOSIIN;
                      9: REG00[6] = MOSIIN;
                     10: REG00[5] = MOSIIN;
                     11: REG00[4] = MOSIIN;
                     12: REG00[3] = MOSIIN;
                     13: REG00[2] = MOSIIN;
                     14: REG00[1] = MOSIIN;
                         15: REG00[0] = MOSIIN;
                      default: MISO = 1'bz;
                     endcase
                  end
          4'b0100: begin //reg01
                  case (nBit)
                      8: REG01[7] = MOSIIN;
                      9: REG01[6] = MOSIIN;
                     10: REG01[5] = MOSIIN;
                     11: REG01[4] = MOSIIN;
                     12: REG01[3] = MOSIIN;
                     13: REG01[2] = MOSIIN;
                     14: REG01[1] = MOSIIN;
                         15: REG01[0] = MOSIIN;
                      default: MISO = 1'bz;
                     endcase
                  end
          4'b0010: begin //reg02
                  case (nBit)
                      8: REG02[7] = MOSIIN;
                      9: REG02[6] = MOSIIN;
                     10: REG02[5] = MOSIIN;
                     11: REG02[4] = MOSIIN;
                     12: REG02[3] = MOSIIN;
                     13: REG02[2] = MOSIIN;
                     14: REG02[1] = MOSIIN;
                         15: REG02[0] = MOSIIN;
                      default: MISO = 1'bz;
                     endcase
                        
/*                         //запись в LED
                         if (REG02 == 8'b01000001)
                        led <= REGIN[0];
                      else
                      if (REG02 == 8'b01000010)
                        led <= REGIN[1];
                      else
                      if (REG02 == 8'b01000100)
                        led <= REGIN[2];
                      else
                      if (REG02 == 8'b01001000)
                        led <= REGIN[3];
                 else
                      if (REG02 == 8'b01010000)
                        led <= !(REGIN[0] & REGIN[1] & REGIN[2] & REGIN[3]);
*/                        
                        
                        
                        
                  end
                  endcase
      end
      else MISO = 1'bz;
   end
end
/****************************************************************************/
/****************************************************************************/

endmodule


Led должен смотреть за входящими данными, но я закоментил, и пока на Led выведен только чип селект. Прост к светодиоду подпояться легче, а вся плата - это субмодуль FMC, который стоит в модуле, который установлен в крейт.

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

Сообщение отредактировал estel23 - Sep 25 2015, 09:28
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 25 2015, 07:03
Сообщение #26


Гуру
******

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



Ох....
Ну если вы схемотехник то вам должно быть знакомо понятие сдвиговые регистры...


Код
if(SS_CPLD==1)
      nBit <= 5'b00000;
    else if (SS_CPLD==0)


else if не надо, это только синтезатор путает. Стандартная конструкция с асинхронным сбросом или установкой

Код
always @(posedge clk or posedge reset)
if(reset == ....)
....
else
....


у вас CS выступает как асинхронный сброс и установка, потому просто else , если бы в блоке был и сброс и установка, else if был бы уместен для приоритетов, а так уберите...



раздел
Цитата
//выбор регистра, запись/чтение
очень сложно написан, у вас вообще одно и тоже по 10 раз в проекте делается
вы представляете что когда вы пишите вот так

Код
case (nBit)
                      8: REG02[7] = MOSIIN;
                      9: REG02[6] = MOSIIN;
                     10: REG02[5] = MOSIIN;
                     11: REG02[4] = MOSIIN;
                     12: REG02[3] = MOSIIN;
                     13: REG02[2] = MOSIIN;
                     14: REG02[1] = MOSIIN;
                     15: REG02[0] = MOSIIN;


вы получаете мультиплексор, который выбирает 1 бит, потом 2, потом 3. При этом у вас еще один мультиплексор прямо сразу по выбору case (keyreg). Иногда синтезатор понимает ваш хитрый план и сам ставить сдвиговые регистры, но иногда это остается мультиплексорами, съедает кучу ресурсов и очень медленно работает... А у вас их еще и 3 независимых может выйти... даже вернее 6, если не 9....


Если хотите можем совместно принести это в порядок по пунктам вам надо написать модуль SPI
который читает и передает 1 байт.
и дальше сделать просто принять байт, по принятому байту выбрать адрес чтения и записи, и еще раз принять или записать байт.





как кстати вы определяете что в данном такте делается, читается или передается?
Как я понимаю другого клока кроме SPI в проекте нет?
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 25 2015, 07:43
Сообщение #27


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

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



Цитата(Golikov A. @ Sep 25 2015, 11:03) *
как кстати вы определяете что в данном такте делается, читается или передается?
Как я понимаю другого клока кроме SPI в проекте нет?


По данным с COM-порта я вижу какие данные и в какой регистр уходят и приходят, ну и сравниваю с показателями осцилла.


Цитата(Golikov A. @ Sep 25 2015, 11:03) *
Если хотите можем совместно принести это в порядок по пунктам вам надо написать модуль SPI
который читает и передает 1 байт.
и дальше сделать просто принять байт, по принятому байту выбрать адрес чтения и записи, и еще раз принять или записать байт.


А нужно мне сделать обмен по SPI вот этого модуля (см. файл).
Там на 18 странице показана структура, а на 30 странице - регистры.

Я согласен что мой код кривоват, но он по крайней мере передает и принимает правильную информацию.
На рисунке RW - запись/чтение, биты А1, А0 - выбор регистра.





Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  FMC12x_user_manual.pdf ( 1.11 мегабайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 25 2015, 09:00
Сообщение #28


Гуру
******

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



Цитата
Я согласен что мой код кривоват, но он по крайней мере передает и принимает правильную информацию.

то есть все нормально и вы счастливы?
Go to the top of the page
 
+Quote Post
estel23
сообщение Sep 25 2015, 09:25
Сообщение #29


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

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



Цитата(Golikov A. @ Sep 25 2015, 13:00) *
то есть все нормально и вы счастливы?


Практически да, все норм кроме начала запуска, когда идет инверсный клок, я уже писал про это.
http://electronix.ru/forum/index.php?s=&am...t&p=1367111

Все время данные сдвигаются на один бит влево

Сообщение отредактировал estel23 - Sep 25 2015, 09:25
Go to the top of the page
 
+Quote Post

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

 


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


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