Salve a tutti,
sto cercando di simlare un contatore a 3 bit con ghdl ( vedi VHDL per linux).
Il problema è che quando cerco di incrementare l'output ( output <= output + "001" ), mi dice che non riconosce il segno +;
ho provato a caricare le librerie per i calcoli aritmetici ma nada (non trova std_logic_arith).
Qualcuno ha qualche idea?
Grazie mille
GHDL e librerie
11 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
GHDL non è solo per Linux ma è multi piattaforma e anche open source.
Come hai definito output ?
Non specifichi quando ti capita o con quale esatto comando.
elettronico-bis ha scritto:Il problema è che quando cerco di incrementare l'output ( output <= output + "001" ), mi dice che non riconosce il segno +;
Come hai definito output ?
elettronico-bis ha scritto:ho provato a caricare le librerie per i calcoli aritmetici ma nada (non trova std_logic_arith).
Non specifichi quando ti capita o con quale esatto comando.
0
voti
In effetti, come gia' fatto presente da xyz, senza contesto si puo' fare ben poco. Comunque provo a dare 2 consigli.
Fossi in te' inizierei con l' includere numeric_std:
Dove puoi trovare utilissime cose, tipo:
Cosi', presumendo che la tua variabile counter sia un array di std_logic (cioe' di tipo std_logic_vector), puoi riscrivere quel trancio di codice come:
Hope it helps.
PS: ma che strano nome per una variabile (output), non e' che e' un segnale di uscita che hai dichiarato come inout? Se si' sostituisci con una variabile, e' preferibile, meglio evitare porte inout se non sono necessarie
Fossi in te' inizierei con l' includere numeric_std:
- Codice: Seleziona tutto
library ieee;
use ieee.numeric_std.all;
Dove puoi trovare utilissime cose, tipo:
- Codice: Seleziona tutto
-- Id: A.5
function "+" (L: UNSIGNED; R: NATURAL) return UNSIGNED;
-- Result subtype: UNSIGNED(L'LENGTH-1 downto 0).
-- Result: Adds an UNSIGNED vector, L, with a non-negative INTEGER, R.
Cosi', presumendo che la tua variabile counter sia un array di std_logic (cioe' di tipo std_logic_vector), puoi riscrivere quel trancio di codice come:
- Codice: Seleziona tutto
output <= std_logic_vector(unsigned(output)+1);
Hope it helps.
PS: ma che strano nome per una variabile (output), non e' che e' un segnale di uscita che hai dichiarato come inout? Se si' sostituisci con una variabile, e' preferibile, meglio evitare porte inout se non sono necessarie
0
voti
Grazie per le risposte.
In effetti, senza specificare il tutto è un po' difficile compprendere il problema.
Comunque, questo è il codice di un contatore a 3 bit:
E questo è l'errore che ottengo:
In effetti, senza specificare il tutto è un po' difficile compprendere il problema.
Comunque, questo è il codice di un contatore a 3 bit:
- Codice: Seleziona tutto
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity counter is
port (
clk : in std_logic; -- clock
start : in std_logic; -- start input
OUTA :out std_logic_vector(0 to 2)); -- output vector
end counter;
architecture arch_counter of counter is
signal t : std_logic_vector(0 to 2) := "000"; -- output provvisorio
begin
process (clk, start)
begin
if start = '0' then OUTA <= "000"; -- asynchronous reset (active low)
elsif (clk'event and clk = '1') then -- rising clock edge
t <= t + "001";
end if;
E questo è l'errore che ottengo:
- Codice: Seleziona tutto
counter.vhdl:37:12: no function declarations for operator "+"
/usr/lib/ghdl/bin/ghdl: compilation error
-
elettronico-bis
0 3 - Messaggi: 35
- Iscritto il: 6 mar 2008, 16:21
0
voti
Forse il problema è questo:
http://tams-www.informatik.uni-hamburg. ... .html#4.11
cambia "IEEE.numeric_std.all" in "IEEE.std_logic_unsigned.all" e quando lanci il compilatore aggiungi l'opzione "--ieee=synopsys".
http://tams-www.informatik.uni-hamburg. ... .html#4.11
cambia "IEEE.numeric_std.all" in "IEEE.std_logic_unsigned.all" e quando lanci il compilatore aggiungi l'opzione "--ieee=synopsys".
0
voti
Sinceramente eviterei IEEE.std_logic_unsigned, e' una roba vecchia e non standard, ormai sostituita con numeric_std:
Per maggiori informazioni dai un occhiata QUI
Io risolverei cosi':
E non avere paura dei cast, VHDL e' uno "strongly typed language"
PS: L' errore che commettevi era richiedere un' "operator +" tra oggetti di tipo std_logic_vector, cosa che non ha ragione di esistere. Questo perche' il compilatore non sa come eseguire la somma (con o senza segno?), quindi devi esplicitare il tipo (nell' esempio sopra unsigned()). Poi, dato che il risultato e' di tipo unsigned e stai assegnando un signal di tipo std_logic_vector, serve un ulteriore cast (std_logic_vector()).
Per maggiori informazioni dai un occhiata QUI
Io risolverei cosi':
- Codice: Seleziona tutto
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity counter is
port (
clk : in std_logic; -- clock
start : in std_logic; -- start input
OUTA :out std_logic_vector(0 to 2)); -- output vector
end counter;
architecture arch_counter of counter is
signal t : std_logic_vector(0 to 2) := "000"; -- output provvisorio
begin
process (clk, start)
begin
if start = '0' then
OUTA <= "000"; -- asynchronous reset (active low)
elsif (clk'event and clk = '1') then -- rising clock edge
t <= std_logic_vector(unsigned(t) + "001");
end if;
end process;
end arch_counter;
E non avere paura dei cast, VHDL e' uno "strongly typed language"

PS: L' errore che commettevi era richiedere un' "operator +" tra oggetti di tipo std_logic_vector, cosa che non ha ragione di esistere. Questo perche' il compilatore non sa come eseguire la somma (con o senza segno?), quindi devi esplicitare il tipo (nell' esempio sopra unsigned()). Poi, dato che il risultato e' di tipo unsigned e stai assegnando un signal di tipo std_logic_vector, serve un ulteriore cast (std_logic_vector()).
Ultima modifica di
denisrn il 16 ago 2010, 9:47, modificato 2 volte in totale.

