Hi Community,
ich habe mal eine detailiertere Frage zum Auflösungsmechanismus von
std_logic:
Wenn ich innerhalb einer Architecture einem out-Signal mehrere Werte
zuweise, meckert Quartus II über "multiple constant drivers". Beispiel:
1 | entity Top is
|
2 | port(
|
3 | Rst, Clk: in std_logic;
|
4 | A, B: in std_logic;
|
5 | Q: out std_logic);
|
6 | end entity;
|
7 | architecture Arch of Top is
|
8 | begin
|
9 | process (Rst, Clk)
|
10 | begin
|
11 | if Rst = '1' then
|
12 | Q <= '0';
|
13 | elsif Clk'event and Clk = '1' then
|
14 | Q <= A or B;
|
15 | end if;
|
16 | end process;
|
17 | process (Rst, Clk)
|
18 | begin
|
19 | if Rst = '1' then
|
20 | Q <= '0';
|
21 | elsif Clk'event and Clk = '1' then
|
22 | Q <= A and B;
|
23 | end if;
|
24 | end process;
|
25 | end architecture;
|
Eigentlich würde ich erwarten, dass Q mithilfe des Auflösungsmechanismus
von std_logic den Konflikt löst. Tuts aber nicht.
Wenn ich hingegen ein std_logic von mehreren Komponenten treiben lasse,
klappts auf einmal. Beispiel:
1 | Top_Map1: Top
|
2 | port map(
|
3 | Rst => Rst,
|
4 | Clk => Clk,
|
5 | A => A,
|
6 | B => B,
|
7 | Q => Q);
|
8 |
|
9 | Top_Map2: Top
|
10 | port map(
|
11 | Rst => Rst,
|
12 | Clk => Clk,
|
13 | A => C,
|
14 | B => B,
|
15 | Q => Q);
|
Wenn ich diesen Code simuliere (mit ModelSim-Altera) tuts einwandfrei,
Konflikte werden zu 'X' aufgelöst.
Jetzt habe ich das erste Beispiel (mehrere Treiber innerhalb einer
Architecture) nochmal probiert, indem ich auch 'Z'-Zustände hinzugefügt
habe. Dann gings!
Okay, so viel zu meinen Erfahrungen. Meine Frage: ist das von VHDL so
vorgesehen? Die Literatur, die ich mir bisher zu gemüte geführt habe,
sagt, dass std_logic bei Konflikten immer aufgelöst wird (im
Zweifelsfall zu 'X'). Hier wirds aber nur i zwei von drei Fällen
aufgelöst. Ist das jetzt nur in Quartus II so, oder ist das von VHDL so
vorgesehen?