ПЛИС
ПЛИС\Удаленная прошивка ПЛИС\Подключение ALTREMOTE_UPDATE к NIOS
Подключение мегафункции ALTREMOTE_UPDATE к NIOS
Подключить сгенерированный в MegaWizard модуль ALTREMOTE_UPDATE к процессору NIOS можно через стандартную шину Avalon. При этом удобно организовать доступ к портам модуля ALTREMOTE_UPDATE через регистры ввода-вывода. Для этого написан модуль s2_remote_update (файл s2_remote_update.tdf), текст которого приведён ниже:
TITLE "REMOTE UPDATER FOR STRARIX II";
INCLUDE "s2_remote_updater.inc";
CONSTANT NUM_PARS = 8;
CONSTANT NUM_PARS_WDT = CEIL(LOG2(NUM_PARS));
CONSTANT D_WDT = 12;
CONSTANT GND_WDT = 32-D_WDT;
CONSTANT A_WDT = CEIL(LOG2(NUM_PARS+1));
SUBDESIGN s2_remote_update
(
---Avalon Interface---
clk : INPUT; --System Clock
reset : INPUT; --System Reset
avs_addr[A_WDT-1..0] : INPUT; --address
avs_cs : INPUT=VCC; --chipselect
avs_write : INPUT; --write avs_read : INPUT=VCC; --read
avs_wrdata[31..0] : INPUT; --writedata
avs_rddata[31..0] : OUTPUT; --readdata
)
VARIABLE
s2_ru : s2_remote_updater;
param_rd_ff : DFF;
param_wr_ff : DFF;
param_rg[NUM_PARS_WDT-1..0] : DFFE;
param_wr_rg[D_WDT-1..0] : DFFE;
rst_timer_ff : DFF;
reconfig_ff : DFFE;
rddata_rg[31..0] : DFF;
gnd_node[GND_WDT-1..0] : NODE;
BEGIN
s2_ru.clock = clk;
s2_ru.data_in[] = param_wr_rg[].q;
s2_ru.param[] = param_rg[].q;
s2_ru.read_param = param_rd_ff.q;
s2_ru.reconfig = reconfig_ff.q;
s2_ru.reset = reset;
s2_ru.reset_timer = rst_timer_ff.q;
s2_ru.write_param = param_wr_ff.q;
param_rd_ff.clk = clk;
param_rd_ff.d = avs_cs & avs_read & (avs_addr[] < NUM_PARS);
param_wr_ff.clk = clk;
param_wr_ff.d = avs_cs & avs_write & (avs_addr[] < NUM_PARS);
param_rg[].clk = clk;
param_rg[].d = avs_addr[NUM_PARS_WDT-1..0];
param_rg[].ena = avs_cs & (avs_addr[] < NUM_PARS);
param_wr_rg[].clk = clk;
param_wr_rg[].d = avs_wrdata[D_WDT-1..0];
param_wr_rg[].ena = avs_cs & avs_write;
rst_timer_ff.clk = clk;
rst_timer_ff.d = avs_cs & avs_write & (avs_addr[] == NUM_PARS) & avs_wrdata[0];
reconfig_ff.clk = clk;
reconfig_ff.d = avs_wrdata[1];
reconfig_ff.ena = avs_cs & avs_write & (avs_addr[] == NUM_PARS);
gnd_node[] = GND;
rddata_rg[].clk = clk;
if (avs_addr[] < NUM_PARS) then
rddata_rg[].d = (gnd_node[],s2_ru.data_out[]);
else
rddata_rg[].d = (s2_ru.busy,gnd_node[GND_WDT-2..0],s2_ru.data_out[]);
end if;
avs_rddata[] = rddata_rg[].q;
END;
INCLUDE "s2_remote_updater.inc";
CONSTANT NUM_PARS = 8;
CONSTANT NUM_PARS_WDT = CEIL(LOG2(NUM_PARS));
CONSTANT D_WDT = 12;
CONSTANT GND_WDT = 32-D_WDT;
CONSTANT A_WDT = CEIL(LOG2(NUM_PARS+1));
SUBDESIGN s2_remote_update
(
---Avalon Interface---
clk : INPUT; --System Clock
reset : INPUT; --System Reset
avs_addr[A_WDT-1..0] : INPUT; --address
avs_cs : INPUT=VCC; --chipselect
avs_write : INPUT; --write avs_read : INPUT=VCC; --read
avs_wrdata[31..0] : INPUT; --writedata
avs_rddata[31..0] : OUTPUT; --readdata
)
VARIABLE
s2_ru : s2_remote_updater;
param_rd_ff : DFF;
param_wr_ff : DFF;
param_rg[NUM_PARS_WDT-1..0] : DFFE;
param_wr_rg[D_WDT-1..0] : DFFE;
rst_timer_ff : DFF;
reconfig_ff : DFFE;
rddata_rg[31..0] : DFF;
gnd_node[GND_WDT-1..0] : NODE;
BEGIN
s2_ru.clock = clk;
s2_ru.data_in[] = param_wr_rg[].q;
s2_ru.param[] = param_rg[].q;
s2_ru.read_param = param_rd_ff.q;
s2_ru.reconfig = reconfig_ff.q;
s2_ru.reset = reset;
s2_ru.reset_timer = rst_timer_ff.q;
s2_ru.write_param = param_wr_ff.q;
param_rd_ff.clk = clk;
param_rd_ff.d = avs_cs & avs_read & (avs_addr[] < NUM_PARS);
param_wr_ff.clk = clk;
param_wr_ff.d = avs_cs & avs_write & (avs_addr[] < NUM_PARS);
param_rg[].clk = clk;
param_rg[].d = avs_addr[NUM_PARS_WDT-1..0];
param_rg[].ena = avs_cs & (avs_addr[] < NUM_PARS);
param_wr_rg[].clk = clk;
param_wr_rg[].d = avs_wrdata[D_WDT-1..0];
param_wr_rg[].ena = avs_cs & avs_write;
rst_timer_ff.clk = clk;
rst_timer_ff.d = avs_cs & avs_write & (avs_addr[] == NUM_PARS) & avs_wrdata[0];
reconfig_ff.clk = clk;
reconfig_ff.d = avs_wrdata[1];
reconfig_ff.ena = avs_cs & avs_write & (avs_addr[] == NUM_PARS);
gnd_node[] = GND;
rddata_rg[].clk = clk;
if (avs_addr[] < NUM_PARS) then
rddata_rg[].d = (gnd_node[],s2_ru.data_out[]);
else
rddata_rg[].d = (s2_ru.busy,gnd_node[GND_WDT-2..0],s2_ru.data_out[]);
end if;
avs_rddata[] = rddata_rg[].q;
END;
Описание регистров модуля s2_remote_update :
Адрес | Описание |
0 (запись/чтение) | Параметр 0 |
1 (запись/чтение) | Параметр 1 |
2 (запись/чтение) | Параметр 2 |
3 (запись/чтение) | Параметр 3 |
4 (запись/чтение) | Параметр 4 |
5 (запись/чтение) | Параметр 5 |
6 (запись/чтение) | Параметр 6 |
7 (запись/чтение) | Параметр 7 |
8 (чтение, биты 0...30) | Значение параметра |
8 (чтение, бит 31) | Статус занятости |
8 (запись, бит 0) | Сброс сторожевого таймера |
8 (запись, бит 1) | Старт реконфигурации |
При создании компонента в SOPC Builder или Qsys, необходимо учесть, что разрядность регистров управления - 32 бита, латентность чтения - 1 такт, задержка чтения - 0 тактов.
Комментарии