Forum: FPGA, VHDL & Co. Multi Source Fehler


von Dirk (Gast)


Lesenswert?

Hallo,

ich hab mir ein Adresszaehler mit 4 to 12 Demultiplexer mit VHDL
beschrieben. Der Adresszaehler zaehlt bis zum Overflow und gibt dann
einen Übertrag an den 4 to 12 Demultiplexer. Der 4 to 12 Demulitplexer
aktiviert die internen Blockrams über die Enableleitung.

Ich wollte gerne alle Data Outputs der einzelnen Blockrams miteinander
verbinden, weil nur jeweils ein Blockram zur Zeit aktiv ist. Ich
bekomme eine Errormeldung bei der Synthese. Muss ich wirklich noch ein
16 to 8 Demultiplexer fuer die Daten Pins an die Ouputs anklemmen oder
eine Tri State Buffer Stufe?
1
library ieee;
2
use ieee.std_logic_1164.ALL;
3
use ieee.numeric_std.ALL;
4
library UNISIM;
5
use UNISIM.Vcomponents.ALL;
6
 
7
entity top_layer is
8
   port ( CLK       : in    std_logic; 
9
          DATAIN    : in    std_logic_vector(7 downto 0);
10
   DATA_OUTA : out    std_logic_vector(7 downto 0);
11
          rst       : in    std_logic; 
12
          EN        : in    std_logic 
13
   );
14
end top_layer;
15
 
16
architecture BEHAVIORAL of top_layer is
17
signal adress_int : std_logic_vector (10 downto 0); 
18
signal ramenable_int : std_logic_vector (11 downto 0); 
19
signal data_out_int : std_logic_vector (7 downto 0);    
20
 
21
   component adressdecoder
22
      port ( CLK       : in    std_logic; 
23
             rst       : in    std_logic; 
24
             EN        : in    std_logic; 
25
             ADRESSE   : out   std_logic_vector (10 downto 0); 
26
             FULL      : out   std_logic; 
27
             RAMENABLE : out   std_logic_vector (11 downto 0));
28
   end component;
29
 
30
   component test
31
      port ( addra  : in    std_logic_vector (10 downto 0); 
32
             dina   : in    std_logic_vector (7 downto 0); 
33
             wea    : in    std_logic; 
34
             ena    : in    std_logic; 
35
             sinita : in    std_logic; 
36
             clka   : in    std_logic; 
37
             addrb  : in    std_logic_vector (10 downto 0); 
38
             enb    : in    std_logic; 
39
             sinitb : in    std_logic; 
40
             clkb   : in    std_logic; 
41
             douta  : out   std_logic_vector (7 downto 0); 
42
             doutb  : out   std_logic_vector (7 downto 0));
43
   end component;
44
 
45
begin
46
   INST_ADECODER : adressdecoder
47
      port map (CLK=>CLK,
48
                EN=>EN,
49
                rst=>rst,
50
                ADRESSE=>adress_int,
51
                FULL=>open,
52
                RAMENABLE=>ramenable_int);
53
 
54
   INST_RAM0 : test
55
      port map (addra=>adress_int,
56
                addrb=>adress_int,
57
                clka=>CLK,
58
                clkb=>CLK,
59
                dina=>DATAIN,
60
                ena=>ramenable_int(0),
61
                enb=>ramenable_int(0),
62
                sinita=>rst,
63
                sinitb=>rst,
64
                wea=>EN,
65
                douta=>DATA_OUTA, -- HIER BEKOMME ICH DEN FEHLER
66
                doutb=>open);
67
 
68
   INST_RAM1 : test
69
      port map (addra=>adress_int,
70
                addrb=>adress_int,
71
                clka=>CLK,
72
                clkb=>CLK,
73
                dina=>DATAIN,
74
                ena=>ramenable_int(1),
75
                enb=>ramenable_int(1),
76
                sinita=>rst,
77
                sinitb=>rst,
78
                wea=>EN,
79
                douta=>DATA_OUTA, -- HIER BEKOMME ICH DEN FEHLER
80
                doutb=>open);
81
 
82
 
83
 
84
end BEHAVIORAL;

Ich würde mich über ein Tipp freuen

Dirk

von T.M. (Gast)


Lesenswert?

Soweit ich mich erinnern kann, liegt an den Datenausgängen der BRAMs
immer ein Signal an, auch wenn die enable Leitung auf '0' liegt
(einfach mal in der AppNote nachschauen, zB.
http://www.xilinx.com/bvdocs/appnotes/xapp130.pdf). Du müsstest also
den gemeinsamen Schreibzugriff verhindern, ein MUX leistet hier denke
ich mal gute Dienste. Mit Tristates muss man nicht erst anfangen, da
diese sowieso in Logik umgewandelt werden, da auf dem FPGA nur an den
I/O Pins echte Tristatetreiber zur Verfügung stehen.

Is ja ganz fix gemacht:
1
mux : PROCESS (DATA_OUTA_RAM1, DATA_OUTA_RAM1, ramenable_int)
2
BEGIN
3
  CASE ramenable_int IS
4
    WHEN "01" => DATA_OUTA <= DATA_OUTA_RAM1;
5
    WHEN "10" => DATA_OUTA <= DATA_OUTA_RAM2;
6
    WHEN OTHERS => DATA_OUTA <= (OTHERS => '0');
7
  END CASE;
8
END PROCESS mux;


T.M.


=================
http://editthis.info/freefpga
=================

von Dirk (Gast)


Lesenswert?

Hallo,

natuerlich ist es ein bischen verwirrend wenn das Ram ein enablepin hat
und trotzdem Daten anliegen.

Danke,

Dirk

von T.M. (Gast)


Lesenswert?

ja, das enable hat in dem Fall nur die Funktion, dass keine aktuellen
Daten an den Ausgang gelegt werden, sondern die alten Daten bleiben und
natürlich kein Schreibzugriff möglich ist. Ist aber kein wirkliches chip
enable...


T.M.


=============================
http://editthis.info/freefpga
=============================

von Dirk (Gast)


Lesenswert?

Hi,

danke, ich werde dann noch ein xx to 8 Demultiplexer beschreiben.

Gruß,
Dirk

von Dirk (Gast)


Lesenswert?

Hi,

kann ich den Mux in der Top RTL beschreiben oder muss ich eine neue
Komponente bauen?

Gruß,

Dirk

von Jürgen Schuhmacher (Gast)


Lesenswert?

Das enable dürfte sich auf den Write-Zugriff beziehen. Dort kann man
sich dann den MUX für die Daten spareb. Am Ausgang braucht man ein
output-enable mit Tristatefunktion. Das kommt aber auf dasselbe raus,
wie ein MUX.

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.