Forum: FPGA, VHDL & Co. eigene Daten/Steuerregister erstellen


von noname (Gast)


Lesenswert?

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

von Kest (Gast)


Lesenswert?

  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

von noname (Gast)


Lesenswert?

Oh man :D
An sowas dachte ich auch die ganze Zeit, aber das Mittagessen hat wohl 
die Hirnmasse verdrängt.

Danke!

von Cheru (Gast)


Lesenswert?

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..

von noname (Gast)


Lesenswert?

Habe bis jetzt mit Array' (in VHDL) nichts zu tun gehabt. Gibt es online 
was, was gut beschrieben ist?

von Cheru (Gast)


Lesenswert?

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;

von noname (Gast)


Lesenswert?

Ok, habe alles brav hinbekommen :) war doch leichter als ich dachte und 
mal wieder was dazugelernt.

von Kest (Gast)


Lesenswert?

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

von Cheru (Gast)


Lesenswert?

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?

von noname (Gast)


Lesenswert?

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.

von TheMason (Gast)


Lesenswert?

>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 
:-)

von Cheru (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.