Ich bin keine VHDL-Leuchte, deshalb die Frage. Ich will den 8b/10b-Codec
von Ken Boyette (opencores.org) in einem Spartan 3AN verwenden.
ISE 10.1. bemängelt jetzt aber jegliche VHDL-Unebenheiten und
Schludrigkeiten.
Unter anderem das hier:
-- PROCESS: SYNCRST; Synchronize and delay RESET one clock for startup
begin
SYNCRST: process (RESET, XLRESET, SBYTECLK)
begin
if SBYTECLK'event and SBYTECLK = '1' then
XLRESET <= RESET ;
elsif SBYTECLK'event and SBYTECLK = '0' then
LRESET <= XLRESET ;
end if ;
end process SYNCRST ;
Die Meldung lautet sinngemäß: "Signal LRESET kann nicht synthesiert
werden. Schlechter Stil zur Beschreibung synchroner Prozesse. Wird in
der jetzigen Softwareversion nicht mehr unterstützt"
Auweia.
Wie wäre es denn richtig und schön? Die gesamte VHDL-Datei wollte ich
aus urheberrechtlichen Gründen nicht anhängen.
In den meisten FPGA gibt es einfach keine Elemente, die auf beide
Flanken eines Signals sensitiv sein koennen. Die Erkennung von Flanken
an Signalen funktioniert in synthetisierbarem Code anders. Siehe
VHDL Flankenerkennung
Der o.g. Encoder lebt leider davon:
"Bits KI, HI, GI an FI are latched internally on the falling edge of the
SBYTECLK, Bits EI, DI, CI, BI, AI ... on the rising edge..."
Mist.
Was kann man da tun? Einen zweiten, dazu invertierten Takt definieren,
dessen steigende Flanke dann genutzt wird?
> SYNCRST: process (RESET, XLRESET, SBYTECLK)
Von der Synthetisierbarkeit abgesehen wäre der obige Prozess nur auf den
Takt sensitiv. Die beiden Reset-Signale sind in der Sensitivliste
unnötig.
> Was kann man da tun? Einen zweiten, dazu invertierten Takt definieren,> dessen steigende Flanke dann genutzt wird?
Im Idealfall hast du in deinem Design nur 1 Mastertakt und alle
beteiligten Komponenten (Flipflops) auf dem FPGA reagieren nur auf
dessen steigende Flanke.
> Der o.g. Encoder lebt leider davon:> "Bits KI, HI, GI an FI are latched internally on the falling edge of the> SBYTECLK, Bits EI, DI, CI, BI, AI ... on the rising edge..."
Welche Frequenz hat dein SBYTECLK?
Welche Frequenz hat dein FPGA-Mastertakt?
FPGA-Mastertakt: 33,333 MHz. SBYTECLK wäre die Hälfte davon.
> Die beiden Reset-Signale sind in der Sensitivliste unnötig.
Das dachte ich auch, hier meldet sich die ISE neuerdings auch mit
Warnungen, wenn man meint, das wäre überflüssig. Ich musste die
Sensitivitätslisten, die in der ISE 8.1. als einwandfrei erkannt wurden,
alle entsprechend nacharbeiten. :-(
> Das dachte ich auch, hier meldet sich die ISE neuerdings auch mit> Warnungen, wenn man meint, das wäre überflüssig.
Die wären nicht überflüssig, die sind überflüssig. :-o
> FPGA-Mastertakt: 33,333 MHz.
PCI?
> SBYTECLK wäre die Hälfte davon.
Ist dieser Takt synchron zu den 33 MHz?
Wenn ja:
1
process(clk33)begin
2
ifrising_edge(clk33)then
3
ifSBYTECLK='1'then
4
XLRESET<=RESET;
5
else
6
RESET<=XLRESET;
7
endif;
8
endif;
9
endprocess;
Wenn nein:
Vervielfache den 33MHz Takt mit einem DCM und mach eine Flankenerkennung
wie "üblich".
@ Lothar,
vielen Dank, das werde ich mal probieren. Der SBYTE... ist synchron zum
Master.
Das ich diesen Coder/Decoder verwenden will, liegt daran, dass der
Perl-Script für den Wrapper und die Implementierung des 8b/10b aus den
XAPP1112 und XAPP1122 nicht funktionieren will...
Aber der alte, inzwischen zurückgezogene aus XAPP3xx lief ja auch nicht.
Ich habe nach Lothars Rezept gehandelt, die ISE nimmt jetzt den
VHDL-File und macht auch einen Schaltkreis daraus. Jetzt muss ich nur
noch sehen, ob der Encoder auch noch in praxi das richtige macht.