Forum: FPGA, VHDL & Co. Makrozellen für rein kombinatorische Logik


von Martin L. (Gast)


Lesenswert?

Hallo,

ich habe ein Design für einen CPLD XC9500 welches alle Makrozellen 
braucht. Nun will ich noch etwas rein kombinatorische Logik hinzubasteln 
und nun meint ISE, dass die Makrozellen nicht mehr reichen.
Dabei habe ich die Logik nicht mal als Prozess sondern in dieser Form 
geschrieben:
1
constant Backup_TX: boolean := (CS_INHIB = '0' and LNA_EN='1' and PA_EN='0');  --Backup TRX - TX
2
constant Backup_STBY: boolean := (CS_INHIB = '0' and LNA_EN='1' and PA_EN='1'); --Backup TRX - standby/RX without LNA
3
constant Backup_LNA: boolean :=(CS_INHIB = '0' and LNA_EN='0' and PA_EN='1');    --Backup TRX - RX with LNA
4
constant Main_RX: boolean := (CS_INHIB = '1' and EN_MAINTX_CPU='0');         --MainTX - standby/with LNA-select
5
constant Main_TX: boolean := (CS_INHIB = '1' and EN_MAINTX_CPU='1');          --MainTX - TX
6
7
constant EN_BTX_ENABLED: STD_LOGIC := '0';
8
constant EN_BTX_DISABLED: STD_LOGIC := '1';
9
constant EN_LNA1A_ENABLED:  STD_LOGIC := '0';
10
constant EN_LNA1A_DISABLED:  STD_LOGIC := '1';
11
constant EN_LNA1B_ENABLED:  STD_LOGIC := '0';
12
constant EN_LNA1B_DISABLED:  STD_LOGIC := '1';
13
constant EN_TXSWITCH_ENABLED: STD_LOGIC := '0';
14
constant EN_TXSWITCH_DISABLED: STD_LOGIC := '1';
15
16
17
EN_LNA1B <= EN_LNA1B_ENABLED when Backup_TX or Backup_LNA or Main_TX else
18
        EN_LNA1B_ENABLED when Main_RX and EN_LNA1_CPU='1' else
19
        EN_LNA1B_DISABLED;

Das sollte sich doch prinzipiell ohne Makrozelle rein in den PTerms 
synthetisieren lassen. Oder sind es zu viele "Eingänge", dass mehrere 
PTerms durch ein als Puffer misbrauchtes FlipFlop zusammengeschaltet 
werden müssen?

Danke Euch,
 Martin

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin Laabs schrieb:
> Das sollte sich doch prinzipiell ohne Makrozelle rein in den PTerms
> synthetisieren lassen.
Ja, wo sind denn die Produktterme?
Richtig: IN den Makrozellen...

> constant EN_TXSWITCH_ENABLED: STD_LOGIC := '0';
> constant EN_TXSWITCH_DISABLED: STD_LOGIC := '1';
Wozu sowas? VHDL ist eh schon eine geschwätzige Sprache, aber das 
schießt den Vogel ab... :-o

von Martin L. (Gast)


Lesenswert?

Hallo,

Lothar Miller schrieb:
> Martin Laabs schrieb:
>> Das sollte sich doch prinzipiell ohne Makrozelle rein in den PTerms
>> synthetisieren lassen.
> Ja, wo sind denn die Produktterme?
> Richtig: IN den Makrozellen...

OK. Das stimmt. Aber was mir eigentlich ausgegangen ist, sind die 
Flipflops in den Makrozellen. Und nun kann jede Makrozelle so 
programmiert werden, dass das Flipflop umgangen wird und somit von 
anderen Makrozellen über die Switch-Matrix "mitbenutzt" werden kann.
Somit wäre es, da ja noch genug PTerms frei sind, durchaus möglich, 
diese ohne Umweg über das Flipflop auf den Ausgang zu legen.

