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

 
 
> Сброс 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
 
Start new topic
Ответов
Golikov A.
сообщение Sep 24 2015, 19:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #3


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

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- estel23   Сброс SPI (Verilog)   Sep 9 2015, 15:23
- - EvgenyNik   Мастер-устройство работать с CS будет по словам (т...   Sep 9 2015, 15:44
|- - estel23   Цитата(EvgenyNik @ Sep 9 2015, 19:44) Мас...   Sep 9 2015, 15:49
- - EvgenyNik   Выведите состояние регистра на внешние пины (как с...   Sep 9 2015, 19:12
- - Golikov A.   Сдается мне что дело не в ресете.... конечно при н...   Sep 10 2015, 07:07
|- - estel23   Цитата(Golikov A. @ Sep 10 2015, 11:07) С...   Sep 10 2015, 07:42
|- - EvgenyNik   Цитата(estel23 @ Sep 10 2015, 10:42) ТАм ...   Sep 10 2015, 07:55
|- - estel23   Цитата(EvgenyNik @ Sep 10 2015, 11:55) Ни...   Sep 10 2015, 08:05
- - Golikov A.   Множество SPI slave режимов реализуются при асинхр...   Sep 10 2015, 08:14
- - EvgenyNik   Вариант: выкинуть SC18IS602IPW, подставив вместо н...   Sep 10 2015, 10:12
|- - estel23   Цитата(EvgenyNik @ Sep 10 2015, 14:12) Ва...   Sep 10 2015, 11:24
- - Golikov A.   в CPLD асинхронный сброс возможен? Кодalways @ ...   Sep 10 2015, 12:26
|- - estel23   Цитата(Golikov A. @ Sep 10 2015, 16:26) в...   Sep 23 2015, 13:37
- - Golikov A.   ЦитатаPLD работает когда начальная установка MISO ...   Sep 23 2015, 16:50
|- - estel23   Вообщем не могу правильно передавать биты во время...   Sep 24 2015, 08:27
- - Golikov A.   ЦитатаПоложение MISO важно, т.к. если я его оставл...   Sep 24 2015, 09:30
|- - estel23   Цитата(Golikov A. @ Sep 24 2015, 13:30) M...   Sep 24 2015, 09:44
- - Genadi Zawidowski   Выход слейва - MISO - в каждом слейве дожден прохо...   Sep 24 2015, 09:53
|- - estel23   Цитата(Genadi Zawidowski @ Sep 24 2015, 13...   Sep 24 2015, 09:55
- - Genadi Zawidowski   OE буфера не должен ничем стробироваться, просто у...   Sep 24 2015, 10:00
|- - estel23   Цитата(Genadi Zawidowski @ Sep 24 2015, 14...   Sep 24 2015, 10:07
|- - EvgenyNik   Цитата(estel23 @ Sep 24 2015, 13:07) АЦП,...   Sep 24 2015, 13:53
|- - estel23   Цитата(EvgenyNik @ Sep 24 2015, 17:53) А ...   Sep 24 2015, 14:28
- - Golikov A.   Ох.... Ну если вы схемотехник то вам должно быть з...   Sep 25 2015, 07:03
|- - estel23   Цитата(Golikov A. @ Sep 25 2015, 11:03) к...   Sep 25 2015, 07:43
- - Golikov A.   ЦитатаЯ согласен что мой код кривоват, но он по кр...   Sep 25 2015, 09:00
- - estel23   Цитата(Golikov A. @ Sep 25 2015, 13:00) т...   Sep 25 2015, 09:25


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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 00:57
Рейтинг@Mail.ru


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