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

Продолжение разбирательств с GOWIN IP Core для SDRAM

Здравствуйте. Не знаю насколько это можно считать продолжением темы но задача уже не в ошибках.

 

 

В общем Скачал мануалы, даже разобрался с примером на Verilog где показана работа с SDRAM.

Сформировал корку для встроенной SDRAM.

Генератор предлагает вот такой код:

MySDRAM: SDRAM
	port map (
		O_sdram_clk => O_sdram_clk_o,
		O_sdram_cke => O_sdram_cke_o,
		O_sdram_cs_n => O_sdram_cs_n_o,
		O_sdram_cas_n => O_sdram_cas_n_o,
		O_sdram_ras_n => O_sdram_ras_n_o,
		O_sdram_wen_n => O_sdram_wen_n_o,
		O_sdram_dqm => O_sdram_dqm_o,
        IO_sdram_dq => IO_sdram_dq_io,
        O_sdram_addr => O_sdram_addr_o,
		O_sdram_ba => O_sdram_ba_o,

        I_sdrc_clk => InClock_50,
		I_sdram_clk => InClock_50,
        
        O_sdrc_data => O_sdrc_data_o,		
        I_sdrc_addr => I_sdrc_addr_i,
		I_sdrc_data => I_sdrc_data_i,

		I_sdrc_wr_n => I_sdrc_wr_n_i,
		I_sdrc_rd_n => I_sdrc_rd_n_i,

		I_sdrc_data_len => I_sdrc_data_len_i,
        
		I_sdrc_rst_n => I_sdrc_rst_n_i,
		

		I_sdrc_selfrefresh => I_sdrc_selfrefresh_i,
		I_sdrc_power_down => I_sdrc_power_down_i,

		I_sdrc_dqm => I_sdrc_dqm_i,				
        
		O_sdrc_init_done => O_sdrc_init_done_o,
		O_sdrc_busy_n => O_sdrc_busy_n_o,
		O_sdrc_rd_valid => O_sdrc_rd_valid_o,
		O_sdrc_wrd_ack => O_sdrc_wrd_ack_o
	);

 

Вот тут я вижу несколько несоответствий.

В общем если мы смотрим мануал Gowin SDRAM Controller User Guide то там показан следующий скрин:

image.thumb.png.b2e02916ab410fb7f98a8694f3774a3d.png

То есть у модуля имеем 5 выходных линий. Но видимо это устаревший вариант мануала и в среде разработки мне говорят использовать модуль HS:

Цитата

This controller is dedicated for embedded SDRAMs in the following devices. It should be considered for legacy designs. New designs should consider using SDRAM Controller HS.

 

image.thumb.png.6d10b03b0608f8f6e7f958630365cfbf.png 

Генерю код для HS.

your_instance_name: SDRAM_Controller_HS_Top
	port map (
		O_sdram_clk => O_sdram_clk_o,
		O_sdram_cke => O_sdram_cke_o,
		O_sdram_cs_n => O_sdram_cs_n_o,
		O_sdram_cas_n => O_sdram_cas_n_o,
		O_sdram_ras_n => O_sdram_ras_n_o,
		O_sdram_wen_n => O_sdram_wen_n_o,
		O_sdram_dqm => O_sdram_dqm_o,
		O_sdram_addr => O_sdram_addr_o,
		O_sdram_ba => O_sdram_ba_o,
		IO_sdram_dq => IO_sdram_dq_io,
		I_sdrc_rst_n => I_sdrc_rst_n_i,
		I_sdrc_clk => I_sdrc_clk_i,
		I_sdram_clk => I_sdram_clk_i,
		I_sdrc_cmd_en => I_sdrc_cmd_en_i,
		I_sdrc_cmd => I_sdrc_cmd_i,
		I_sdrc_precharge_ctrl => I_sdrc_precharge_ctrl_i,
		I_sdram_power_down => I_sdram_power_down_i,
		I_sdram_selfrefresh => I_sdram_selfrefresh_i,
		I_sdrc_addr => I_sdrc_addr_i,
		I_sdrc_dqm => I_sdrc_dqm_i,
		I_sdrc_data => I_sdrc_data_i,
		I_sdrc_data_len => I_sdrc_data_len_i,
		O_sdrc_data => O_sdrc_data_o,
		O_sdrc_init_done => O_sdrc_init_done_o,
		O_sdrc_cmd_ack => O_sdrc_cmd_ack_o
	);

 

вопрос в том куда подключать линии:

O_sdram_clk => O_sdram_clk_o,
		O_sdram_cke => O_sdram_cke_o,
		O_sdram_cs_n => O_sdram_cs_n_o,
		O_sdram_cas_n => O_sdram_cas_n_o,
		O_sdram_ras_n => O_sdram_ras_n_o,
		O_sdram_wen_n => O_sdram_wen_n_o,

Они же явно сделаны для внешней сдрам.

После портирования кода примера на VHDL после включения флаги я висну в состоянии STATE_IDLE видимо потому что модуль не выставляет флаги готовности.

when RESET=>
        I_sdrc_selfrefresh_i <= '1';
        bytes_counter <= shift; 
        I_sdrc_dqm_i <= (others => '0'); -- аналогично маске для 4 байтов в данных
        I_sdrc_wr_n_i <= '1';
        I_sdrc_rd_n_i <= '1';
        I_sdrc_data_i <=  (others => '0');
        dst_write_adr <= 0;
        src_read_adr <= 0;
        I_sdrc_rst_n_i <= '0';
        write_data_len <= 4;
        inbufptr := 1;

debug_led_drive <= '0';
        if delay_counter> 10 then
            --debug_led_drive <= not debug_led_drive;
            delay_counter <= 0;
            mstate <= STATE_IDLE; 
            I_sdrc_rst_n_i <= '1';            
            I_sdrc_power_down_i <= '0';
            shift := shift + 1;
            mem_buffer(0) <= std_logic_vector(to_unsigned(shift, 8)) ;  
        else 
            delay_counter <= delay_counter + 1; 
        end if;
    when STATE_IDLE=>
        if O_sdrc_init_done_o = '1' and O_sdrc_busy_n_o = '1'  then         
            mstate <= STATE_WRITE_WAIT;
            debug_led_drive <= '1'; 
        end if;

 

Что я сделал не так то?? Что мне сделать с выходными линиями чтобы они подключились к встроеной sdram?

 

 

 

Изменено пользователем Worldmaster

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


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

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

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

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

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

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

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

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

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

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