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

Размещение компонентов на чипе

В 14.05.2024 в 19:13, Alex77 сказал:

Мне так видится что ТС темнит - 50MHz идёт куда-то ещё и соответственно есть CDC 50 на 160 (аль на оборот).

вот код модуля

 

entity SDRAM_SERIALIZER is 
 
port ( 
    rst_n : in std_logic;  

	isdram_clk : in std_logic; 
	isdrc_clk : in std_logic; 

    RAMIsReady: out std_logic;

	in_write_clk: in std_logic;
	int_read_clk: in std_logic;
	 
	cam1_data_ready: in std_logic;
	cam2_data_ready: in std_logic;
	
    cam_index: in std_logic;

	Buf_WriteData: in std_logic_vector(15 downto 0);
	Buf_ReadData: out std_logic_vector(31 downto 0);	 
	Buf_ReadAddr: in std_logic_vector(15 downto 0); 
	Buf_Read_Valid: out std_logic;

    RAM_StartAddress: in std_logic_vector(19 downto 0);
    RAM_DataCount: in std_logic_vector(19 downto 0);
    SDRAMInitDone: out std_logic;
    cam_frame_reading: in std_logic;

    IO_sdram_dq: inout std_logic_vector(31 downto 0);
    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)
); 
end SDRAM_SERIALIZER;

вот как он определяется в основном коде

 

SDRAM: SDRAM_SERIALIZER
	port map(
		rst_n  => sdram_rst_n,
		isdram_clk => clk_160_d22_mhz, 
		isdrc_clk => clk_160mhz, 
		
        RAMIsReady => Ram_IsReady,

		cam1_data_ready => Cam1_Mipi_Ready,
		cam2_data_ready => Cam2_Mipi_Ready,

        in_write_clk => Cam1_Mipi_Data_Read_Clk,
        int_read_clk => USB30_in_clk,
        cam_index => icam_index,

        Buf_WriteData => iBuf_WriteData,
        Buf_ReadData => iBuf_ReadData, 
        Buf_ReadAddr => iBuf_ReadAddr, 
        Buf_Read_Valid => iBuf_Read_Valid,
        RAM_StartAddress => iRAM_StartAddress,
        RAM_DataCount => iRAM_DataCount,
        cam_frame_reading => icam_frame_reading,
        SDRAMInitDone => iSDRAMInitDone,

		IO_sdram_dq => IO_sdram_dq,
		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
	); 

 

InClock_50 только pll питает ну и модуль i2c

clk160mhz: sdram_pll_clk
 		port map (
 			clkout => clk_160mhz,
 			lock => pll_lock_160,
 			clkoutp => clk_160_d22_mhz,
 			clkin => InClock_50
 		);

 

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


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

icam_index - откуда берётся оный сигнал ?  часом не из "модуль i2c " ?

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


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

В 15.05.2024 в 11:38, Alex77 сказал:

icam_index - откуда берётся оный сигнал ?  часом не из "модуль i2c " ?

не. i2c работают сами по себе. 

а это просто индекс камеры. он пока всегда в 1. он присутсвует чтобы в будущем переключать систему на разные камеры.

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

image.thumb.png.20e005f0ddd82963fe18b83e537cd136.png

 

наверное можно считать что все работает. )) 

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


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

ну так и " просто индекс камеры" есть выход триггера, который тактуется чем угодно но только не 160мгц. смотрите в rtl- просмотрщике откуда оно идёт.

пс: а когда их будет больше одной - тогда будете опять в ручную мельницы расставлять ?

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


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

Ну значит я слепой... Первые две красные строчки в отчёте.... вот там и упоминаются icam_index_s0/q

ps: в каком тактовом домёне будет формироваться количество камер ? ведь явно ведь не на 160 мгц? а оный сигнал идёт в модуль сдрам где тактовая как раз 160 мгц. и вы будете говорить что здесь нет пересечения по клокам ?

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

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


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

В 15.05.2024 в 18:37, Worldmaster сказал:

Ну ладно. С одним сигналом понятно. А с isdcaddr что не так? Они в одном домене уже.

А что это за сигнал? откуда и куда ?

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


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

В 15.05.2024 в 19:02, Alex77 сказал:

А что это за сигнал? откуда и куда ?

entity SDRAM_SERIALIZER is 
 
