Forum: FPGA, VHDL & Co. Asynchrone SRAM Controller mit Waitstate


von Keller T. (fabito)


Lesenswert?

Hallo zusammen,

Mein Ziel ist es: Memory Controller für 128KB x 8 Baustein mit tAA=45 ns
Nur diese sollte über PCI e bedient werden(also 125 MHz = 8 ns). 
Folglich SRAM zu langsam für PCI E Takt.

Aus diesen Grund möchte ich gern 6 Waitstate(6x8= 48 ns) innerhalb meine 
vorliegende Memory Controller einfügen. Nur bin ich neu mit dem Thema.

------------------------------------------------------------------------ 
---
ibrary ieee;
use ieee.std_logic_1164.all;
entity sram_ctrl is
   port(
      clk, reset: in std_logic;
      -- to/from main system
      mem: in std_logic;
      rw: in std_logic;
      addr: in std_logic_vector(16 downto 0);
      data_f2s: in std_logic_vector(7 downto 0);
      ready: out std_logic;
      data_s2f_r, data_s2f_ur: out std_logic_vector(7 downto 0);
      -- to/from chip
      ad: out std_logic_vector(16 downto 0);
      we_n, oe_n: out std_logic;
      -- SRAM chip a
      dio_a: inout std_logic_vector(7 downto 0);
      ce_a_n, ub_a_n, lb_a_n: out std_logic
  );
end sram_ctrl;

architecture arch of sram_ctrl is
   type state_type is (idle, rd1, rd2, wr1, wr2);
   signal state_reg, state_next: state_type;
   signal data_f2s_reg, data_f2s_next: std_logic_vector(7 downto 0);
   signal data_s2f_reg, data_s2f_next: std_logic_vector(7 downto 0);
   signal addr_reg, addr_next: std_logic_vector(16 downto 0);
   signal we_buf, oe_buf, tri_buf: std_logic;
   signal we_reg, oe_reg, tri_reg: std_logic;
begin
   -- state & data registers
   process(clk,reset)
   begin
      if (reset='1') then
         state_reg <= idle;
         addr_reg <= (others=>'0');
         data_f2s_reg <= (others=>'0');
         data_s2f_reg <= (others=>'0');
         tri_reg <= '1';
         we_reg <= '1';
         oe_reg <= '1';
      elsif (clk'event and clk='1') then
         state_reg <= state_next;
         addr_reg <= addr_next;
         data_f2s_reg <= data_f2s_next;
         data_s2f_reg <= data_s2f_next;
         tri_reg <= tri_buf;
         we_reg <= we_buf;
         oe_reg <= oe_buf;
      end if;
   end process;
   -- next-state logic
   process(state_reg,mem,rw,dio_a,addr,data_f2s,
           data_f2s_reg,data_s2f_reg,addr_reg)
   begin
      addr_next <= addr_reg;
      data_f2s_next <= data_f2s_reg;
      data_s2f_next <= data_s2f_reg;
      ready <= '0';
      case state_reg is
         when idle =>
            if mem='0' then
               state_next <= idle;
            else
               addr_next <= addr;
               if rw='0' then --write
                  state_next <= wr1;
                  data_f2s_next <= data_f2s;
               else -- read
                  state_next <= rd1;
               end if;
            end if;
            ready <= '1';
         when wr1 =>
            state_next <= wr2;
         when wr2 =>
            state_next <= idle;
         when rd1 =>
            state_next <= rd2;
         when rd2=>
            data_s2f_next <= dio_a;
            state_next <= idle;
      end case;
   end process;
   -- next-state logic
   process(state_next)
   begin
      tri_buf <= '1';  -- signals are active low
      we_buf <= '1';
      oe_buf <= '1';
      case state_next is
         when idle =>
         when wr1 =>
            tri_buf <= '0';
            we_buf <= '0';
         when wr2 =>
            tri_buf <= '0';
         when rd1 =>
            oe_buf <= '0';
         when rd2=>
            oe_buf <= '0';
      end case;
   end process;
   -- to main system
   data_s2f_r <= data_s2f_reg;
   data_s2f_ur <= dio_a;
   -- to sram
   we_n <= we_reg;
   oe_n <= oe_reg;
   ad <= addr_reg;
   --i/o for SRAM chip a
   ce_a_n <='0';
   ub_a_n <='0';
   lb_a_n <='0';
   dio_a <= data_f2s_reg when tri_reg='0' else (others=>'Z');
end arch;

Meine Frage lauten:

1)
sieht mein SRAM Controller(FSM) funktionsfähig aus da ich nicht zum 
Laufen bringen konnte?

2)
Wie soll ich dann 6 Waitstate für PCI Express einfügen?

Wie kann ich da 6 Waitstate

von Falk B. (falk)


Lesenswert?

@  Ngii Rayan (fabito)

>Mein Ziel ist es: Memory Controller für 128KB x 8 Baustein mit tAA=45 ns
>Nur diese sollte über PCI e bedient werden(also 125 MHz = 8 ns).
>Folglich SRAM zu langsam für PCI E Takt.

Wie kommt man auf die Idee, in einen Porsche (PCIe) eine Dampfmaschine 
(SRAM 128Kx8) einzubauen?

>Aus diesen Grund möchte ich gern 6 Waitstate(6x8= 48 ns) innerhalb meine
>vorliegende Memory Controller einfügen. Nur bin ich neu mit dem Thema.

Merkt man. PCIe ist was großkalibriges, nix für Anfänger. Fang mit 
DEUTLICH einfacherern Sachen an, z.B. ein einfacher PWM-Generator.

von Duke Scarring (Gast)


Lesenswert?

Falk Brunner schrieb:
> Wie kommt man auf die Idee, in einen Porsche (PCIe) eine Dampfmaschine
> (SRAM 128Kx8) einzubauen?
Die Idee ist nicht neu:
http://de.wikipedia.org/wiki/Porsche_Traktor

scnr,
Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Duke Scarring schrieb:
> Porsche_Traktor
Der Ferdinand war schon ein schlauer Fuchs. Hat einfach das selbe 
Fahrwerk weiterverwendet...  ;-)

von Keller T. (fabito)


Lesenswert?

Mit PCI Express habe ich schon einiges bisher gemacht:
 Beispielsweise
   MSI Interrupt Verwaltung
   GPIO Ansteuerung

Nur ist das Thema Memory Controller für mich unbekannt.
Aus diesem Grund bitte ich um Ihr Support.
ist es möglich überhaupt oder hat jemand Erfahrung damit?

von Stachele (Gast)


Lesenswert?

Wieso nimmst du nicht einen DDR1/2/3-Speicher? Dafür gibt es fertige 
IP-Cores...

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.