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

Не получается реализовать SRAM интерфейс

Чтобы потренироваться работать с FPGA подключил я Spartan 6 к микроконтроллеру на шину статической памяти в режиме 8 бит.

И для начала решил просто выдавать на шину данных последние 8 бит шины адреса. Планировалось получить что-то типа пилы.

Тактовая частота CLK_IN 100 МГц.

Набросал код:

module sram_test(
   input [12:0] ADDR,
   output[7:0] DATA,
   input  wire OE,
   input  wire RESET,
   input  wire CLK_IN,
   
   output TEST_1,
   output TEST_2,
   output TEST_3
   );

    reg[ 7 : 0 ] DATA_r;
    reg[ 12: 0 ] ADDR_r;
    reg[ 7 : 0 ] time_r;
    reg[ 1 : 0 ] state_r;
    reg          rd_strobe;
    
    always @( posedge CLK_IN ) begin
      if( ~RESET ) begin
         state_r = 0;      
      end else begin
         case( state_r )
            0:
               if( ~OE ) begin
                  state_r = 1;
                  time_r  = 2;
                  ADDR_r  = ADDR;
               end
               
            1:
               begin
                  time_r = time_r - 1'b1;
                  if( time_r == 0 ) begin
                     rd_strobe = 1;
                     time_r    = 2;
                     state_r   = 2;
                  end
               end
               
            2:
               begin
                  time_r = time_r - 1'b1;
                  if( time_r == 0 ) begin
                     rd_strobe = 0;
                     state_r   = 3;
                  end
               end
               
            3:
               if( OE )
                  state_r = 0;
               
            default: state_r = 0;
         endcase
      end
    end

    
    always @( posedge rd_strobe ) begin
      DATA_r <= ADDR_r[ 7 : 0 ];    
    end
    
    assign TEST_1 = OE;
    assign TEST_2 = DATA_r[ 0 ];
    assign TEST_3 = rd_strobe;
    assign DATA   = DATA_r;

endmodule

 

Задумал такую логику:

1. Жду активности OE, и запоминаю состояние шины адреса в этот момент

2. Через 2 такта делаю активным сигнал строба длиной также два такта. По фронту строба выдаю на шину данных младшие 8 бит запомненого адреса.

3. Жду пока OE станет неактивным и обратно к п.1.

 

Для проверки, я контроллером читаю последовательно 1024 байт и смотрю на прочитанный массив.

В результате получается пила но на ней постоянно в разных местах есть какие-то помехи и имеют они разную форму( синий график на картинке ).

Если я в послднем Always блоке заменяю сохраненый регистр ADDR_r на прямое подключение к шине адреса ADDR то картинка становится идеальной( зеленый график ).

post-11593-1344924952_thumb.png

 

Помогите понять, почему так происходит.

 

 

 

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


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

А в чем смысл в данном случае в одном олвейс блоке использовать блокирующие присваивания а в другом неблокирующие?

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


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

А в чем смысл в данном случае в одном олвейс блоке использовать блокирующие присваивания а в другом неблокирующие?

Похоже осталось после экспериментов.

Я пробовал в обоих блоках блокирующие, в обоих неблокирующие и разные. Результат никак не меняется.

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


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

Только обьявления пинов.

В этом похоже и причина, задайте SDC и будет вам счастие :laughing:

"TimeQuest для чайников" можно почитать для затравки

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


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

В этом похоже и причина, задайте SDC и будет вам счастие :laughing:

"TimeQuest для чайников" можно почитать для затравки

Спасибо за ссылку, почитал.

Правильно я понял, что вы думаете, у меня проявляется метастабильность из-за отсутствия констрейнов?

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

Значение на шине адреса уже устоялось на тот момент, когда OE стал активным. Далее только через 2 такта системного клока я генерирую строб для вывода данных, а это 20нс задержки. За это время шина адреса не меняет своего значения и, как я думаю, значение шины адреса уже запомнилось в регистре ADDR_r.