port ( 
    rst_n : in std_logic;  

	isdram_clk : in std_logic; 
	isdrc_clk : in std_logic; 

    RAMIsReady: out std_logic;

	in_write_clk: in std_logic;
	int_read_clk: in std_logic;
	 
	cam1_data_ready: in std_logic;
	cam2_data_ready: in std_logic;
	
    cam_index: in std_logic;

	Buf_WriteData: in std_logic_vector(15 downto 0);
	Buf_ReadData: out std_logic_vector(31 downto 0);	 
	Buf_ReadAddr: in std_logic_vector(15 downto 0); 
	Buf_Read_Valid: out std_logic;

    RAM_StartAddress: in std_logic_vector(19 downto 0);
    RAM_DataCount: in std_logic_vector(19 downto 0);
    SDRAMInitDone: out std_logic;
    cam_frame_reading: in std_logic;

    IO_sdram_dq: inout std_logic_vector(31 downto 0);
    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)
); 
end SDRAM_SERIALIZER;

 

это управляющий модуль. отвечает за взаимодействие с рамой. блоками пишет и читает.

кормиться тольео 160

		isdram_clk => clk_160_d22_mhz, 
		isdrc_clk => clk_160mhz, 

 

внутри этого модуля определен модуьл сдрам

MySDRAM: SDRAM_MODULE
	port map (
		rst_n => rst_n, 
		sdram_clk => isdram_clk,
		sdrc_clk => isdrc_clk, 

		IO_sdram_dq => IO_sdram_dq,
		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,
 
		transmit_en =>	RAM_transmit_en,
		RW 			=>	RAM_RW, 
		Data_count	 => RAM_Data_count,
  
  
		Bank_addr	 => RAM_Bank_addr,
		Row_addr	 => RAM_Row_addr,
		Col_addr	 => RAM_Col_addr,
	
  
  IsDataReady	 => RAM_IsDataReady,
		IsReady		 => RAM_IsReady,
		ReadData	 => RAM_ReadData,
		WriteData	 => RAM_WriteData,
        InitDone => SDRAMInitDone,
		Ack => RAM_Ack
);

 

вот эти сигналы

  
        Bank_addr     => RAM_Bank_addr,
        Row_addr     => RAM_Row_addr,
        Col_addr     => RAM_Col_addr,

 

один процесс на 160 формирует адрес и длину

а вот этот процесс сразу меняет состояние.

-- отдельный процесс для переключения состояния параметров
process(mode, RAM_ROW_ADDR_req, RAM_COL_ADDR_BIT_req, RAM_32BIT_WORD_COUNT_BIT_req, RAM_RW_BIT_req)
begin  
	if mode = '0' then 
		RAM_Bank_addr 	<= (others=>'0');
		RAM_Row_addr 	<= (others=>'0');
		RAM_Col_addr 	<= (others=>'0');
		RAM_Data_count 	<= (others=>'0');
        RAM_RW <= '0';
	else
		RAM_Bank_addr <= (others=>'0');
		RAM_Row_addr <= RAM_ROW_ADDR_req; 
		RAM_Col_addr <= RAM_COL_ADDR_BIT_req; 
		RAM_Data_count <= RAM_32BIT_WORD_COUNT_BIT_req;
		RAM_RW <= RAM_RW_BIT_req;		
	end if;
end process;

 

а в мсодуле рамы уже инициируется обработка по этим параметрам

cmd_io: process(sdrc_clk, rst_n  )
type fsm_state is(init, idle, init_command,  send_command, finalize,nop ); 
variable state: fsm_state:= init;
variable nextstate: fsm_state:= nop; 
variable mode_value: std_logic := '0'; 
variable waiter: std_logic_vector(2 downto 0):= (others => '0');
variable valid_req: std_logic := '0';
begin
if rst_n = '0'  then	 
	state := init;	
	bytes_counter <= (others => '0');   
	I_sdrc_cmd_en <= '0';     
	I_sdrc_addr <= (others => '0');     
	I_sdrc_cmd <= (others => '0');   
	I_sdrc_data_len <= (others => '0');  
	data_valid <= '0';	
	IsReady <= '1';		  
	
