[VHDL] Error als 2 processen 1 signaal gebruiken

Pagina: 1
Acties:

  • dr snuggles
  • Registratie: September 2000
  • Niet online
Misschien een domme vraag, maar waarom kun je in twee verschillende processen niet hetzelfde signaal aansturen als je er zelf voor zorgt dat er geen overlap is :?

Dit geeft een ongefinieerde output b:
vhdl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
entity test is
    PORT (
        b: out std_logic;
        a: in std_logic
    );

end test;
architecture behaviour of test is
begin
    process (a)
    begin
       if a = '0' then
          b <= '0'; 
       end if;     
    end process;
    
    process (a)
    begin
       if a = '1' then
          b <= '1'; 
       end if;   
    end process;
end behaviour;

Het kan nooit voorkomen dat b zowel 0 als 1 is, toch wordt de output in Modelsim 'X'.
NB: Deze code is puur om de fout te laten zien. b <= a zou beide processen overbodig maken.

[ Voor 6% gewijzigd door dr snuggles op 24-08-2006 13:17 ]


  • Cassettebandje
  • Registratie: Juli 2002
  • Laatst online: 14-02 17:14

Cassettebandje

SA-C90 TDK

Hou je er rekening mee dat a ook z, h of l kan zijn? Er is dan niet gedefinieerd wat b dan doet. Is in Modelsim a wel expliciet 1 of 0?

  • dr snuggles
  • Registratie: September 2000
  • Niet online
Cassettebandje schreef op donderdag 24 augustus 2006 @ 13:36:
Hou je er rekening mee dat a ook z, h of l kan zijn? Er is dan niet gedefinieerd wat b dan doet. Is in Modelsim a wel expliciet 1 of 0?
a is volgens mij wel expliciet 1 of 0.

Maar door jou weet ik wel het goede antwoord. Dankje :). Dit werkt wel:
vhdl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    process (a)
    begin
       if a = '0' then
          b <= '0'; 
       else 
          b <= 'Z';
       end if;     
    end process;
    
    process (a)
    begin
       if a = '1' then
          b <= '1';
        else 
          b <= 'Z';
       end if;   
    end process;

Verwijderd

wwillem schreef op donderdag 24 augustus 2006 @ 12:12:
Misschien een domme vraag, maar waarom kun je in twee verschillende processen niet hetzelfde signaal aansturen als je er zelf voor zorgt dat er geen overlap is :?
Het maakt niet uit of de toekenning van een waarde aan een signaal conditioneel is; de waarde van een signaal blijft immers tussen verschillende aanroepen van je process staan. Om nog maar niet te beginnen over verschillende klokdomeinen...

Als je 2 processen hebt die een waarde produceren, en je wilt daartussen synchroniseren, moet je een concurrent multiplexer gebruiken. Zoiets als dit:
vhdl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
entity test is
    port (
        b: out std_logic;
        a: in std_logic);
end test;

architecture behaviour of test is
    signal b1, b2   : std_logic;
begin
    process (...)
    begin
        b1 <= '0'; 
    end process;
    
    process (...)
    begin
        b2 <= '1'; 
    end process;

    b <= b1 when (a = '0') else b2;
end behaviour;


wwillem schreef op donderdag 24 augustus 2006 @ 14:49:
[...]
Dit werkt wel:
vhdl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    process (a)
    begin
       if a = '0' then
          b <= '0'; 
       else 
          b <= 'Z';
       end if;     
    end process;
    
    process (a)
    begin
       if a = '1' then
          b <= '1';
        else 
          b <= 'Z';
       end if;   
    end process;
Ja, dat kan natuurlijk ook, maar bedenk wel dat niet ieder FPGA (neem aan dat je die target) tri-state buffers heeft voor interne signalen.

[ Voor 21% gewijzigd door Verwijderd op 24-08-2006 21:51 ]


  • dr snuggles
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op donderdag 24 augustus 2006 @ 21:47:
[...]

Het maakt niet uit of de toekenning van een waarde aan een signaal conditioneel is; de waarde van een signaal blijft immers tussen verschillende aanroepen van je process staan. Om nog maar niet te beginnen over verschillende klokdomeinen...

Als je 2 processen hebt die een waarde produceren, en je wilt daartussen synchroniseren, moet je een concurrent multiplexer gebruiken. Zoiets als dit:
[...]
Ja, dat kan natuurlijk ook, maar bedenk wel dat niet ieder FPGA (neem aan dat je die target) tri-state buffers heeft voor interne signalen.
Harstikke bedankt voor je antwoord. Het is nu duidelijk :). Op dit moment heb ik alles in één process gezet wat ook werkt. Als ik klok problemen krijg zal ik de concurrent multiplexor gaan gebruiken.

De benodigde tri-state buffer zit alleen in het IO gedeelte van mijn FPGA en zal hierbuiten dus extra logic nodig hebben om er tri-states van te maken. Ik zal dus bij voorkeur geen tri-states gaan gebruiken.