Не могу понять саму суть, откуда такие выпады могут появляться :(

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


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

Не могу понять саму суть, откуда такие выпады могут появляться

 

Разве Вы не получили при синтезе предупреждения

Warning (21074): Design contains 5 input pin(s) that do not drive logic

Warning (15610): No output dependent on input pin "ADDR[8]"

Warning (15610): No output dependent on input pin "ADDR[9]"

Warning (15610): No output dependent on input pin "ADDR[10]"

Warning (15610): No output dependent on input pin "ADDR[11]"

Warning (15610): No output dependent on input pin "ADDR[12]"

 

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


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

Разве Вы не получили при синтезе предупреждения

Warning (21074): Design contains 5 input pin(s) that do not drive logic

Warning (15610): No output dependent on input pin "ADDR[8]"

Warning (15610): No output dependent on input pin "ADDR[9]"

Warning (15610): No output dependent on input pin "ADDR[10]"

Warning (15610): No output dependent on input pin "ADDR[11]"

Warning (15610): No output dependent on input pin "ADDR[12]"

 

Получил. Но я и нигде и не использую биты старше 8-го от шины адреса. Я так решил, что синтезатор это понял и выкинул их из проекта, выдав это предупреждение.

Разве это может привести к такому результату, как у меня на картинке?

 

На всякий случай, урезал шину адреса до 8 бит. Пересобрал, ни одной ошибки и ни одного предупреждения больше нет, все стадии с зелеными галочками.

Но результат никак не поменялся.

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


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

В результате получается пила но на ней постоянно в разных местах есть какие-то помехи и имеют они разную форму( синий график на картинке ).

Помогите понять, почему так происходит.

 

Причина в этом:

 

always @( posedge CLK_IN )

always @( posedge rd_strobe )

 

никаких "производных" тактовых частот быть не должно

 

Второе важное замечание. Поскольку в state-машине внутри always вы используете блокирующие присваивания, поведение на модели не соответствует поведению "в железе". Измените на <=

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


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

Причина в этом:

 

always @( posedge CLK_IN )

always @( posedge rd_strobe )

 

никаких "производных" тактовых частот быть не должно

 

Второе важное замечание. Поскольку в state-машине внутри always вы используете блокирующие присваивания, поведение на модели не соответствует поведению "в железе". Измените на <=

 

Заменил все присваивания на неблокирующие. И упростил код, убрал второй блок Always и соеденил регистр ADDR_r напрямую с шиной данных.

Т.е. теперь код просто через 2 такта после активации OE запоминает адрес в ADDR_r, который соединен с шиной данных.

module sram_test(
   input [7:0] ADDR,
   output[7:0] DATA,
   input  wire OE,
   input  wire RESET,
   input  wire CLK_IN,
   
   output TEST_1,
   output TEST_2,
   output TEST_3
   );

    reg[ 7 : 0 ] ADDR_r;
    reg[ 7 : 0 ] time_r;
    reg[ 1 : 0 ] state_r;
    reg          rd_strobe;
    
    always @( posedge CLK_IN ) begin
      if( ~RESET ) begin
         state_r <= 0;      
      end else begin
         case( state_r )
            0:
               if( ~OE ) begin
                  state_r <= 1;
                  time_r  <= 2;
               end
               
            1:
               begin
                  time_r <= time_r - 1'b1;
                  if( time_r == 0 ) begin
                     rd_strobe <= 1;
                     ADDR_r    <= ADDR;
                     state_r   <= 2;
                  end
               end
               
            2:
               if( OE )
                  state_r <= 0;

            default: state_r <= 0;
         endcase
      end
    end

    assign TEST_1 = OE;
    assign TEST_2 = ADDR_r[ 0 ];
    assign TEST_3 = rd_strobe;
    assign DATA   = ADDR_r;

endmodule

 

Помех стало меньше и они изменили свой вид.

Правильно ли я понимаю, что теперь это похоже на то, что я иногда не верно детектирую сигнал OE ?

post-11593-1345184618_thumb.png

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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