elsif rising_edge(sdrc_clk) then
	
	case state is	
        when init => 
            if O_sdrc_init_done = '1' then
                state := idle;
            end if;	
		when idle => 
			I_sdrc_precharge_ctrl <= '0';		
			if transmit_en = '1' then 
				bytes_counter <= Data_count - 1;   
				state := init_command;
				IsReady <= '0';	
				mode_value := '0';
				ack_state <= '0';	
				I_sdrc_addr_buffer <= bank_addr & row_addr & col_addr;						
			else 
				I_sdrc_addr_buffer <= (others => '0');
				IsReady <= '1';	
				state := idle;
				ack_state <= '1';										
			end if;
			
		when init_command =>	
			I_sdrc_cmd_en <='1';  
			--I_sdrc_addr <= bank_addr & row_addr & col_addr;			
			I_sdrc_addr <= I_sdrc_addr_buffer;			
			state := send_command; 
			if mode_value = '0' then                  
                waiter := std_logic_vector(to_unsigned(5, waiter'length));
				I_sdrc_cmd <=  ACTIVATE_CMD; 
                mode_value := '1';
				nextstate := init_command;
			else  
				waiter := (others => '0');   
				nextstate := finalize;
				state := send_command;
				I_sdrc_data_len <= bytes_counter;  -- длина 1 байт (LEN-1) 	 							
				
				I_sdrc_precharge_ctrl <= '1';
				if RW = WRITE then    					 		
					I_sdrc_cmd <= WRITE_CMD;  						
				else 	 
					I_sdrc_cmd <= READ_CMD;  
					waiter := std_logic_vector(to_unsigned(4, waiter'length)) ; 				
				end if;	 	 				 				
			end if;      
		when send_command =>			
			I_sdrc_cmd_en <= '0';     
			I_sdrc_cmd <= (others => '0');  
			I_sdrc_addr <= (others => '0');  
			I_sdrc_data_len <= (others => '0');   
				
            if waiter = 0 then
                state := nextstate; 
				data_valid <= not RW;					
			else 
				waiter := waiter - 1;
            end if;		
		when finalize =>   
			if bytes_counter > 0 then
				data_valid <= '1';	 			 
				bytes_counter <= bytes_counter - 1;  				
			else 		 
				data_valid <= '0';
				nextstate := idle;				
				state := nop; 
				waiter :=  std_logic_vector(to_unsigned(2, waiter'length)) ; -- задержка на чтение и precharge
			end if; 
		when nop =>  
			if transmit_en = '0' then 
				state := nextstate;	
			end if;
			
			if waiter = 0 then 
				ack_state <= '1';          
			else 
				waiter := waiter - 1;
            end if;	 
    end case;
end if;
end process cmd_io; 

 

и только тут и задается I_sdrc_addr_buffer <= bank_addr & row_addr & col_addr;

 

 

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


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

если вопрос про I_sdrc_addr_buffer (это тоже самое что и isdcaddr  ???)  - то ищем место где формируется сигнал device_state (в этих листингах отсутствует)....

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


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

На телефоне пишу. Да, это одно и те же сигналы. И device state тут нет. Потому как он не участвует тут вообще. О том и речь. 

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


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

ну даа.. " не участвует тут вообще". смотрим красные строчки под номером 3 5 6 итд..

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


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

вот весь проект. а то чего я кусками ..

src.7z

 

актуальный скрин ошибок

image.thumb.png.78ff8fb6ac2e73434d119d55e45987aa.png

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

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


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

Смотрим на оранжевый. На синий пунктир тактовой. На сплошной синий, который управляет мультиплексированием данных (собственно которые идут в модуль MySDRAM) и видим РАЗНЫЕ тактовые inclock_50 и 160 мгц для модуля MySDRAM.

Ну и ? Разве не CDC здесь на лицо ? всё согласно актуальному скрину ошибок. О чём опытные собаководы изначально и говорили о пересечении клоков.

schematic1.pdf

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


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

Никто и не спорит что тут cdc. ) очевидно что опытным собаководам все понятно. Но вот вы единственный смогли ткнуть носом прям конкретно а диаграмму. И теперь мне уже становится очевиднее хотя бы как эту линию проверять и вообще понять каким путем сигнал идёт.

А есть пример гарантированно рабочего кода для cdc? А то я тут нашел какой то простейший, в соседней теме пример, но он как то странно работает. 

 

А в чем вы эту диаграмму делали ? У меня в gowin такая каша получается что хрен поймёшь что куда идёт. 

 

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


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

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

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

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

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

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

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

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

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

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