Jump to content
    

GOWIN IP Core для SDRAM

Здравствуйте. Есть знатоки по FPGA GOWIN?

У меня чип GW2AR-18  в корпусе EQ144. Если верить даташиту то у него есть на борту SDR SDRAM 32 bits 64M bits.

У кого нибудь получилось запустить и поработать с этим модулем?

 

В генераторе IP Core вроде даже есть возможность сгенерить код, но так какая то муть получается. Половина зашифрована (может так и должно быть). Как этим пользоваться вообще не ясно.

Допустим если закрыть глаза на шифрованый блок то мне предлагают в своем коде использовать такой вот блок:

 

	SDRAM your_instance_name(
		.O_sdram_clk(O_sdram_clk_o), //output O_sdram_clk
		.O_sdram_cke(O_sdram_cke_o), //output O_sdram_cke
		.O_sdram_cs_n(O_sdram_cs_n_o), //output O_sdram_cs_n
		.O_sdram_cas_n(O_sdram_cas_n_o), //output O_sdram_cas_n
		.O_sdram_ras_n(O_sdram_ras_n_o), //output O_sdram_ras_n
		.O_sdram_wen_n(O_sdram_wen_n_o), //output O_sdram_wen_n
		.O_sdram_dqm(O_sdram_dqm_o), //output [3:0] O_sdram_dqm
		.O_sdram_addr(O_sdram_addr_o), //output [10:0] O_sdram_addr
		.O_sdram_ba(O_sdram_ba_o), //output [1:0] O_sdram_ba
		.IO_sdram_dq(IO_sdram_dq_io), //inout [31:0] IO_sdram_dq
		.I_sdrc_rst_n(I_sdrc_rst_n_i), //input I_sdrc_rst_n
		.I_sdrc_clk(I_sdrc_clk_i), //input I_sdrc_clk
		.I_sdram_clk(I_sdram_clk_i), //input I_sdram_clk
		.I_sdrc_selfrefresh(I_sdrc_selfrefresh_i), //input I_sdrc_selfrefresh
		.I_sdrc_power_down(I_sdrc_power_down_i), //input I_sdrc_power_down
		.I_sdrc_wr_n(I_sdrc_wr_n_i), //input I_sdrc_wr_n
		.I_sdrc_rd_n(I_sdrc_rd_n_i), //input I_sdrc_rd_n
		.I_sdrc_addr(I_sdrc_addr_i), //input [20:0] I_sdrc_addr
		.I_sdrc_data_len(I_sdrc_data_len_i), //input [7:0] I_sdrc_data_len
		.I_sdrc_dqm(I_sdrc_dqm_i), //input [3:0] I_sdrc_dqm
		.I_sdrc_data(I_sdrc_data_i), //input [31:0] I_sdrc_data
		.O_sdrc_data(O_sdrc_data_o), //output [31:0] O_sdrc_data
		.O_sdrc_init_done(O_sdrc_init_done_o), //output O_sdrc_init_done
		.O_sdrc_busy_n(O_sdrc_busy_n_o), //output O_sdrc_busy_n
		.O_sdrc_rd_valid(O_sdrc_rd_valid_o), //output O_sdrc_rd_valid
		.O_sdrc_wrd_ack(O_sdrc_wrd_ack_o) //output O_sdrc_wrd_ack
	);

 

Может кто расскажет как это можно применить?

Спасибо.

Share this post


Link to post
Share on other sites

26 minutes ago, Worldmaster said:

Может кто расскажет как это можно применить?

первая ссылка из гугла по ключевым словам "gowin SDRAM controller example" не помогает?

Share this post


Link to post
Share on other sites

В 28.06.2023 в 21:28, des00 сказал:

первая ссылка из гугла по ключевым словам "gowin SDRAM controller example" не помогает?

че сразу гугл то?? Скачал я с оффсайта доки .. почитал. Но казалось что если кто то работал может знает какие нибудь особенности. Может подводные камни или еще чего..

 

