|
|
|
Anfang
zurück
weiter
Ende
|
Autor |
Beitrag |
Maik Meier
Gast
|
Erstellt: 29.03.06, 18:57 Betreff: Pseudo-Signale
drucken
Thema drucken weiterempfehlen
|
|
|
Hallo! Hab folgendes Problem: Wie kann man in VHDL ein über SIGNAL festgelegtes Pseudo-Signal real erzeugen? Also zur Erklärung: Ich programmiere gerade einen CPLD. In diesem generiere ich ein Chip-Select-Signal aus einer 16Bit-Adresse und benutze dieses CS-Signal um ein internes Steuerregister anzusprechen. Das CS-Signal wird nur intern benutzt. Und genau aus diesem Grund versucht der Compiler dieses Signal wegzuoptimieren, d.h. er führt alle 16 Adressleitungen in jede der 8 Makrozellen des Steuerregisters. Dadurch ist aber der Global-Routing Pool erschöpft. Wie kann ich ihm sagen, dass er das CS-Signal in EINER Makrozelle erzeugen soll und dieses dann für die anderen Makrozellen benutzen soll?
|
|
nach oben |
|
|
Ines
Gast
|
Erstellt: 30.03.06, 16:30 Betreff: Re: Pseudo-Signale
drucken
weiterempfehlen
|
|
|
Hallo Maik,
das hängt von Deinem Synthesetoll ab. Xilinx bietet z.B. ein Attribut "KEEP" an.
Aber vermutlich ist was mit Deiner VHDL-Beschreibung nicht in Ordnung - eigentlich sollte ein solches CS-Signal nicht wegoptimiert werden. Aber ohne Deine Sourcen zu kennen, kann man da nichts Genaueres zu sagen.
Gruß Ines
|
|
nach oben |
|
|
Gast
|
Erstellt: 04.04.06, 13:23 Betreff: Re: Pseudo-Signale
drucken
weiterempfehlen
|
|
|
Ich benutze Quartus II von Altera. Dass er das CS-Signal wegoptimiert, macht deshalb Sinn, dass die Dekodierung dann schneller ist, da eine Gatterstufe umgangen wird. Nützt dann aber auch nix, wenn er das Ganze nicht geroutet bekommt. Er versucht halt in jede einzelne Makrozelle(die das CS-Signal benötigen)über 24 Leitungen zu ziehen, also alle Adress- und Datenbits, obwohl nur die Datenbits und ein CS vonnöten wären. Das Ganze sieht so aus:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--BLITZ-ADRESS-DECODER ENTITY blitz_adress_decoder IS PORT( ale : IN STD_LOGIC; --Adress Latch Enable res : IN STD_LOGIC; --Reset wr : IN STD_LOGIC; --Write Enable rd : IN STD_LOGIC; --Read Enable ad7_0_inout : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0); --Adresse (Low) und Datenbus (Multiplex) a23_8_in : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --Adressbus (Middle und High)(Multiplex) in_port : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --Eingangsport cs_ram : OUT STD_LOGIC; --Ram adressieren cs_lcd : OUT STD_LOGIC; --LCD adressieren a16_out : OUT STD_LOGIC; --Adress-Bit 16 (für 128k RAM) a7_0_out : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --Adresse (Low) out_port : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --Ausgangsport
); END blitz_adress_decoder;
ARCHITECTURE verhalten OF blitz_adress_decoder IS
--komplettes 24-Bit-Adress-Signal zur Erzeugung der Chip-Selects SIGNAL adr23_0 : STD_LOGIC_VECTOR(23 DOWNTO 0); --interne Chip-Select-Signale SIGNAL cs_outport : STD_LOGIC; SIGNAL cs_inport : STD_LOGIC;
BEGIN --Adress-Latch process(ale,res,adr23_0,a23_8_in) begin if res = '0' then adr23_0 <= (others=> '0'); elsif falling_edge(ale) then adr23_0(23 downto 16) <= a23_8_in(7 downto 0); --High-Byte adr23_0(7 downto 0) <= ad7_0_inout(7 downto 0); --Low-Byte end if; adr23_0(15 downto 8) <= a23_8_in; --Middle-Byte --gelatchte Adresse an Ausgangspins a16_out <= adr23_0(16); a7_0_out <= adr23_0(7 downto 0); end process; --Adress-Dekodierung cs_lcd <='0' when (adr23_0 = X"00FFFF" and res = '1') else '1'; cs_outport <='0' when (adr23_0 = X"00FFFE" and res = '1') else '1'; cs_inport <='0' when (adr23_0 = X"00FFFD" and res = '1') else '1'; cs_ram <='0' when ((adr23_0 < X"00FFFC" or adr23_0 > X"00FFFF") and res = '1') else '1';
--Output_Port process(res,cs_outport,wr,ad7_0_inout) begin if res = '0' then out_port <= X"07"; elsif cs_outport = '0' and wr = '0' then out_port <= ad7_0_inout; end if; end process; --Input_Port process(cs_inport,rd,in_port) begin if cs_inport = '0' and rd = '0' then ad7_0_inout <= in_port; else ad7_0_inout <= (others=> 'Z'); end if;
end process;
END verhalten;
|
|
nach oben |
|
|
|
powered by carookee.com - eigenes profi-forum kostenlos
Design © trevorj
|