Hallo zusammen,
ich arbeite gerade an NIOS ii. In Qsys habe ich ein Custom-Peripherie,
das die Bus-Control Signals zu Custom-Logik weiterleitet:
1
LIBRARYIEEE;
2
USEIEEE.STD_LOGIC_1164.ALL;
3
USEIEEE.NUMERIC_STD.ALL;
4
5
ENTITYavs_bus_interfaceIS
6
PORT
7
(
8
-- Avalon MM slave Signals
9
clk,rst_n:instd_logic:='0';
10
avs_write_n:instd_logic:='0';
11
avs_read_n:instd_logic:='0';
12
avs_address:instd_logic_vector(11downto0);
13
avs_writedata:instd_logic_vector(15downto0);
14
avs_readdata:outstd_logic_vector(15downto0);
15
16
-- Avalon MM Controlsignals End Conduits
17
write_n:outstd_logic;
18
read_n:outstd_logic:='0';
19
address:outstd_logic_vector(11downto0);
20
writedata:outstd_logic_vector(15downto0);
21
readdata:instd_logic_vector(15downto0)
22
23
);
24
ENDavs_bus_interface;
25
26
architectureBehavioralofavs_bus_interfaceis
27
28
begin
29
30
-- pass through...
31
write_n<=avs_write_n;
32
read_n<=avs_read_n;
33
address<=avs_address;
34
writedata<=avs_writedata;
35
avs_readdata<=readdata;
36
37
endBehavioral;
In Custom-Logik gibts dann IO-Registerfile, so mein Write-Registerfile:
1
LIBRARYIEEE;
2
USEIEEE.STD_LOGIC_1164.ALL;
3
USEIEEE.NUMERIC_STD.ALL;
4
5
ENTITYSysRegFile_writeIS
6
PORT
7
(
8
-- Inputs Avalon MM slave
9
clk,rst_n:instd_logic:='0';
10
avs_write_n:instd_logic:='0';
11
avs_address:instd_logic_vector(11downto0);
12
avs_writedata:instd_logic_vector(15downto0);
13
14
-- Ouput Register File IO
15
-- 3Level RZM- Modul
16
RZM_Ctrl:outstd_logic_vector(15downto0);
17
RZM_PwmPeak:outstd_logic_vector(15downto0);
18
RZM_tDead:outstd_logic_vector(15downto0);
19
RZM_Ud1Ref:outstd_logic_vector(15downto0);
20
RZM_Uq1Ref:outstd_logic_vector(15downto0);
21
RZM_theta1:outstd_logic_vector(15downto0)
22
);
23
ENDsysRegFile_write;
24
25
architectureBehavioralofsysRegFile_writeis
26
27
begin
28
29
write_regfile_pro:process(clk,rst_n)
30
begin
31
ifrst_n='0'then-- asyn reset
32
RZM_Ud1Ref<=(others=>'0');
33
RZM_Uq1Ref<=(others=>'0');
34
RZM_theta1<=(others=>'0');
35
elsifrising_edge(clk)andavs_write_n='0'then
36
caseavs_addressis
37
-- 3Level RZM- Modul
38
whenADD_RZM_Ctrl=>RZM_Ctrl<=avs_writedata;
39
whenx"000"=>RZM_PwmPeak<=avs_writedata;
40
whenx"001"=>RZM_tDead<=avs_writedata;
41
whenx"002"=>RZM_Ud1Ref<=avs_writedata;
42
whenx"003"=>RZM_Uq1Ref<=avs_writedata;
43
whenx"004"=>RZM_theta1<=avs_writedata;
44
45
whenothers=>NULL;
46
endcase;
47
endif;
48
endprocesswrite_regfile_pro;
49
50
51
endBehavioral;
Meine Frage ist, wie, mit welchem Befehl kann man in NIOS ii EDS, C-Code
richtig zugreifen? Mit IOWR_16DIRECT, oder IOWR?
Kann mir jemand bisschen über Avalon MM in diesem Kontext erklären?
vielen Dank im Vorraus!
lg Tomy
hey die datei wird im bsp projekt unter drivers erzeugt aber was du
suchst
IORD_8DIRECT(base, offset)
IORD_16DIRECT(base, offset)
IORD_32DIRECT(base, offset)
IOWR_8DIRECT(base, offset, data)
IOWR_16DIRECT(base, offset, data)
IOWR_32DIRECT(base, offset, data)
ist glaueb das hier. dort kannst du je nach bedarf schreiben/ lesen
danke Hans für deine Antwort!
genau ich hab dies auch benutzt, und funktioniert....
aber die Avalon Bus- Specification hab ich in diesem Kontext nicht
verstanden...
hast du guten tutos oder beispiel für Avalon Bus Addressing?
vielen Dank im vorraus!
und ps. schönes Wochenende!
lg tomy
ich weiss jetzt nicht was du genau mit dem addressing meinst. die
adressen zum schreieb lesen siehst du ja in der system.h oder in deinem
qsys design
hans
hans schrieb:> ich weiss jetzt nicht was du genau mit dem addressing meinst. die> adressen zum schreieb lesen siehst du ja in der system.h oder in deinem> qsys design
hallo,
ich hab hier ein SignalTap für Verstehen, was der Niosii macht, wenn ich
mit IOWR_16DIRECT() oder IOWR mache.
Im Custom -Write Registerfile:
1
write_regfile_pro:process(clk,rst_n)
2
begin
3
ifrst_n='0'then-- asyn reset
4
Test<=(others=>'0');
5
elsifrising_edge(clk)andavs_write_n='0'then
6
caseavs_addressis
7
whenx"003"=>Test<=avs_writedata;
8
whenothers=>NULL;
9
endcase;
10
endif;
11
endprocesswrite_regfile_pro;
Im NiosII EDS hab versucht, auf gleiche 12-Bit Addresse 0x003 mit 0xAAAA
zu beschreiben:
1
#define AVS_BUS_INTERFACE_0_BASE 0x40000 // in system.h
Im SignalTapII sieht man:
Fall 1:
Control-Signal: avs_write_n dauert 2- Clock Periode(gedacht aber NUR 1
Clk-Periode!). Hier sieht so aus, er versucht 32-Bit Data auf 2
hintereinander Addressen zu beschreiben: Address 0x006 mit Data 0xAAAA,
Address 0x007 mit 0x0000 (warum????)
Fall 2:
Control-Signal: avs_write_n dauert 1- Clock Periode wie erwartet, aber
wieso auf Address: 0x001 (?)
Fall 3:
avs_write_n dauert 1- Clock Periode wie erwartet, auf Address: 0x003
->>> wie erwartet!
Fall 4:
avs_write_n dauert 1- Clock Periode wie erwartet, auf Address: 0x003
->>> wie erwartet! Aber mit dem Trick :
Sigi schrieb:> zu Fall 1:> Hast du mal in deinem <BSP>/<Application>.objdump nachgeschaut,> wie der Zugriff in Assembler gemacht wird?Sigi schrieb:> .., ob der Zugriff 16bittig oder 32bittig ist?
nein... gucke mir mal an....