> Syntax Check ist erfolgreich...
Das bedeutet nur, dass du keine groben Tippfehler im Design hast.
Deine Beschreibung ist wirklich in keinem Lehrbuch zu finden:
1 | if rst = '1' then
|
2 | :
|
3 | end if;
|
4 | if clk = '1' and clk'event then
|
5 | :
|
6 | end if;
|
Aber man kann gar nicht alle Fehler selber machen. Und diese
Beschreibung eines synchronen Prozesses wäre mir nie in den Sinn
gekommen. Denn durch diese zwei unabhängigen if-Bedingungen wird die
Reset-Logik komplett invertiert. Hier steht quasi:
1 | if clk = '1' and clk'event then
|
2 | :
|
3 | elsif rst = '1' then
|
4 | :
|
5 | end if;
|
Und das es hier den Synthesizer raushagelt ist klar, denn der rechnet
niemals mit einer Beschreibung, in der ein Takt Vorrang vor einer
Reset-Bedingung hat. Mir will auch partout kein Bauteil einfallen, mit
dem sowas realisierbar wäre. Die Syntax ist ok und simulieren lässt sich
sowas schon.
Ich erhalte in beiden Fällen den selben Fehler (mit ISE 8.2):
> Analyzing Entity <counter> in library <work> (Architecture <impl1>).
> ERROR:Xst:827 - "D:/FPGA_Projects/irrercounter/irrcnt.vhd" line 15:
> Signal tmp cannot be synthesized, bad synchronous description.
Am ehesten könntest du noch schreiben:
1 | process(clk, clk)
|
2 | variable lock: bit;
|
3 | begin
|
4 | if clk = '1' and clk'event then ---< Takt
|
5 | if cnt = '0' then
|
6 | lock := '0';
|
7 | else
|
8 | if lock = '0' then
|
9 | lock := '1';
|
10 | end if;
|
11 | tmp <= tmp + 1;
|
12 | end if;
|
13 | end if;
|
14 | if rst = '1' then ---< Reset hat Priorität
|
15 | tmp <= "0000";
|
16 | end if;
|
17 | end process;
|
denn dann hat der Reset wieder Priorität gegen den Takt und das Ganze
ist synthetisierbar ;-)
BTW: statt
>> clk = '1' and clk'event
schreibt man schöner
>> rising_edge(clk)
denn damit werden auch andere Ausgangsbedingungen abgefragt.