|
Cyclone V SoC + DDR3, Подскажите по доступу |
|
|
|
Feb 19 2014, 10:00
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Добрый день, есть борда с циклоном 5 на борту, нужно получить доступ к памяти, но на этой борде память расположена со стороны процессорного модуля (HPS), а получить доступ нужно из логики, подскажите пожалуйста как лучше поступить или откуда копать необходимую инфу?
|
|
|
|
|
Feb 19 2014, 12:25
|
Местный
  
Группа: Свой
Сообщений: 375
Регистрация: 9-10-08
Из: Таганрог, Ростовская обл.
Пользователь №: 40 792

|
По новым чипам самая лучшае инфа - это мануал разработчика чипа. Тут как раз находится такая инфа.
--------------------
Глупцы игнорируют сложность. Прагматики терпят ее. Некоторые могут избегать ее. Гении ее устраняют.
|
|
|
|
|
Feb 22 2014, 18:18
|
Группа: Участник
Сообщений: 7
Регистрация: 22-02-14
Пользователь №: 80 642

|
Цитата(Serb1987 @ Feb 19 2014, 13:00)  Добрый день, есть борда с циклоном 5 на борту, нужно получить доступ к памяти, но на этой борде память расположена со стороны процессорного модуля (HPS), а получить доступ нужно из логики, подскажите пожалуйста как лучше поступить или откуда копать необходимую инфу? Из FPGA можно получить доступ к SDRAM через специальный мост FPGA2SDRAM он отпирается в Qsys в окне настройки HPS
|
|
|
|
|
Feb 23 2014, 09:35
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Спасибо, и далее нужно писать свой кусок Авалон-ММ мастер, я правильно понимаю?
|
|
|
|
|
Feb 24 2014, 12:28
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Благодарю, у меня еще вопрос, у меня есть проект который написан на VHDL в Quartus, но мне нужно получить доступ к DDR3 на стороне HPS, как мне поступить, работать в Qsys и влепить туда проект из Quartus или наоборот? Пробовал последний вариант но не знаю как подключить ноги физической памяти к сигналам mem_*.
|
|
|
|
|
Jun 2 2014, 02:49
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Добрый день, пока толкового ничего не нашел, поэтому прошу помощи у комьюнити, при подключении DDR3 как описано выше, запустил скрипт *pin_assignments.tcl, но после компиляции все равно есть ошибки о неподключенных пинах внешней памяти, и нет возможности ее подключить в пин планнере, как быть?
|
|
|
|
|
Jun 2 2014, 03:13
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
DDR3 на стороне HPS, а нужно получить доступ со стороны FPGA, мосты FPGA2HPS сконфигурил, подключил memory controller в виде IP (*.qip) в проекте Квартуса, даже компилится но говорит "Critical Warning (169085): No exact pin location assignment(s) for 150 pins of 152 total pins" то есть не видит пинов ног которые нужно подклюсить к физической памяти
|
|
|
|
|
Jun 2 2014, 05:28
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
тоесть на критикал ворнинги можно не смотреть, мол ноги не подключены и все такое?
Вопрос вдогонку, может я вообще не правильно понял, установив IP(DDR3.qip) модуль как отдельный компонент проекта, из которого торчат ноги для физического подключения памяти и ноги для F2H моста, то ноги для памяти я вывожу как интерфейс всего проекта, а F2H ноги использую как внутренние для авалон протокола, верно?
Сообщение отредактировал Serb1987 - Jun 2 2014, 05:36
|
|
|
|
|
Jun 2 2014, 05:55
|

Гуру
     
Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329

