«« ( Date ) »» // «« ( Thread ) »» // vlsi-nastava - 2009

Re: greska u quartus-u

by Vladimir Kovacevic
nedelja, 01. februar 2009 - 21:58.

Uvek kad pises VHDL razmisljaj kako ce izgledati hardver koji se
generise na osnovu njega!
Konkretno, ti ovde imas dva source-a koji drajvuju O_tmp, kao sto ti
je sintetizer rekao:

if (std_match(ld, '1')) then
O_tmp(n-1 downto n-2) <= I1;
O_tmp(n-3 downto 0) <= I0;
end if;
if (std_match(inc, '1')) then
O_tmp <= O_tmp + '1';
end if;

mozda je u scenariju koji si ti zamislio situacija da i 'ld' i 'inc'
budu aktivni nemoguca, ali
kada se to spusti u hardver desava se da registar dobije dve linije
koje idu na njegov ulaz, tj. greska
Ukoliko ne uspes da korigujes kod ili imas neku nedoumicu javi.

takodje, if bez else ne bi trebalo da stoji! Zamisli if/else strukturu
kao multiplekser, sto i jeste.
Uslov je signal selekcije, ono pod if ide recimo na ulaz 0, a ono kod
else ulaz 1.
Sta ce se desiti ako signal selekcije bude 1, a else grana ne postoji
u kodu, je pitanje na koje ne vredi traziti odgovor.

2. stvar: O_tmp <= O_tmp + '1'; losa praksa

O_tmp si pretpostavljam zamislio da bude registar? Za definiciju
registra uvek koristi dve promenljive.
Jednu, koja ce se osvezavati na ivicu takta: O_tmp_seq = O_tmp;
i drugu, kojoj ces u kombinacionom procesu dodeljivati vrednosti:
O_tmp = O_tmp_seq +1.

jos jedno ponavljam prvu recenicu, zlatno pravilo:
Uvek kad pises VHDL razmisljaj kako ce izgledati hardver koji se
generise na osnovu njega!

Srdacan pozdrav

Vladimir Kovacevic





On Sun, Feb 1, 2009 at 8:43 PM, Nemanja Ilic <nemanja.ilic.81@gmail.com> wrote:
>
> Zdravo svima,
>
> Da li je neko mozda imao istu gresku ili mozda zna resenje ovog problema...
> Gledao sam u Quartus-ovom helpu i na internetu ali nisam nasao resenje.
>
> Error: The node "operational_unit:unit_op|MAR:unit_MAR|O_tmp" has multiple
> drivers due to the constant driver
>
> Evo ga i kod MAR-a:
>
> library ieee ;
> use ieee.std_logic_1164.all;
> use ieee.std_logic_unsigned.all;
> use ieee.numeric_std.std_match;
>
> entity MAR is
> generic (n: natural := 18);
> port
> (
> I1 : in std_logic_vector (1 downto 0); -- PAGE bits
> I0 : in std_logic_vector (n-3 downto 0); -- IBUS bits
> clk : in std_logic;
> ld : in std_logic;
> inc : in std_logic;
> en : in std_logic; -- enable
> tristate driver
> O : out std_logic_vector (n-1 downto 0) -- out to ABUS
> );
> end MAR_new2;
>
> architecture behaviour of MAR is
> signal O_tmp : std_logic_vector (n-1 downto 0);
> begin
> process (clk)
> begin
> -- wait on clk's rising edge
> if (clk'event and std_match(clk, '1')) then
> if (std_match(ld, '1')) then
> O_tmp(n-1 downto n-2) <= I1;
> O_tmp(n-3 downto 0) <= I0;
> end if;
> if (std_match(inc, '1')) then
> O_tmp <= O_tmp + '1';
> end if; end if;
> -- tristate driver
> if (std_match(en, '1')) then
> O <= O_tmp;
> else
> O <= (O'range => 'Z');
> end if;
> end process;
> end behaviour;
>
> Hvla unapred,
> Nemanja
>
>
>
> -----------------------------------------------------------------
> unsubscribe:
> minimalist@rti.etf.bg.ac.yu?subject=unsubscribe%20vlsi-nastava
> -----------------------------------------------------------------
>