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

Здравствуйте.

При использовании IP Core для SDRAM GOWIN получаю вот такое предупреждение:

Цитата

WARN  (CV0023) : Sweep user defined iobuf instance "IO_sdram_dq_0_iobuf" with dangling iopin("C:\Delme\FPGA\SimpleTest\src\sdram_controller_hs\sdram_controller_hs.vhd":1566)

 

Что это может значить? Модель же встроенный и конфигурируется при генерации IP.

Да и согласно даташита он используется самим модулем при взаимодействии с SDRAM

image.thumb.png.1da1df9737018870dcff529fe8b6f1e1.png

 

 

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


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

Пожалуйста, приведите кусок кода sdram_controller_hs.vhd для строки 1566 и плюс-минус 20-30 строк, чтобы сориентироваться в причине ошибки или задать дополнительные вопросы.

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


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

В 16.08.2023 в 21:37, Lotos сказал:

приведите кусок кода sdram_controller_hs.vhd для строки 1566 и плюс-минус 20-30 строк, чтобы сориентироваться в причине ошибки или задать дополнительные вопросы.

Это код который генерирует IP Core для SDRAM. Половина зашифрована. Вот кусок который более менее понятен.

begin
IO_sdram_dq_0_iobuf: IOBUF
port map (
  O => IO_sdram_dq_in(0),
  IO => IO_sdram_dq(0),
  I => Ctrl_fsm_data(0),
  OEN => IO_sdram_dq_0);
IO_sdram_dq_1_iobuf: IOBUF
port map (
  O => IO_sdram_dq_in(1),
  IO => IO_sdram_dq(1),
  I => Ctrl_fsm_data(1),
  OEN => IO_sdram_dq_0);
IO_sdram_dq_2_iobuf: IOBUF
port map (
  O => IO_sdram_dq_in(2),
  IO => IO_sdram_dq(2),
  I => Ctrl_fsm_data(2),
  OEN => IO_sdram_dq_0);
IO_sdram_dq_3_iobuf: IOBUF
port map (
  O => IO_sdram_dq_in(3),
  IO => IO_sdram_dq(3),
  I => Ctrl_fsm_data(3),
  OEN => IO_sdram_dq_0);
IO_sdram_dq_4_iobuf: IOBUF

 

 

В 17.08.2023 в 07:37, Strob сказал:

А у вас пин то назначен для этого сигнала?

Зачем? 

 

В 16.08.2023 в 16:59, Worldmaster сказал:

Модель же встроенный и конфигурируется при генерации IP.

 

 

В даташите сказано что: 

Цитата

When you instantiate an embedded SDRAM controller in your design, the I/O ports connected with the SDRAM controller in the top design module should have the same name as that of the embedded SDRAM controller. Gowin YunYuan software will perform place and route automatically according to the designed I/O port name, which facilitates smooth communication between the SDRAM controller and the SDRAM.

Цитата

Когда вы создаете экземпляр встроенного контроллера SDRAM в своем проекте,
порты ввода/вывода, связанные с контроллером SDRAM в топовом исполнении
модуль должен иметь то же имя, что и встроенная SDRAM
контроллер. Программное обеспечение Gowin YunYuan выполнит размещение и маршрут
автоматически в соответствии с разработанным именем порта ввода-вывода, что облегчает
плавная связь между контроллером SDRAM и SDRAM.

 

Корка дала мне код такой:

component SDRAM_Controller_HS_Top
	port (
		O_sdram_clk: out std_logic;
		O_sdram_cke: out std_logic;
		O_sdram_cs_n: out std_logic;
		O_sdram_cas_n: out std_logic;
		O_sdram_ras_n: out std_logic;
		O_sdram_wen_n: out std_logic;
		O_sdram_dqm: out std_logic_vector(3 downto 0);
		O_sdram_addr: out std_logic_vector(10 downto 0);
		O_sdram_ba: out std_logic_vector(1 downto 0);
		IO_sdram_dq: inout std_logic_vector(31 downto 0);
		I_sdrc_rst_n: in std_logic;
		I_sdrc_clk: in std_logic;
		I_sdram_clk: in std_logic;
		I_sdrc_cmd_en: in std_logic;
		I_sdrc_cmd: in std_logic_vector(2 downto 0);
		I_sdrc_precharge_ctrl: in std_logic;
		I_sdram_power_down: in std_logic;
		I_sdram_selfrefresh: in std_logic;
		I_sdrc_addr: in std_logic_vector(20 downto 0);
		I_sdrc_dqm: in std_logic_vector(3 downto 0);
		I_sdrc_data: in std_logic_vector(31 downto 0);
		I_sdrc_data_len: in std_logic_vector(7 downto 0);
		O_sdrc_data: out std_logic_vector(31 downto 0);
		O_sdrc_init_done: out std_logic;
		O_sdrc_cmd_ack: out std_logic
	);