Ну и все примеры на verilog а мне надо на VHDL.

Edited by Worldmaster

Share this post


Link to post
Share on other sites

Вот например создал по мануалу компонент VHDL. Добавил в код и получил вот такую ошибку.

Цитата

RROR  (PA2024) : The number(108) of ports exceeds the resource limit 104 regular I/Os and 1 RECONFIG_N I/Os of current device, you can also use 4 JTAG, 5 SSPI, 4 MSPI, 1 READY and 1 DONE I/Os by configuring Dual-Purpose Pin as regular I/O

Что я сделал не так?

 

Вот код после генератора который сказано вставить в свой дизайн:

component SDRAM
	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_selfrefresh: in std_logic;
		I_sdrc_power_down: in std_logic;
		I_sdrc_wr_n: in std_logic;
		I_sdrc_rd_n: in std_logic;
		I_sdrc_addr: in std_logic_vector(20 downto 0);
		I_sdrc_data_len: in std_logic_vector(7 downto 0);
		I_sdrc_dqm: in std_logic_vector(3 downto 0);
		I_sdrc_data: in std_logic_vector(31 downto 0);
		O_sdrc_data: out std_logic_vector(31 downto 0);
		O_sdrc_init_done: out std_logic;
		O_sdrc_busy_n: out std_logic;
		O_sdrc_rd_valid: out std_logic;
		O_sdrc_wrd_ack: out std_logic
	);
end component;

your_instance_name: 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,
		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_selfrefresh => I_sdrc_selfrefresh_i,
		I_sdrc_power_down => I_sdrc_power_down_i,
		I_sdrc_wr_n => I_sdrc_wr_n_i,
		I_sdrc_rd_n => I_sdrc_rd_n_i,
		I_sdrc_addr => I_sdrc_addr_i,
		I_sdrc_data_len => I_sdrc_data_len_i,
		I_sdrc_dqm => I_sdrc_dqm_i,
		I_sdrc_data => I_sdrc_data_i,
		O_sdrc_data => O_sdrc_data_o,
		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
	);

 

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

 

-- сигналы для SDRAM
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);
signal		I_sdrc_rst_n_i:   std_logic;
signal		I_sdrc_clk_i:   std_logic;
signal		I_sdram_clk_i:   std_logic;
signal		I_sdrc_selfrefresh_i:  std_logic;
signal		I_sdrc_power_down_i:  std_logic;
signal		I_sdrc_wr_n_i:   std_logic;
signal		I_sdrc_rd_n_i:   std_logic;
signal		I_sdrc_addr_i:  std_logic_vector(20 downto 0);
signal		I_sdrc_data_len_i:   std_logic_vector(7 downto 0);
signal		I_sdrc_dqm_i:   std_logic_vector(3 downto 0);
signal		I_sdrc_data_i:   std_logic_vector(31 downto 0);
signal		O_sdrc_data_o:   std_logic_vector(31 downto 0);
signal		O_sdrc_init_done_o:   std_logic;
signal		O_sdrc_busy_n_o:   std_logic;
signal		O_sdrc_rd_valid_o:   std_logic;
signal		O_sdrc_wrd_ack_o:   std_logic;

 

Что ему надо?

Share this post


Link to post
Share on other sites

9 hours ago, Worldmaster said:

че сразу гугл то?? Скачал я с оффсайта доки .. почитал. Но казалось что если кто то работал может знает какие нибудь особенности. Может подводные камни или еще чего..

потому что ваш вопрос был "Может кто расскажет как это можно применить? ", а первый документ в гугле это Gowin SDRAM IP Core User Guide, в котором указано как это применяется, в каких режимах и почему

9 hours ago, Worldmaster said:

Ну и все примеры на verilog а мне надо на VHDL.

учить оба языка, как минимум на уровне чтения.

9 hours ago, Worldmaster said:

