VHDL-Forum

 
Sie sind nicht eingeloggt.
LoginLogin Kostenlos anmeldenKostenlos anmelden
BeiträgeBeiträge MembersMitglieder SucheSuche HilfeHilfe
VotesUmfragen FilesDateien CalendarKalender BookmarksBookmarks
Pseudo-Signale

Anfang   zurück   weiter   Ende
Autor Beitrag
Maik Meier
Gast
New PostErstellt: 29.03.06, 18:57  Betreff: Pseudo-Signale  drucken  Thema drucken  weiterempfehlen Antwort mit Zitat  

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
New PostErstellt: 30.03.06, 16:30  Betreff: Re: Pseudo-Signale  drucken  weiterempfehlen Antwort mit Zitat  

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
New PostErstellt: 04.04.06, 13:23  Betreff: Re: Pseudo-Signale  drucken  weiterempfehlen Antwort mit Zitat  

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
Sortierung ndern:  
Anfang   zurück   weiter   Ende
Seite 1 von 1
Gehe zu:   
Search

powered by carookee.com - eigenes profi-forum kostenlos

Design © trevorj