end component;

Я не меняя наименований линий добавил к себе:

 

MySDRAM:  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
	);

 

Также создал сигналы:

 

signal O_sdram_clk_o:   std_logic;
signal O_sdram_cke_o:   std_logic;
signal O_sdram_cs_n_o:   std_logic;
signal O_sdram_cas_n_o:   std_logic;
signal O_sdram_ras_n_o:   std_logic;
signal O_sdram_wen_n_o:   std_logic;
signal O_sdram_dqm_o:   std_logic_vector(3 downto 0);
signal O_sdram_addr_o:   std_logic_vector(10 downto 0);
signal O_sdram_ba_o:   std_logic_vector(1 downto 0);
signal IO_sdram_dq_io:   std_logic_vector(31 downto 0):= (others => 'Z'); 
signal I_sdrc_rst_n_i:   std_logic  := '0';
signal I_sdram_selfrefresh_i:   std_logic := '1';
signal I_sdram_power_down_i:   std_logic := '0'; 
signal I_sdrc_cmd_en_i:   std_logic := '0';
signal I_sdrc_cmd_i:   std_logic_vector(2 downto 0):= (others => '0'); 
signal I_sdrc_precharge_ctrl_i:   std_logic := '0';
signal O_sdrc_cmd_ack_o:   std_logic;
signal I_sdrc_clk_i:   std_logic;
signal I_sdram_clk_i :   std_logic;
signal I_sdrc_addr_i:   std_logic_vector(20 downto 0) := (others => '0'); 
signal I_sdrc_data_len_i:   std_logic_vector(7 downto 0) := (others => '0'); 
signal I_sdrc_dqm_i:   std_logic_vector(3 downto 0) := (others => '0'); 
signal I_sdrc_data_i:   std_logic_vector(31 downto 0) := (others => '0'); 
signal O_sdrc_data_o:   std_logic_vector(31 downto 0);
signal O_sdrc_init_done_o:   std_logic; 

 

 

Код собирается отлично но вот этот варнинг немного настораживает.

 

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

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


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

Quote

the I/O ports connected with the SDRAM controller in the top design module should have the same name as that of the embedded SDRAM controller

вот эту фразу, я бы все же расценил как сохранение имени пина на топе, тогда как у вас на топе другие имена портов/сигналов в модуле верхнего уровня, вы добавили суффиксы _i и _o, а изначальный варининг " Sweep user defined iobuf instance" и говорит о каком то сдвиге портов данных, может быть потому что все зацепленно на другие пины.

1 hour ago, Worldmaster said:

Код собирается отлично но вот этот варнинг немного настораживает.

а память работает, тесты памяти проходят?

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


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

В 17.08.2023 в 09:32, des00 сказал:

от эту фразу, я бы все же расценил как сохранение имени пина на топе, тогда как у вас на топе другие имена портов, вы добавили суффиксы _i и _o

Я не добавлял ничего в код который мне предоставил генератор корки.

--Copyright (C)2014-2022 Gowin Semiconductor Corporation.
--All rights reserved.
--File Title: Template file for instantiation
--GOWIN Version: GowinSynthesis V1.9.8.07
--Part Number: GW2AR-LV18EQ144C8/I7
--Device: GW2AR-18
--Created Time: Thu Aug 17 09:38:29 2023

--Change the instance name and port connections to the signal names
----------Copy here to design--------