|
Цитата(Serb1987 @ Jun 2 2014, 11:38)  тоесть на критикал ворнинги можно не смотреть, мол ноги не подключены и все такое? нет, если есть неподключенные ноги, значит надо разбираться. касательно Цитата(Serb1987 @ Jun 2 2014, 11:38)  ..Вопрос вдогонку... У вас есть ваша Qsys система, в ней есть ваши PL модули и PS система, в PS системе есть компонент SDRAM. Ну и дальше.. Смотрите скриншот:
|
|
|
|
|
Jun 2 2014, 06:49
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
В Qsys уже все настроено и создан IP компонент, который потом вставлен в quartus как отдельный компонент.
entity TVS is -- generic ( -- ); Port (clk : in STD_LOGIC; DDR3_mem_a : out std_logic_vector(14 downto 0); -- mem_a DDR3_mem_ba : out std_logic_vector(2 downto 0); -- mem_ba DDR3_mem_ck : out std_logic; -- mem_ck DDR3_mem_ck_n : out std_logic; -- mem_ck_n DDR3_mem_cke : out std_logic; -- mem_cke DDR3_mem_cs_n : out std_logic; -- mem_cs_n DDR3_mem_ras_n : out std_logic; -- mem_ras_n DDR3_mem_cas_n : out std_logic; -- mem_cas_n DDR3_mem_we_n : out std_logic; -- mem_we_n DDR3_mem_reset_n : out std_logic; -- mem_reset_n DDR3_mem_dq : inout std_logic_vector(31 downto 0) := (others => 'X'); -- mem_dq DDR3_mem_dqs : inout std_logic_vector(3 downto 0) := (others => 'X'); -- mem_dqs DDR3_mem_dqs_n : inout std_logic_vector(3 downto 0) := (others => 'X'); -- mem_dqs_n DDR3_mem_odt : out std_logic; -- mem_odt DDR3_mem_dm : out std_logic_vector(3 downto 0); -- mem_dm DDR3_oct_rzqin : in std_logic := 'X' -- oct_rzqin ); end TVS;
architecture Behavioral of TVS is
component ddr3_controller is port ( memory_mem_a : out std_logic_vector(14 downto 0); -- mem_a memory_mem_ba : out std_logic_vector(2 downto 0); -- mem_ba memory_mem_ck : out std_logic; -- mem_ck memory_mem_ck_n : out std_logic; -- mem_ck_n memory_mem_cke : out std_logic; -- mem_cke memory_mem_cs_n : out std_logic; -- mem_cs_n memory_mem_ras_n : out std_logic; -- mem_ras_n memory_mem_cas_n : out std_logic; -- mem_cas_n memory_mem_we_n : out std_logic; -- mem_we_n memory_mem_reset_n : out std_logic; -- mem_reset_n memory_mem_dq : inout std_logic_vector(31 downto 0) := (others => 'X'); -- mem_dq memory_mem_dqs : inout std_logic_vector(3 downto 0) := (others => 'X'); -- mem_dqs memory_mem_dqs_n : inout std_logic_vector(3 downto 0) := (others => 'X'); -- mem_dqs_n memory_mem_odt : out std_logic; -- mem_odt memory_mem_dm : out std_logic_vector(3 downto 0); -- mem_dm memory_oct_rzqin : in std_logic := 'X'; -- oct_rzqin hps_0_f2h_sdram0_data_address : in std_logic_vector(29 downto 0) := (others => 'X'); -- address hps_0_f2h_sdram0_data_burstcount : in std_logic_vector(7 downto 0) := (others => 'X'); -- burstcount hps_0_f2h_sdram0_data_waitrequest : out std_logic; -- waitrequest hps_0_f2h_sdram0_data_writedata : in std_logic_vector(31 downto 0) := (others => 'X'); -- writedata hps_0_f2h_sdram0_data_byteenable : in std_logic_vector(3 downto 0) := (others => 'X'); -- byteenable hps_0_f2h_sdram0_data_write : in std_logic := 'X'; -- write reset_bridge_0_out_reset_reset : out std_logic; -- reset clock_bridge_0_in_clk_clk : in std_logic := 'X' -- clk ); end component ddr3_controller; begin
u0 : component ddr3_controller port map ( --clk_clk => DDR3_clk, -- clk.clk --reset_reset_n => DDR3_reset_reset_n, -- reset.reset_n memory_mem_a => DDR3_mem_a, -- memory.mem_a memory_mem_ba => DDR3_mem_ba, -- .mem_ba memory_mem_ck => DDR3_mem_ck, -- .mem_ck memory_mem_ck_n => DDR3_mem_ck_n, -- .mem_ck_n memory_mem_cke => DDR3_mem_cke, -- .mem_cke memory_mem_cs_n => DDR3_mem_cs_n, -- .mem_cs_n memory_mem_ras_n => DDR3_mem_ras_n, -- .mem_ras_n memory_mem_cas_n => DDR3_mem_cas_n, -- .mem_cas_n memory_mem_we_n => DDR3_mem_we_n, -- .mem_we_n memory_mem_reset_n => DDR3_mem_reset_n, -- .mem_reset_n memory_mem_dq => DDR3_mem_dq, -- .mem_dq memory_mem_dqs => DDR3_mem_dqs, -- .mem_dqs memory_mem_dqs_n => DDR3_mem_dqs_n, -- .mem_dqs_n memory_mem_odt => DDR3_mem_odt, -- .mem_odt memory_mem_dm => DDR3_mem_dm, -- .mem_dm memory_oct_rzqin => DDR3_oct_rzqin -- .oct_rzqin -- hps_0_f2h_sdram0_data_address => CONNECTED_TO_hps_0_f2h_sdram0_data_address, -- hps_0_f2h_sdram0_data.address -- hps_0_f2h_sdram0_data_burstcount => CONNECTED_TO_hps_0_f2h_sdram0_data_burstcount, -- .burstcount -- hps_0_f2h_sdram0_data_waitrequest => CONNECTED_TO_hps_0_f2h_sdram0_data_waitrequest, -- .waitrequest -- hps_0_f2h_sdram0_data_writedata => CONNECTED_TO_hps_0_f2h_sdram0_data_writedata, -- .writedata -- hps_0_f2h_sdram0_data_byteenable => CONNECTED_TO_hps_0_f2h_sdram0_data_byteenable, -- .byteenable -- hps_0_f2h_sdram0_data_write => CONNECTED_TO_hps_0_f2h_sdram0_data_write, -- .write -- reset_bridge_0_out_reset_reset => CONNECTED_TO_reset_bridge_0_out_reset_reset, -- reset_bridge_0_out_reset.reset -- clock_bridge_0_in_clk_clk => CONNECTED_TO_clock_bridge_0_in_clk_clk -- clock_bridge_0_in_clk.clk ); .....
|
|
|
|
|
Jun 2 2014, 07:44
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Вроде бы потихоньку решается вопрос, только приходится вручную писать файл *pin_locations.tcl и запускать его перед компиляцией проекта. "set_location_assignment PIN_G23 -to DDR3_mem_a[14]" вот самый простой пример описания нужного пина. После этого в пин планнере этот пин стал отображаться и такая строка появилась в .qsf файле.
|
|
|
|
|
Jun 2 2014, 08:36
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
У меня ноги прописаны по мануалу для моей борды(Helio CycloneVSoC), при чем изначально из пин планнера нельзя было назначить данные ноги, только после компиляции проекта в графе "Fitter location" им автоматически было присвоено назначение, при чем правильное, а вот графа "location" была пуста, пока я не создал и скомпилил необходимый файлик.
|
|
|
|
|
Jul 3 2014, 08:06
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Подскажите пожалуйста еще один момент, я сделал так как советовал warrior-2001, добавил свои компоненты в проект, в том числе и PLL (Quartus, Mega-wizard), теперь при запуске системы PLL просто не запускается, в чем могут быть причины конфликта?
Сообщение отредактировал Serb1987 - Jul 3 2014, 08:52
|
|
|
|
|
Jul 8 2014, 14:42
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Еще раз обращаюсь к общественности за помощью, теперь вопрос касательно моста FPGA-to-HPS а именно шины Avalon-MM. Я пытаюсь записывать и вычитывать из памяти посредством собственного Авалон мастера(вернее 2-х, на запись и на чтение), так вот меня интересует почему waitrequest может все время висеть в 1, и не давать возможности произвести какие либо манипуляции с шиной. Заранее спасибо за помощь.
|
|
|
|
|
Jul 9 2014, 07:13
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Я точно так же использую FPGA-to-HPS SDRAM Interfase, только 6 каналов (3 на запись, 3 на чтение), и не бёрстами, а поэлементно, только я не понял какое значение должно быть у burstcount если я пишу данные поэлементно шириной 32 бита?
|
|
|
|
|
Jul 9 2014, 16:31
|
Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 10-12-04
Из: spb
Пользователь №: 1 435