>> constant EN_TXSWITCH_ENABLED: STD_LOGIC := '0';
>> constant EN_TXSWITCH_DISABLED: STD_LOGIC := '1';
> Wozu sowas? VHDL ist eh schon eine geschwätzige Sprache, aber das
> schießt den Vogel ab... :-o

Naja - ich bin mir mit der Polarität nicht 100% sicher und will dann die 
nicht an 3 Stellen im Programm ändern. Ausserdem wird es besser lesbar 
weil '1' bei den meisten Signalen disabled bedeutet was nicht besonders 
intuitiv ist.

Viele Grüße,
 Martin L.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin Laabs schrieb:
> Ausserdem wird es besser lesbar
Sicher?
Meine Meinung:
1
EIN TEXT NUR AUS GROSSBUCHSTABEN IST GRUNDSÄTZLICH SCHLECHTER LESBAR.
2
3
Ein Text nur aus Grossbuchstaben ist grundsätzlich schlechter lesbar.
4
5
ein text nur aus grossbuchstaben ist grundsätzlich schlechter lesbar.

von Martin L. (Gast)


Lesenswert?

Hallo,

ich verwende für Konstanten sehr oft Bezeichner aus Großbuchstaben. Das 
habe ich so aus diversen C-Projekten übernommen wo #defines ebenfalls 
oft durchgehend groß geschrieben werden.
Aber das ist Geschmackssache.

Viele Grüße,
 Martin L.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin Laabs schrieb:
> Aber das ist Geschmackssache.
Richtig... ;-)

Aber was ist hier der Unterschied:
constant EN_LNA1A_ENABLED:  STD_LOGIC := '0';
constant EN_LNA1B_ENALBED:  STD_LOGIC := '0';

Martin Laabs schrieb:
> Naja - ich bin mir mit der Polarität nicht 100% sicher und will dann die
> nicht an 3 Stellen im Programm ändern.
Ich mache das etwas anders:
Meine internen Signale sind bei '1' aktiv. Und wenn das externe Signal 
Low-Aktiv ist, dann wird es beim Einlesen umgepolt.

von Martin L. (Gast)


Lesenswert?

Hallo Lothar,

Lothar Miller schrieb:

> Aber was ist hier der Unterschied:
> constant EN_LNA1A_ENABLED:  STD_LOGIC := '0';
> constant EN_LNA1B_ENALBED:  STD_LOGIC := '0';

Das eine ist für LNA1A und das andere für LNA1B. Oder war die Frage 
rhetorisch :-) ?

Viele Grüße,
 Martin L.

PS: Problem ist gelöst. Ich habe an einer anderen Stelle 8 FFs 
eingespart und jetzt komme ich hin. Wobei ich immer noch nicht verstehe 
warum der Code unbedingt die FFs braucht. Aber vermutlich durch 
irgendwelche Nebeneffekte die die FFs dann für andere PTerms unnutzbar 
machen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin Laabs schrieb:
> Das eine ist für LNA1A und das andere für LNA1B. Oder war die Frage
> rhetorisch :-) ?
Nein, es war eine Fangfrage:  _ENABLED --> _ENALBED  ;-)

von Duke Scarring (Gast)


Lesenswert?

Martin Laabs schrieb:
> constant EN_BTX_ENABLED: STD_LOGIC := '0';
> constant EN_BTX_DISABLED: STD_LOGIC := '1';
> constant EN_LNA1A_ENABLED:  STD_LOGIC := '0';
> constant EN_LNA1A_DISABLED:  STD_LOGIC := '1';
> constant EN_LNA1B_ENABLED:  STD_LOGIC := '0';
> constant EN_LNA1B_DISABLED:  STD_LOGIC := '1';
> constant EN_TXSWITCH_ENABLED: STD_LOGIC := '0';
> constant EN_TXSWITCH_DISABLED: STD_LOGIC := '1';

Jetzt, wo ich da gerade nochmal draufgucke: Warum alles doppelt 
gemoppelt?

1
constant ENABLED  : STD_LOGIC := '0';
2
constant DISABLED : STD_LOGIC := '1';
Das sollte für gute Lesbarkeit ausreichen.

Duke

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.