component SDRAM_Controller_HS_Top
	port (
		O_sdram_clk: out std_logic;
		O_sdram_cke: out std_logic;
		O_sdram_cs_n: out std_logic;
		O_sdram_cas_n: out std_logic;
		O_sdram_ras_n: out std_logic;
		O_sdram_wen_n: out std_logic;
		O_sdram_dqm: out std_logic_vector(3 downto 0);
		O_sdram_addr: out std_logic_vector(10 downto 0);
		O_sdram_ba: out std_logic_vector(1 downto 0);
		IO_sdram_dq: inout std_logic_vector(31 downto 0);
		I_sdrc_rst_n: in std_logic;
		I_sdrc_clk: in std_logic;
		I_sdram_clk: in std_logic;
		I_sdrc_cmd_en: in std_logic;
		I_sdrc_cmd: in std_logic_vector(2 downto 0);
		I_sdrc_precharge_ctrl: in std_logic;
		I_sdram_power_down: in std_logic;
		I_sdram_selfrefresh: in std_logic;
		I_sdrc_addr: in std_logic_vector(20 downto 0);
		I_sdrc_dqm: in std_logic_vector(3 downto 0);
		I_sdrc_data: in std_logic_vector(31 downto 0);
		I_sdrc_data_len: in std_logic_vector(7 downto 0);
		O_sdrc_data: out std_logic_vector(31 downto 0);
		O_sdrc_init_done: out std_logic;
		O_sdrc_cmd_ack: out std_logic
	);
end component;

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
	);

----------Copy end-------------------

Разве что имя поменял. Или все нужно сделать что слева то и справа?

 

В 17.08.2023 в 09:32, des00 сказал:

а память работает, тесты памяти проходят?

Какие тесты должны быть?

Вообще модуль стабильно меняет состояние линии O_sdrc_init_done_o после ресета.

Также после завершения команд READ WRITE он также стабильно выдает O_sdrc_cmd_ack_o = '1'

Остальные тесты я только в modelsim делал но там ничего выдающегося. Могу конечно привести диаграммы всех команд. Там я дотошно вроде бы линии выставил.

 

В 17.08.2023 в 09:32, des00 сказал:

бы все же расценил как сохранение имени пина на топе

Ну вот сделал так:

MySDRAM:  SDRAM_Controller_HS_Top
	port map (
		O_sdram_clk => O_sdram_clk,
		O_sdram_cke => O_sdram_cke,
		O_sdram_cs_n => O_sdram_cs_n,
		O_sdram_cas_n => O_sdram_cas_n,
		O_sdram_ras_n => O_sdram_ras_n,
		O_sdram_wen_n => O_sdram_wen_n,
		O_sdram_dqm => O_sdram_dqm,
		O_sdram_addr => O_sdram_addr,
		O_sdram_ba => O_sdram_ba,
		IO_sdram_dq => IO_sdram_dq,
		I_sdrc_rst_n => I_sdrc_rst_n,
		I_sdrc_clk => I_sdrc_clk,
		I_sdram_clk => I_sdram_clk,
		I_sdrc_cmd_en => I_sdrc_cmd_en,
		I_sdrc_cmd => I_sdrc_cmd,
		I_sdrc_precharge_ctrl => I_sdrc_precharge_ctrl,
		I_sdram_power_down => I_sdram_power_down,
		I_sdram_selfrefresh => I_sdram_selfrefresh,
		I_sdrc_addr => I_sdrc_addr,
		I_sdrc_dqm => I_sdrc_dqm,
		I_sdrc_data => I_sdrc_data,
		I_sdrc_data_len => I_sdrc_data_len,
		O_sdrc_data => O_sdrc_data,
		O_sdrc_init_done => O_sdrc_init_done,
		O_sdrc_cmd_ack => O_sdrc_cmd_ack
	);

 

Ничего особо не изменилось.

Цитата

Sweep user defined iobuf instance "IO_sdram_dq_0_iobuf" with dangling iopin("C:\Delme\FPGA\SimpleTest\src\sdram_controller_hs\sdram_controller_hs.vhd":1566)

 

 

 

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


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

2 hours ago, Worldmaster said:

Зачем? 

Не совсем правильно выразился. Не пин, а порт в топ модуле подключен к этому сигналу?

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


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

32 minutes ago, Worldmaster said:

Разве что имя поменял. Или все нужно сделать что слева то и справа?

да кто их этих китайцев поймет.

32 minutes ago, Worldmaster said:

