DE0-Nano Cистема на кристалле. Часть 3

Блог им. katatonia67
Создание системы на кристалле. Часть 3

Заключительная статья о создании прошивки для ПЛИС.

После того, как разработано ядро для работы с АЦП, можно приступить непосредственно к созданию SOPC.
Для этого необходимо добавить следующие компоненты:
SDRAM Controller, контроллер памяти:


Все временные параметры памяти можно посмотреть в даташите на микросхему.
Процессор NIOS:


JTAG UART, используется для отладки, а также для передачи данных с АЦП на хост-компьютер:

PLL для тактирования, в качестве входа используется расположенный на отладочной плате генератор 50Mhz. Выходной сигнал также выводится на внешний пин для тактирования микросхемы памяти.


DMA controller, из параметров можно указать максимальную длинну одной транзакции DMA в словах, а также формат слова:


И собственно сам контроллер АЦП, здесь в качестве параметров можно настроить количество доступных регистров, в нашем случае достаточно четырех таких регистров:

После того, как все компоненты добавлены, необходимо соединить их между собой:

Особое внимание при этом уделю DMA контроллеру, который имеет три интерфейса:
Control_port_slave – для чтения и записи регистров контроллера DMA из процессора
Read Master – Шина для чтения данных, подключается к интерфейсу dma компонента adc_stream_top_0.
Write Master –Шина для записи данных, подключается к контроллеру памяти

Шина PIO контроллера АЦП подключается к процессору к интерфейсу data_master, смысл этого в том, что регистры АЦП отображаются в общее адресное пространство процессора и обеспечивается возможность доступа к ним из программы.
Базовые адреса для компонентов и номера прерываний назначаются пунктами меню System:

После всего проделанного должно получиться что-то вроде такого:

Описание системы на кристалле для Quartus сформируется после нажатия кнопки Generate. В папке с проектом помимо всех прочих файлов будет сгенерирован файл de_sopc_inst.vhd, содержащий описание сгенерированного блока для его вставки в top-модуль проекта.
Таким образом, top-модуль проекта будет выглядеть после вставки sopc:
library ieee;
library work;

use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;

entity de_top is
	port
	(
		-- 1) global signals:
		clk_0 : in std_logic;
		reset_n : in std_logic;
		altpll_0_c0_out: out std_logic;
		locked_from_the_altpll_0: out std_logic;
		phasedone_from_the_altpll_0: out std_logic;
		-- the_sdram_0
		 zs_addr_from_the_sdram_0 : out std_logic_vector (12 downto 0);
		 zs_ba_from_the_sdram_0 : out std_logic_vector (1 downto 0);
		 zs_cas_n_from_the_sdram_0 : out std_logic;
		 zs_cke_from_the_sdram_0 : out std_logic;
		 zs_cs_n_from_the_sdram_0 : out std_logic;
		 zs_dq_to_and_from_the_sdram_0 : inout std_logic_vector (15 downto 0);
		 zs_dqm_from_the_sdram_0 : out std_logic_vector (1 downto 0);
		 zs_ras_n_from_the_sdram_0 : out std_logic;
		 zs_we_n_from_the_sdram_0 : out std_logic;
		cs_from_the_adc_stream_top_0: out std_logic;
		mosi_from_the_adc_stream_top_0: out std_logic;
		miso_to_the_adc_stream_top_0: in std_logic;
		scl_from_the_adc_stream_top_0: out std_logic
		
	);
end de_top;

architecture arc of de_top is
begin
sopc_i: entity work.de_sopc
port map
(
      altpll_0_c0_out => altpll_0_c0_out,				--SDRAM Clock из PLL
      locked_from_the_altpll_0 => locked_from_the_altpll_0,
      phasedone_from_the_altpll_0 => phasedone_from_the_altpll_0,
      zs_addr_from_the_sdram_0 => zs_addr_from_the_sdram_0,	--SDRAM Address
      zs_ba_from_the_sdram_0 => zs_ba_from_the_sdram_0,		--SDRAM Bank
      zs_cas_n_from_the_sdram_0 => zs_cas_n_from_the_sdram_0,	--SDRAM CAS
      zs_cke_from_the_sdram_0 => zs_cke_from_the_sdram_0,	
      zs_cs_n_from_the_sdram_0 => zs_cs_n_from_the_sdram_0,	--SDRAM CHIP SELECT
      zs_dq_to_and_from_the_sdram_0 => zs_dq_to_and_from_the_sdram_0,	--SDRAM DATA
      zs_dqm_from_the_sdram_0 => zs_dqm_from_the_sdram_0,	--SDRAM DQS
      zs_ras_n_from_the_sdram_0 => zs_ras_n_from_the_sdram_0,	--SDRAM RAS
      zs_we_n_from_the_sdram_0 => zs_we_n_from_the_sdram_0,	--SDRAM Write Enable
      clk_0 => clk_0,		--входной тактовый сигнал
       reset_n => reset_n,	--сброс

--SPI
       cs_from_the_adc_stream_top_0 => cs_from_the_adc_stream_top_0,
       mosi_from_the_adc_stream_top_0 => mosi_from_the_adc_stream_top_0,
       scl_from_the_adc_stream_top_0 => scl_from_the_adc_stream_top_0,
       miso_to_the_adc_stream_top_0 => miso_to_the_adc_stream_top_0	
);

end arc;

Большинство портов относится к SDRAM памяти, для которой помимо сигналов адреса, данных и т.д. выведен тактирующий сигнал от PLL. Все порты в заголовке выводятся на внешние контакты ПЛИС:



Разводку выводов по плате можно посмотреть в документации на DE0-nano. После компиляции имеем готовую прошивку. А также описание системы на кристалле в формате .sopcinfo. Это файл будет использоваться в дальнейшем при создании программно обеспечения в среде Nios II 10.1 Software Build Tools for Eclipse.

5 комментариев

avatar
Очень клево все расписано, даже добивать нечего. Жду следующей статейки :)
avatar
Спасибо! В следующий хочу написать про софт для NIOS и компьютера, чтобы можно было данные с АЦП принять.
avatar
NIOS бесплатный или платный? Кто нибудь устанавливал на NIOS Linux или QNX?
avatar
Думаю бесплатный, при условии что есть лицензия на квартус. Я ставил WebEdition и там есть ограничение такого плана, что процессор работает только если есть связь по jtag т.е. когда закрываешь квартус процессор перестаёт работать.
avatar
Quartus II Web Edition — бесплатный. А покупать лицензию дорого… лучше взять процесорное ядро отсюда: opencores.org/
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.