Hallo,
ich bin neu im Forum, natürlich habe ich die Suchfunktion bedient, aber
keine passende Hilfe bekommen. Sollte ich einen passenden Beitrag
übersehen oder nicht gefunden haben, bitte ich das zu entschuldigen.
Zu meinem Problem:
Ich möchte einen bestehenden NIOS2 Prozessor um eine eigene Komponente
erweitern. Bei der Komponente soll es sich um einen simplen Counter mit
preload handeln. Sprich, es soll einen 8 Bit breiten eingang geben, dem
ein Wert übergeben werden kann, von dem aus dann der Zähler bis 255
hochzählt. Für den Fall das nichts übergeben wird, soll einfach bei 0
angefangen werden. Weiter soll der Zähler erst anfangen zu zählen, wenn
er ein Start-Bit gesetzt wird. Natürlich soll es auch einen Reset und
CLK Eingang geben.
Ich habe ein Bauteil erstellt:
1 | library IEEE;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.std_logic_unsigned.all;
|
4 |
|
5 | entity CounterWPreload is
|
6 | port (
|
7 | -- <interface type>_<interface name>_<signal type>
|
8 | avs_avalonslave_writedata: IN std_logic_vector (7 downto 0);
|
9 | avs_avalonslave2_writedata: IN std_logic;
|
10 | avs_avalonslave_write: IN std_logic;
|
11 | csi_clockreset_clk: IN std_logic;
|
12 | csi_clockreset_reset: IN std_logic;
|
13 | coe_counterOutput_export: OUT std_logic_vector (7 downto 0)
|
14 | );
|
15 | end CounterWPreload;
|
16 |
|
17 | architecture CounterWPreload_arch of CounterWPreload is
|
18 | signal counter: std_logic_vector (7 downto 0); -- enthaellt zaehlerstand
|
19 | signal stop: std_logic := '0'; -- signalisiert, dass der zahler voll ist
|
20 |
|
21 | begin
|
22 | standart: process (csi_clockreset_clk, csi_clockreset_reset)
|
23 | begin
|
24 | if (csi_clockreset_reset = '1') then --wurde der Reset gesetzt
|
25 | counter <= avs_avalonslave_writedata; --setze den counter zurueck auf den Wert des Preload
|
26 | stop <= '0'; --setze das Stopbit auf 0
|
27 | elsif(csi_clockreset_clk'event and csi_clockreset_clk = '1' and stop = '0' and avs_avalonslave2_writedata = '1') then -- wenn der Takt eintrifft und der Baustein aktiv ist und der Zaehler nicht durchgelaufen ist
|
28 | if(avs_avalonslave_write = '1') then
|
29 | counter <= avs_avalonslave_writedata;
|
30 | elsif (avs_avalonslave_write = '0') then
|
31 | coe_counterOutput_export <= counter; -- dann gebe den momentanen counterstand aus
|
32 | counter <= counter + 1; -- und erhoehe den counterstand
|
33 | if(counter = "11111111") then -- ist der zaehler vollgelaufen
|
34 | stop <= '1'; -- dann aktiviere das stopbit
|
35 | end if;
|
36 | end if;
|
37 | end if;
|
38 | end process;
|
39 |
|
40 | end CounterWPreload_arch;
|
Mein Problem ist nun, wenn ich das Bauteil über den SoPC Builder in den
NIOS2 einbinde, dann weiß ich nicht wie es an den Avalon Master
angebunden wird, sprich: Wie schaffe ich es, dass ein Bit verwendet
werden kann um den Zähler loslaufen zu lassen? Und wie kann ich in C
dann dieses Bit setzen und Daten an den Zähler schicken um ihn zu laden?
Ich habe diese Funktion in Forenbeiträgen gefunden:
IOWR_8DIRECT(COUNTER_W_PRELOAD_8BIT_0_BASE, 0, 0xAA);
aber die führt bei mir nur zu Fehlern.
Kann mir jemand helfen? Vielen Dank!