0
voti
Grande,
grazie mille.
Il programma non fa ancora quello che deve fare ma probabilmente c'è un errore nel codice.
Adesso riesce a compilare senza darmi più l'errore dovuto al +.
Ora pian pianino cercherò di risolvere ogni cosa.
Grazie mille per l'aiuto.
Buona giornata
grazie mille.
Il programma non fa ancora quello che deve fare ma probabilmente c'è un errore nel codice.
Adesso riesce a compilare senza darmi più l'errore dovuto al +.
Ora pian pianino cercherò di risolvere ogni cosa.
Grazie mille per l'aiuto.
Buona giornata
-
elettronico-bis
0 3 - Messaggi: 35
- Iscritto il: 6 mar 2008, 16:21
0
voti
Vabbe, comunque volendo mettere un po' a posto quel codice:
Questa e' la simulazione di un testbench con il componente sopra citato e start forzato a 1:
Questo invece e' un' altro esempio di contatore con reset asincrono e CE, piu' utile perche' piu' generico:
BTW attento all' istante in cui molli il reset asincrono, assicurati di essere lontano dal fronte in cui il contatore commuta!
- Codice: Seleziona tutto
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity counter is
port (
clk : in std_logic; -- clock
start : in std_logic; -- start input
OUTA :out std_logic_vector(0 to 2)); -- output vector
end counter;
architecture arch_counter of counter is
signal t : std_logic_vector(0 to 2) := "000"; -- output provvisorio
begin
process (clk, start)
begin
if start = '0' then
t <= "000"; -- asynchronous reset (active low)
elsif (clk'event and clk = '1') then -- rising clock edge
t <= std_logic_vector(unsigned(t) + "001");
end if;
end process;
OUTA <= t;
end arch_counter;
Questa e' la simulazione di un testbench con il componente sopra citato e start forzato a 1:
Questo invece e' un' altro esempio di contatore con reset asincrono e CE, piu' utile perche' piu' generico:
- Codice: Seleziona tutto
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity nbit_counter is
generic( n_bits: integer );
port( clk: in std_logic;
async_rst: in std_logic;
ce: in std_logic;
count: out std_logic_vector(n_bits-1 downto 0) );
end nbit_counter;
architecture Behavioral of nbit_counter is
begin
process (clk)
variable count_var: std_logic_vector(n_bits-1 downto 0) := (others => '0');
begin
if async_rst = '1' then
count_var := (others => '0');
elsif falling_edge(clk) then
if ce = '1' then
count_var := count_var+1;
end if;
end if;
count <= count_var;
end process;
end Behavioral;
BTW attento all' istante in cui molli il reset asincrono, assicurati di essere lontano dal fronte in cui il contatore commuta!
0
voti
[10] Re: GHDL e librerie
Ciao e grazie per le dritte.
Ora o sistemato il codice (gli chiedevo di farmi vedere l'output fuori dal process e quindi non vedevo tutti gli scatti).
Questo è il codice che gira bene.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity counter is
port (
clk : in std_logic; -- clock
start : in std_logic; -- start input
OUTA
ut std_logic_vector(0 to 2)); -- output vector
end counter;
architecture arch_counter of counter is
signal t : std_logic_vector(0 to 2) := "000"; -- output provvisorio
begin
process (clk, start)
begin
if start = '0' then t <= "000";OUTA <= "000"; -- asynchronous reset (active low)
elsif (clk'event and clk = '1') then -- rising clock edge
t <= t + "001";
OUTA <= t;
end if;
end process;
end arch_counter;
Ovviamente ci sarà un modo meno complicato per farlo.
Stasera mi metto sotto e guardo le tue dritte (ora sono a lavoro, in pausa, ma al lavoro...).
Domani ti faccio sapere come è andata.
Grazie mille per i consigli (sai, uno alle prime armi scrive codici arzigogolati anche per le cose più semplici..)
A domani!
Ora o sistemato il codice (gli chiedevo di farmi vedere l'output fuori dal process e quindi non vedevo tutti gli scatti).
Questo è il codice che gira bene.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity counter is
port (
clk : in std_logic; -- clock
start : in std_logic; -- start input
OUTA

end counter;
architecture arch_counter of counter is
signal t : std_logic_vector(0 to 2) := "000"; -- output provvisorio
begin
process (clk, start)
begin
if start = '0' then t <= "000";OUTA <= "000"; -- asynchronous reset (active low)
elsif (clk'event and clk = '1') then -- rising clock edge
t <= t + "001";
OUTA <= t;
end if;
end process;
end arch_counter;
Ovviamente ci sarà un modo meno complicato per farlo.
Stasera mi metto sotto e guardo le tue dritte (ora sono a lavoro, in pausa, ma al lavoro...).
Domani ti faccio sapere come è andata.
Grazie mille per i consigli (sai, uno alle prime armi scrive codici arzigogolati anche per le cose più semplici..)
A domani!
-
elettronico-bis
0 3 - Messaggi: 35
- Iscritto il: 6 mar 2008, 16:21
11 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Programmi applicativi: simulatori, CAD ed altro
Chi c’è in linea
Visitano il forum: Nessuno e 14 ospiti