Pytanie dotyczące składni języka VHDL

Dyskusje ogólne na temat "cyfrówki" czyli wszystko o TTL/CMOS, językach VHDL i VERILOG, bramkach, rejestrach, przerzutnikach... Dobre miejsce na pytania odnośnie uniwersalnych programatorów (np. Willem) a także podłączania własnych peryferiów do komputera PC.
ODPOWIEDZ
nomysz
-
Posty: 1
Rejestracja: 04 lis 2008, 14:54
Lokalizacja: Wrocław

Pytanie dotyczące składni języka VHDL

Post autor: nomysz » 04 lis 2008, 15:07

Witam, dopiero zaczynam pisanie w języku VHDL. Używam XILINX ISE. Pytanie się tyczy słowa when. Mam kod:

Kod: Zaznacz cały

library ieee;
use ieee.std_logic_1164.all;

entity multiplexer is
    port (
        s         : in std_logic; 
        d0         : in std_logic;
        d1         : in std_logic; 
        y    : out std_logic 
    );
end multiplexer;

architecture Behavioral of multiplexer is
begin
process ( s , d0, d1)
begin   
    if ( s = '0' ) then
        y <= d0;
    else
	 	 y<=d1;
    end if;
	 --y <= d0 when s='0' else d1;
end process;
end Behavioral; 
W bloku process znajdują się z mojego punktu widzenia dwie równoważne metody zrobienia tego samego. Podczas kompilacji wersji z metodą nie-okomentowaną wszystko jest w porządku, jednak jeśli użyje metody okomentowanej to jest błąd:

Kod: Zaznacz cały

ERROR:HDLParsers:164 - "C:/Xilinx/10.1/ISE/ISEexamples/mux/muxx.vhd" Line 22. parse error, unexpected WHEN, expecting SEMICOLON
Natomiast jeśli usunę blok process, begin i end process:

Kod: Zaznacz cały

library ieee;
use ieee.std_logic_1164.all;

entity multiplexer is
    port (
        s         : in std_logic; 
        d0         : in std_logic;
        d1         : in std_logic; 
        y    : out std_logic 
    );
end multiplexer;

architecture Behavioral of multiplexer is
begin

    --if ( s = '0' ) then
    --    y <= d0;
    --else
	 --	 y<=d1;
    --end if;
	 y <= d0 when s='0' else d1;

end Behavioral; 
to wszystko kompiluje się bez problemu. Dlaczego to samo nie działa, jeśli jest wykonywane w bloku process?

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 04 lis 2008, 17:23

Dawno nie pisałem w VHDL, ale spróbuj usunąć słówko "begin" przy używaniu "when".

Awatar użytkownika
Melon
Użytkownik
Posty: 128
Rejestracja: 20 cze 2008, 15:53
Lokalizacja: Kraków / Jarosław
Kontakt:

Post autor: Melon » 04 lis 2008, 22:52

Sprawdź czy to Twoje when działa, ale jak zrealizujesz je w formie case'a?

rafszym
-
Posty: 2
Rejestracja: 06 lis 2008, 17:56
Lokalizacja: Wawa

Post autor: rafszym » 06 lis 2008, 18:09

...ponieważ zapisy typu if-then-else oraz case należą do grupy instrukcji sekwencyjnych i muszą być zapisane w procesie. Natomiast when-else oraz with-select należy używać bez procesu - są one współbieżne do siebie i pozostałych procesów, należy je stosować bezpośrednio w architecture.
pzdr.
rafszym.

ODPOWIEDZ