Какие тесты должны быть?

классические запись-чтение: 0x55, 0xAA, счетчик, инверсный счетчик, псп, по всем обьему памяти. Речь про запуск аппаратного теста на железке: топ, в нем контроллер и модуль проверки памяти.

 

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


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

В 17.08.2023 в 10:12, des00 сказал:

классические запись-чтение:

Так не работает ни запись ни чтение. Хотя хз что не работает.

При чтении всегда нули.

пишу счетчик ему.

Не пугайтесь. Код большой. 

 

process (GCLK )   
variable delay_read: integer :=0;
variable delay_write: integer :=0;
variable counter : integer:=0;
constant READ_CMD:std_logic_vector(2 downto 0):= "101";
constant ACTIVATE_CMD:std_logic_vector(2 downto 0):= "011";
constant WRITE_CMD:std_logic_vector(2 downto 0):= "100";
constant INTERRUPT_CMD:std_logic_vector(2 downto 0):= "110";
constant REFRESH_CMD:std_logic_vector(2 downto 0):= "001";
constant PRECHARGE_CMD:std_logic_vector(2 downto 0):= "010";
constant LOAD_MODE_CMD:std_logic_vector(2 downto 0):= "000";
constant NOP_CMD:std_logic_vector(2 downto 0):= "111";
constant SELECT_CMD:std_logic_vector(2 downto 0):= "011";
variable ptr_idx: integer :=0;
variable md_idx: integer :=0;

variable loadmode: integer :=0;

begin 
 
if rising_edge(GCLK) then

