Multi Source Fehler

Gast #389869
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
Gast #389870
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
=================
Gast #389875
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren