Wie bekomme ich es am leichtesten hin, im FPGA ein kleines Register zu erstellen, in dem ich Daten zum lesen/schreiben ablegen kann, die ich von Außen einlese? Ich wollte das mit einer Adresse machen. Z.B.: Ich übertrage vom µC zum FPGA ein Adressbyte und nachfolgend ein Datenbyte, über die zusätzliche R/W Steuerleitung weiß der FPGA, ob es einen Lese,- oder Schreibbefehl handelt. Wenn nach einem Adressbyte ein Datenbyte folgt möchte ich das ganze im FPGA abspeichern, um dann später diese Daten für weitere Vorgänge im FPGA verwenden, in dem ich auslese, was auf der Adresse für ein Datenbyte gespeichert ist. Bis jetzt habe ich ca. 16-20 Bytes, die ich auf diese Art abspeichern möchte (viel mehr sollten es auch nicht werden). Kann mir da jemand was empfehlen, wie man sowas organisiert ohne IP Core für irgendwelche Speicherarten verwenden zu müssen? Adr data 0x00 0x55 ... ... 0x07 0x0A
if (wr_n= '0') then case address is when x"00" => Reg_0x00 <= write_data; when x"01" => Reg_0x01 <= write_data; when x"02" => Reg_0x02 <= write_data; end case; end if; so oder so ähnlich (mit lesen entsprechend umgekehrt) Dabei sind address und Reg_0x0x einfach std_logic_vector(7 downto 0) Kest
Oh man :D An sowas dachte ich auch die ganze Zeit, aber das Mittagessen hat wohl die Hirnmasse verdrängt. Danke!
schöner wäre es wenn das Register in einem Array stehen würde, dann müsstest du nicht für jeden Fall einen case definieren..
Habe bis jetzt mit Array' (in VHDL) nichts zu tun gehabt. Gibt es online was, was gut beschrieben ist?
Ich wüsste jetzt leider auch nichts, aber ev. kann dir mein Code, denn ich mal für ein Registerfile entwickelt habe, weiterhelfen:
1 | entity reg_file is |
2 | |
3 | generic ( |
4 | registers_g : integer := registers_c); |
5 | |
6 | port ( |
7 | clk_i : in std_ulogic; |
8 | res_i : in std_ulogic; |
9 | |
10 | reg_idx_i : in reg_idx_t; |
11 | clk_en_reg_file_i : in std_ulogic; |
12 | |
13 | reg_i : in data_vec_t; |
14 | reg_o : out data_vec_t); |
15 | |
16 | end reg_file; |
17 | |
18 | architecture rtl of reg_file is |
19 | type aRegisterFile is array (registers_g - 1 downto 0) of data_vec_t; |
20 | signal RegisterFile : aRegisterFile; |
21 | begin -- rtl |
22 | |
23 | RegisterFileRead : process(RegisterFile, reg_idx_i) is |
24 | begin
|
25 | if (reg_idx_i = -1) then |
26 | reg_o <= (others => 'X'); |
27 | else
|
28 | reg_o <= RegisterFile(reg_idx_i); |
29 | end if; |
30 | end process RegisterFileRead; |
31 | |
32 | RegisterFileWrite : process (clk_i, res_i) is |
33 | begin
|
34 | --Reset
|
35 | if (res_i = '0') then |
36 | for i in 0 to registers_g - 1 loop |
37 | RegisterFile(i) <= (others => '0'); |
38 | end loop; |
39 | --Clock
|
40 | elsif (clk_i'event AND clk_i = '1') then |
41 | if (clk_en_reg_file_i = cActivated) then |
42 | if (reg_idx_i = -1 or reg_a_idx_i >= registers_g) then |
43 | report "Index - Decode Fehler" severity faiulure; |
44 | else
|
45 | RegisterFile(reg_idx_i) <= reg_i; |
46 | end if; |
47 | end if; |
48 | end if; |
49 | end process RegisterFileWrite; |
50 | |
51 | end rtl; |
Ok, habe alles brav hinbekommen :) war doch leichter als ich dachte und mal wieder was dazugelernt.
Ein Array ist nicht unbedingt von Vorteil. Denn es gibt Fälle wo nur Read-Only oder Write-Only Register verwendet werden sollen. Da muss man es dann doch mit case alles schreiben Kest
für Readonly wären wohl ROM Elemente (die man aus Blockrams generieren kann) am besten, fall im FPGA welche vorhanden sind. Aber wann braucht man WriteOnly Register?
In Xilinx gibt es fertigen Cores für RAMs, ROMs etc. Darauf wollte ich verzichten. Ein array reicht mir völlig aus, da ich es zum Ablegen von Steuer,- und Statusbytes brauche.
>Aber wann braucht man WriteOnly Register?
ich würde mal vermuten das man das braucht wenn man ressourcen sparen
möchte (man braucht dann nur noch einen mux statt zwei), und wenn der
registerinhalt woanders vorgehalten wird (z.b. in einem uC).
readonly muß ja nicht nur rom sein, können ja auch statusregister sein
:-)
Ahh danke ist klar, ich hatte bei der Frage wohl nen Knoten im Kopf ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.