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?
Re: Pseudo-Signale
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
Re: Pseudo-Signale
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 '0');
elsif falling_edge(ale) then adr23_0(23 downto 16)