case mstate is          
    when RESET=>
        I_sdrc_rst_n <= '0';  
        SDRAM_BUSY <= '0';
        I_sdram_selfrefresh <= '0'; 
        I_sdrc_dqm <= (others => '1'); -- аналогично маске для 4 байтов в данных 
        I_sdrc_data <=  (others => 'Z');
        I_sdrc_precharge_ctrl <= '0';
        

        rd_len <= 0;  
        rd_idx <= 0;     
        wr_len <=0;
        wr_idx <=0;
        col_addr <= std_logic_vector(to_unsigned(0, col_addr'length));
        row_addr <= std_logic_vector(to_unsigned(0, row_addr'length));
        bank_addr <= std_logic_vector(to_unsigned(0, bank_addr'length));
        I_sdrc_addr <= (others => 'Z');       
        I_sdrc_cmd <= (others => 'Z');         
        I_sdrc_cmd_en <='0';
        I_sdrc_data_len <= (others => 'Z');  

        -- wait > 100 us
        if delay_counter >= 1_000_000 then
            delay_counter <= 0;
            mode_count <= mode_count + 1;
            sdram_addr_request <= (others => 'Z');
            sdram_request_data <= (others => 'Z');
            wait_ack_request <= '0';

            case mode_count is   
                when 0=>
                md_idx := 0;
loadmode := loadmode + 1;
-------------------------------------------------------------
-- Initialization   
                when 1 => 
                    sdram_request_cmd <= NOP_CMD;                     
                    mstate <= SDRAM_CMD_PROCESS; 
                    after_cmd_request_delay <= 5;
                when 2 => 
                    sdram_request_cmd <= PRECHARGE_CMD; 
                    sdram_addr_request <= (others => '1');   -- all banks
                    mstate <= SDRAM_CMD_PROCESS;
                    after_cmd_request_delay <= tRP;
                    wait_ack_request <='1';
                when 3 => 
                    sdram_request_cmd <= NOP_CMD;                     
                    mstate <= SDRAM_CMD_PROCESS; 
                    after_cmd_request_delay <= 5;
                when 4 => 
                    sdram_request_cmd <= REFRESH_CMD; 
                    mstate <= SDRAM_CMD_PROCESS; 
                    after_cmd_request_delay <= tRFC; 
                when 5 => 
                    sdram_request_cmd <= NOP_CMD;                     
                    mstate <= SDRAM_CMD_PROCESS; 
                    after_cmd_request_delay <= 5;
                when 6 => 
                    sdram_request_cmd <= REFRESH_CMD; 
                    mstate <= SDRAM_CMD_PROCESS; 
                    after_cmd_request_delay <= tRFC; 
                when 7 => 
                    sdram_request_cmd <= NOP_CMD;                     
                    mstate <= SDRAM_CMD_PROCESS; 
                    after_cmd_request_delay <= 5;
                when 8 => 
                    sdram_request_cmd <= LOAD_MODE_CMD;    
                    sdram_addr_request <= "000000000000000110000"; -- config 
                    mstate <= SDRAM_CMD_PROCESS;
                    after_cmd_request_delay <= tMRD; 
                when 9 => 
                    sdram_request_cmd <= NOP_CMD;                     
                    mstate <= SDRAM_CMD_PROCESS; 
                    after_cmd_request_delay <= 5;
-------------------------------------------------------------

                when 10 =>  
                    sdram_request_cmd <= PRECHARGE_CMD; 
                    sdram_addr_request <= (others => '1');   -- all banks   
                    mstate <= SDRAM_CMD_PROCESS;
                    after_cmd_request_delay <= tRP;
                when 11 => 
                    sdram_request_cmd <= ACTIVATE_CMD;
                    mstate <= SDRAM_CMD_PROCESS;
                    sdram_addr_request <= "00000000" & bank_addr & row_addr ;
                    after_cmd_request_delay <= tRCD;
                when 12 =>  
                    mstate <= SDRAM_WRITE;
                    after_cmd_request_delay <= tWR; 
                when 13 => 
                    sdram_request_cmd <= REFRESH_CMD; 
                    mstate <= SDRAM_CMD_PROCESS;
                    after_cmd_request_delay <= tRFC;
                when 14 => 
                sdram_request_cmd <= PRECHARGE_CMD; 
                    sdram_addr_request <= (others => '1');   -- all banks   
                    mstate <= SDRAM_CMD_PROCESS;
                    after_cmd_request_delay <= tRP;
                when 15 => 
                    sdram_request_cmd <= ACTIVATE_CMD;
                    mstate <= SDRAM_CMD_PROCESS;
                    sdram_addr_request <= "00000000" & bank_addr & row_addr ;
                    after_cmd_request_delay <= tRCD;
                when 16 => 
                    mstate <= SDRAM_READ;
                    after_cmd_request_delay <= CL;
                when 17 =>  
                    sdram_request_cmd <= REFRESH_CMD; 
                    mstate <= SDRAM_CMD_PROCESS;
                when others=>
                    mode_count <= 12;
            end case; 
            
        else 
            delay_counter <= delay_counter + 1; 
        end if;
---------------------------------------------------------------------
-- ЧТЕНИЕ БЕЗ ПРЕДВАРИТЕЛЬНОЙ ЗАРЯДКИ
---------------------------------------------------------------------
    when SDRAM_READ =>
        SDRAM_BUSY <= '1';
        rd_len <= 16; -- считаем словами
        rd_idx <= 0;    -- адрес нуля
        --I_sdrc_precharge_ctrl_i <= '1';

        I_sdrc_rst_n <= '1';     
        I_sdram_selfrefresh <= '0';
        I_sdram_power_down <= '0';   
        I_sdrc_cmd_en <='0';
        I_sdrc_cmd <= (others => 'Z');   
        I_sdrc_addr <= (others => 'Z');   
        I_sdrc_dqm <= (others => '0');   
        I_sdrc_data_len <= (others => 'Z');   
        I_sdrc_data <= (others => 'Z'); 
        if O_sdrc_init_done = '1' then          
            mstate <= SDRAM_READ_BEGIN;  
        end if;       

    when SDRAM_READ_BEGIN =>
        I_sdrc_cmd_en <='1';
        I_sdrc_cmd <= READ_CMD; 
        I_sdrc_addr <= "00000000000" & bank_addr & col_addr;
        I_sdrc_data_len <= std_logic_vector(to_unsigned(rd_len-1, I_sdrc_data_len'length)) ;  -- длина 1 байт (LEN-1)        
        mstate <= SDRAM_READ_ACK;  
        request_delay  <=0;
        ptr_idx := 0;
        mem_buffer(0) <=x"00"; 

    when SDRAM_READ_ACK=>
        I_sdrc_cmd_en <='0';
        I_sdrc_cmd <= NOP_CMD;  
        I_sdrc_addr <= (others => 'Z');  
        I_sdrc_data_len <= (others => 'Z');   
 
-- ACK выдается в самом конце чтения всего пакета данных. Показывает что чтение завершено
            if O_sdrc_cmd_ack = '0' then 
                mem_buffer(0) <= mem_buffer(0) + 1;             
            end if; 

        if request_delay < after_cmd_request_delay-1 then
            request_delay <= request_delay + 1;
        else
            if rd_len > 0 then
                rd_len <= rd_len - 1; -- принимаем нужное количество данных
 
                mem_buffer(ptr_idx) <= O_sdrc_data(31 downto 24);
                mem_buffer(ptr_idx + 1) <= O_sdrc_data(23 downto 16);
                mem_buffer(ptr_idx + 2) <= O_sdrc_data(15 downto 8);
                mem_buffer(15) <= O_sdrc_data(7 downto 0); 

                rd_idx <= rd_idx + 1;
                ptr_idx := 4;
            else 
                -- после последнего чтения надо еще подождать
                mstate <= SDRAM_WAIT_TIME;
                request_delay <= 1;
            end if;
        end if;         
    
        
        


---------------------------------------------------------------------
-- ЗАПИСЬ БЕЗ ПРЕДВАРИТЕЛЬНОЙ ЗАРЯДКИ
---------------------------------------------------------------------
    when SDRAM_WRITE =>
        SDRAM_BUSY <= '1';
        wr_len <= 8; -- запишем 8 байт
        wr_idx <= 0;    -- адрес записи с нуля 
        --I_sdrc_precharge_ctrl_i <= '1';

        I_sdrc_rst_n <= '1';     
        I_sdram_selfrefresh <= '0';
        I_sdram_power_down <= '0';   
        I_sdrc_cmd_en <='0';
        I_sdrc_cmd <= (others => 'Z');   
        I_sdrc_addr <= (others => 'Z');   
        I_sdrc_dqm <= (others => '0');   
        I_sdrc_data_len <= (others => 'Z');           
        if O_sdrc_init_done = '1' then          
            mstate <= SDRAM_WRITE_BEGIN;  
        end if;    
        
I_sdrc_data <= "11100011100011100010101000111000";
    when SDRAM_WRITE_BEGIN =>       
        I_sdrc_cmd_en <='1';
        I_sdrc_cmd <= WRITE_CMD;   
        I_sdrc_addr <= bank_addr & row_addr& col_addr;
        I_sdrc_data_len <= std_logic_vector(to_unsigned(wr_len-1, I_sdrc_data_len'length)) ;  -- длина 1 байт (LEN-1)        
        I_sdrc_data(31 downto 24) <= std_logic_vector(to_unsigned(counter, 8));
        I_sdrc_data(23 downto 16) <= std_logic_vector(to_unsigned(counter+1, 8));
        I_sdrc_data(15 downto 8) <= std_logic_vector(to_unsigned(counter+2, 8));
        I_sdrc_data(7 downto 0) <= std_logic_vector(to_unsigned(counter+3, 8)); 
        counter:=counter+4;
        mstate <= SDRAM_WRITE_WAIT_DATA;  
 
    when SDRAM_WRITE_WAIT_DATA=>        
        I_sdrc_cmd <= NOP_CMD;  
        I_sdrc_addr <= (others => 'Z');  
        I_sdrc_data_len <= (others => 'Z');   
        I_sdrc_cmd_en <='0';      

        if O_sdrc_cmd_ack = '0' then  
            mem_buffer(1) <= mem_buffer(1) + 1;             
        end if;  

        if wr_len - 1 > 0 then
            wr_len <= wr_len - 1;
            wr_idx <= wr_idx + 1;
            --I_sdrc_data_i(31 downto 24) <= std_logic_vector(to_unsigned(counter, 8));
            --I_sdrc_data_i(23 downto 16) <= std_logic_vector(to_unsigned(counter+1, 8));
            --I_sdrc_data_i(15 downto 8) <= std_logic_vector(to_unsigned(counter+2, 8));
            --I_sdrc_data_i(7 downto 0) <= std_logic_vector(to_unsigned(counter+3, 8));

I_sdrc_data <= "11100011100011100010101000111000";

            counter:=counter+4;
        else
            I_sdrc_data <= (others => 'Z');    
            mstate <= SDRAM_WAIT_TIME;
            request_delay <= 1;
        end if; 

---------------------------------------------------------------------
---------------------------------------------------------------------
    when SDRAM_CMD_PROCESS=>

        I_sdrc_rst_n <= '1';     
        I_sdram_selfrefresh <= '0';
        I_sdram_power_down <= '0';   
        I_sdrc_cmd_en <='0';
        I_sdrc_addr<=(others => 'Z');     
        if O_sdrc_init_done = '1' then            
            mstate <= SDRAM_CMD_PROCESS_1;   
        end if;     
   
    when SDRAM_CMD_PROCESS_1 =>   
        I_sdrc_cmd_en <='1';
        I_sdrc_data <= sdram_request_data;
        I_sdrc_addr <= sdram_addr_request;
        I_sdrc_cmd <=  sdram_request_cmd;                
        mstate <= SDRAM_CMD_PROCESS_2;  

    when SDRAM_CMD_PROCESS_2 =>   
        request_delay  <= 1;  
        I_sdrc_cmd_en <= '0';   
        I_sdrc_data <= (others => 'Z');     
        I_sdrc_addr <= (others => 'Z');     
        I_sdrc_cmd <= (others => 'Z');  
        mstate <= SDRAM_WAIT_TIME; 
---------------------------------------------------------------------
---------------------------------------------------------------------

    when SDRAM_WAIT_TIME =>        
        if request_delay >= after_cmd_request_delay then
            mstate <= RESET;
        else 
            request_delay <= request_delay + 1;
        end if;
---------------------------------------------------------------------
---------------------------------------------------------------------
    
    when others =>
        mstate <= RESET;
end case;


end if;
 

end process;

 

В 17.08.2023 в 10:12, des00 сказал:

да кто их этих китайцев поймет.

Отправил запрос этим людям, но они игнорируют напрочь. ((

Хотя очевидно что у самих СДК где то есть.

image.thumb.png.006e0a032a6769978edc0386d2ab9c6e.png

 

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


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

18 minutes ago, Worldmaster said:

Так не работает ни запись ни чтение. Хотя хз что не работает.

При чтении всегда нули.

значит варнинг не зря появился. По логике вещей, чип сдрам разварен у них рядом, он не является составной частью плис. Скорее всего на него идут определенные порты ввода/вывода, которые в системе идентифицируются по символьному имени и скрыты от пользователя. Вы связали их в топе сигналами, которые никуда не подключены. То что выдается ack, так он внутри формируется и выдаваться должен, наличие памяти на это не влияет. Вы пробовали сделать IO пины памяти на топе, с теми же именами, не связывая их физически с пинами плис в файле констрейнов?

 

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


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

В 17.08.2023 в 10:12, des00 сказал:

Речь про запуск аппаратного теста на железке: топ, в нем контроллер и модуль проверки памяти.

Так да. на железке и запускаю. Считываю в буфер и буфер считываю на комп через USB FIFO

В 17.08.2023 в 10:21, des00 сказал:

Вы пробовали сделать IO пины в памяти на топе, с теми же именами, не связывая их физически с пинами плис?

Не поянл. Я физически ни с чем не связывал. В топе ничего также не выводил и с физическими линиями никакими не связывал. Или я не про то.

Вот мой топ:

entity top is 
port (
    TB_GCLK: in std_logic:='0';

    InClock_50: in std_logic; --генератор входного клока на 50мгц
    DebugLed: out std_logic; -- выход отладочного светодиода    

    LaserOut: out std_logic:='0'; -- выход на лазер

    -- линии взаимодействия с FT601
    USB30_gpio_0: in std_logic ;
    USB30_gpio_1: in std_logic ;
    USB30_wakeup_n: inout std_logic:= '0';
    USB30_rd_n: out std_logic:= '1';    
    USB30_oe_n: out std_logic:= '1';
    USB30_wr_n: out std_logic:= '1';
    USB30_siwu_n: out std_logic := '1';
    USB30_in_clk : in std_logic:= '1';
    USB30_txe_n : in std_logic ;
    USB30_rxf_n: in std_logic ;  
    USB30_BE : inout std_logic_vector(3 downto 0):=(others=>'Z');
    USB30_DATA_1 : inout std_logic_vector(7 downto 0):=(others=>'Z');
    USB30_DATA_2 : inout std_logic_vector(7 downto 0):=(others=>'Z');
    USB30_DATA_3 : inout std_logic_vector(7 downto 0):=(others=>'Z');
    USB30_DATA_4 : inout std_logic_vector(7 downto 0):=(others=>'Z');
    -------------------------------------------------------------------

    sys_reset_i : in std_logic:='0';

    -- интерфейс взаимодействия с камерами
    CAM1_I2C_SDA: inout std_logic;    
    CAM1_I2C_SCL: out std_logic; 
    CAM1_GPIO_0: in std_logic;    
    CAM1_GPIO_1: in std_logic;    
    CAM1_GPIO_2: in std_logic;    
    CAM1_GPIO_3: in std_logic;    
    CAM1_RESET: in std_logic; 
    CAM1_DATA_P: in std_logic; 
    CAM1_DATA_N: in std_logic; 
    CAM1_DATA_2_P: in std_logic; 
    CAM1_DATA_2_N: in std_logic; 
    CAM1_CLK_P: out std_logic; 
    CAM1_CLK_N: out std_logic; 
    CAM1_EXT_CLK: in std_logic; 

    CAM2_I2C_SDA: inout std_logic;    
    CAM2_I2C_SCL: out std_logic; 
    CAM2_GPIO_0: in std_logic;    
    CAM2_GPIO_1: in std_logic;    
    CAM2_GPIO_2: in std_logic;    
    CAM2_GPIO_3: in std_logic;    
    CAM2_RESET: in std_logic; 
    CAM2_DATA_P: in std_logic; 
    CAM2_DATA_N: in std_logic; 
    CAM2_DATA_2_P: in std_logic; 
    CAM2_DATA_2_N: in std_logic; 
    CAM2_CLK_P: out std_logic; 
    CAM2_CLK_N: out std_logic; 
    CAM2_EXT_CLK: in std_logic;
    -------------------------------------------------------------------

    -- интерфейс взаимодействия с гироскопом
    GYRO_INT1: in std_logic;
    GYRO_INT2: in std_logic;
    GYRO_I2C_SDA: inout std_logic;    
    GYRO_I2C_SCL: inout std_logic  

);
end top;

 

У меня просто сигналы в архитектуре определены. Или это тоже не надо?

signal O_sdram_clk:   std_logic;
signal O_sdram_cke:   std_logic;
signal O_sdram_cs_n:   std_logic;
signal O_sdram_cas_n:   std_logic;
signal O_sdram_ras_n:   std_logic;
signal O_sdram_wen_n:   std_logic;
signal O_sdram_dqm:   std_logic_vector(3 downto 0);
signal O_sdram_addr:   std_logic_vector(10 downto 0);
signal O_sdram_ba:   std_logic_vector(1 downto 0);
signal IO_sdram_dq_io:   std_logic_vector(31 downto 0):= (others => 'Z'); 

 

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


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

11 minutes ago, Worldmaster said:

Не поянл. Я физически ни с чем не связывал. В топе ничего также не выводил и с физическими линиями никакими не связывал. Или я не про то.

Ну вот и добавьте пины сдрам(не сигналы, а в секцию описания портов), в тех же режимах что и должны были быть. В файле констрейнов, где прописано связывание пинов USB*, CAM* и т.д. прописывать эти пины сдрам не надо, скорее всего софт должен их знать. Вдруг именно так и задумал тайный китайский разработчик

 

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


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

В 17.08.2023 в 10:21, des00 сказал:

в файле констрейнов?

В этом файле для них связи нет. Это я понял. 

В 17.08.2023 в 10:31, des00 сказал:

В файле констрейнов, где прописано связывание пинов USB*, CAM* и т.д. прописывать эти пины сдрам не надо,

Так я этого и не делал.

Убрал определения из архитектуры так тоже ругается:

Цитата

'io_sdram_dq_io' is not declared("C:\Delme\FPGA\SimpleTest\src\usage.vhd":428)

 

В 17.08.2023 в 10:31, des00 сказал:

Ну вот и добавьте пины сдрам, в тех же режимах что и должно было быть.

Куда добавить то?SimpleTest_17082023.7z

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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