|
Я использую http://www.altera.com/support/examples/nio...-avalon-mm.html там есть возможность отключить burst, когда я отключил у меня не заработало, я не встал разбираться, а включил обратно.
|
|
|
|
|
Jul 11 2014, 09:46
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Все сделал именно так, все проверил и тем не менее авалон упорно молчит, а waitrequest = '1' все время. Подскажите пожалуйста где нужно снимать ресет с этого порта при помощи HPS?
Сообщение отредактировал Serb1987 - Jul 11 2014, 10:42
|
|
|
|
|
Jul 17 2014, 09:22
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 12-11-12
Пользователь №: 74 345

|
Блин, проблема на проблеме, теперь с Авалоном... Подскажите будьте добры, почему может не быть сигнала readdatavalid, вернее он все время в 0 и данные с шины не поступают? Waitrequest работает относительно моего read. Пытался изначально читать поэлементтно, потом пробовал бёрстами - не работает. Код library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all;
entity avalon_read is generic (hor_res : natural:= 360; ver_res : natural:= 288 ); port (clk : in std_logic; reset : in std_logic; fifo_write : out std_logic; fifo_full : in std_logic; -- read master avm_read_master_read : out std_logic; avm_read_master_address : out std_logic_vector (29 downto 0); avm_read_master_readdata : in std_logic_vector (31 downto 0); avm_read_master_waitrequest : in std_logic; avm_read_readdatavalid : in std_logic; data_out : out std_logic_vector (31 downto 0); burstcount : out std_logic_vector (7 downto 0) ); end avalon_read;
architecture Behavioral of avalon_read is
signal pix_cnt : natural := 0; signal str_cnt : natural := 0; signal quad_cnt : natural := 0; signal addr_0 : natural := 0; signal addr_1 : natural := 0; signal addr_2 : natural := 0; signal addr_3 : natural := 0;
signal avm_read : std_logic := '0'; signal wr_fifo : std_logic := '0';
-- state machine states type read_states_T is (idle, running, stopping);---- signal read_state : read_states_T;
-- extra read master signals signal read_address : natural; -- the current read address
begin
------------------------------------------------------------------------------- -- THE READ MASTER STATE MACHINE -------------------------------------------------------------------------------
read_FSM: process (clk, reset, read_state, avm_read_master_waitrequest) begin if reset = '0' then read_state <= idle; elsif rising_edge (clk) then---------------------- case read_state is when idle => if fifo_full = '0' and avm_read_readdatavalid = '0' then read_state <= running; avm_read_master_address <= std_logic_vector(to_unsigned(read_address, 30)); burstcount <= "00000010"; else read_state <= idle; end if; when running => if avm_read_master_waitrequest = '0' then read_state <= stopping;
else read_state <= running; end if; when stopping => -- if avm_read_readdatavalid = '1' then read_state <= idle; if quad_cnt = 3 then quad_cnt <= 0; if pix_cnt = hor_res-1 then pix_cnt <= 0; if str_cnt = ver_res-1 then str_cnt <= 0; else str_cnt <= str_cnt+1; end if; else pix_cnt <= pix_cnt +1; end if; else quad_cnt <= quad_cnt+1; end if; -- else -- read_state <= stopping; -- end if; end case; end if; end process;
process(clk, reset, fifo_full, read_state, quad_cnt, avm_read_master_waitrequest) begin if reset = '0' then fifo_write <= '0'; elsif falling_edge(clk) then if (quad_cnt = 3 and read_state = running and fifo_full = '0' and avm_read_master_waitrequest = '0') then ---- avm_read_readdatavalid = '1' fifo_write <= '1'; else fifo_write <= '0'; end if; end if; end process;
addr_0 <= (pix_cnt*2 + str_cnt*2*(hor_res*2))*4;--+ 500000000 addr_1 <= (pix_cnt*2+1 + str_cnt*2*(hor_res*2))*4; addr_2 <= (pix_cnt*2 + (str_cnt*2+1)*(hor_res*2))*4; addr_3 <= (pix_cnt*2+1 + (str_cnt*2+1)*(hor_res*2))*4;
read_address <= addr_0 when quad_cnt = 0 else addr_1 when quad_cnt = 1 else addr_2 when quad_cnt = 2 else addr_3 when quad_cnt = 3;
data_out(31 downto 24) <= avm_read_master_readdata(15 downto 8) when quad_cnt = 0;---UL data_out(23 downto 16) <= avm_read_master_readdata(15 downto 8) when quad_cnt = 1;---UR data_out(15 downto 8) <= avm_read_master_readdata(15 downto 8) when quad_cnt = 2;----LL data_out(7 downto 0) <= avm_read_master_readdata(15 downto 8) when quad_cnt = 3;-----LR avm_read_master_read <= '1' when read_state = running and fifo_full = '0' else '0';
end Behavioral;
Сообщение отредактировал Serb1987 - Jul 17 2014, 09:25
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|