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

 
 
> Не получается реализовать SRAM интерфейс
zuy
сообщение Aug 14 2012, 06:22
Сообщение #1


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

Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593



Чтобы потренироваться работать с 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 то картинка становится идеальной( зеленый график ).
Прикрепленное изображение


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


Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:35
Рейтинг@Mail.ru


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