Вот например создал по мануалу компонент VHDL. Добавил в код и получил вот такую ошибку.

Ну, все правильно, он же вам пишет красным по белому: не хватает ног

9 hours ago, Worldmaster said:

Что я сделал не так?

Сгенерировали корку для внешней (external) памяти, для которой не хватает ног. А надо было, как вы сами же пишете "то у него есть на борту SDR SDRAM 32 bits 64M bits", корку для встроенной (embedded). Как это сделать указано в том самом UserGuide. 

Share this post


Link to post
Share on other sites

В 29.06.2023 в 06:21, des00 сказал:

Ну, все правильно, он же вам пишет красным по белому: не хватает ног

Так а с какого перепуга ему не хватает если память встроенная??

 

В 29.06.2023 в 06:21, des00 сказал:

Сгенерировали корку для внешней (external) памяти, для которой не хватает ног. А надо было, как вы сами же пишете "то у него есть на борту SDR SDRAM 32 bits 64M bits", корку для встроенной (embedded). Как это сделать указано в том самом UserGuide. 

Так вот я и хочу узнать пробовал ли кто нибудь следовать этому мануалу и получить рабочий вариант именно с embedded памятью? Футболить на даташиты то каждый может. 

При формировании "корки", как вы сказали я уж догадался что надо использовать вариант с пометкой embedded. Более того даже додумался чтобы найти в списке моделей ту которая у меня установлена. И язык выставил VHDL.

И при добавлении файлов в проект он мне выдал эту ошибку. Так и более того он формирует код архитектуры top и перекрывает то что писал я. 

Такое ощущение что для работы встроенного модуля ему нужны внешние ноги.

Так что вопрос в силе: Есть люди у которых получилось запустить этот модуль без использования внешних ног или что я делаю не так?

 

 

unknown.png

unknown2.png

Share this post


Link to post
Share on other sites

В 29.06.2023 в 08:38, des00 сказал:

Как минимум авторы, которые добавили в user quide отсылку к проекту из коробки https://www.gowinsemi.com/en/support/ip_detail/5/ 

Да. Этот проект сам по себе работает и не требует такого количества портов. Проблема возникает при добавлении корки к своему проекту. Ну да и этот проект на verilog.

Share this post


Link to post
Share on other sites

Вот сделал чистый проект. Добавил Core для embedded SDRAM. 

В дополнение добавил два своих сигнала. Но при попытке привязать свои сигналы к выходам начались ошибки что данный выход уже занят. Ну как так может быть то??

Вот проект если вдруг у кого нибудь будет желание помочь по существу.

SimpleTest.7z

Share this post


Link to post
Share on other sites

1. У Вас сигналы btn, led и led2 очень "удачно" назначены на RECONFIGn, READY и DONE. Так что или переназначьте эти сигналы на другие выводы, или разрешите в настройках проекта использование соответствующих dual purpose pins в качестве regular IO.

2. Синтезатор на этапе оптимизации выбрасывает Ваш модуль MySDRAM, т.к. считает, что хотя он в проекте и описан, но не используется. Так что внимательно посмотрите на свою обертку поверх компонента SDRAM - скорее всего, там все не слава богу...

Share this post


Link to post
Share on other sites

В 29.06.2023 в 16:31, StewartLittle сказал:

У Вас сигналы btn, led и led2 очень "удачно" назначены на RECONFIGn, READY и DONE.

Так ведь модуль embedded же? У меня в реальной схеме же уже разведены некоторые сигналы на внешние линии.

 

В 29.06.2023 в 16:31, StewartLittle сказал:

разрешите в настройках проекта использование соответствующих dual purpose pins в качестве regular IO.

А где это? И что это значит?

В 29.06.2023 в 16:31, StewartLittle сказал:

dual purpose pins в качестве regular IO.

Нашел. Поставил галочки. Теперь скомпилилось. Спасибо. ))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...