implementazione filtro FIR
Posted: 11 Sep 2013, 17:27
Salve a tutti, ho implementato un semplice filtro FIR (in allegato) inserendo i coefficienti, che ho chiamato ca e cb, come costanti. Però quando cambio i valori ai coefficienti e vado a compilare il file mi escono i seguenti warning:
Warning (13024): Output pins are stuck at VCC or GND
Warning (13410): Pin "data_out[7]" is stuck at GND
Warning (13410): Pin "data_out[8]" is stuck at GND
Warning (13410): Pin "data_out[9]" is stuck at GND
N.b. Avendo dichiarato tali costanti come degli integer metto sempre dei valori interi rispettando anche l'intervallo in cui cadono gli integer. Però mi dà questi warning che non riesco a capire. Inoltre se poi imposto
constant ca : integer := 31;
constant cb : integer := 31;
non mi dà nessun warning!!!
Vi allego il codice sperando che nel codice si possa l'individuare l'errore che commetto
Warning (13024): Output pins are stuck at VCC or GND
Warning (13410): Pin "data_out[7]" is stuck at GND
Warning (13410): Pin "data_out[8]" is stuck at GND
Warning (13410): Pin "data_out[9]" is stuck at GND
N.b. Avendo dichiarato tali costanti come degli integer metto sempre dei valori interi rispettando anche l'intervallo in cui cadono gli integer. Però mi dà questi warning che non riesco a capire. Inoltre se poi imposto
constant ca : integer := 31;
constant cb : integer := 31;
non mi dà nessun warning!!!
Vi allego il codice sperando che nel codice si possa l'individuare l'errore che commetto
- Code: Select all
--------------- Realizzazione di un filtro FIR ---------------
-- Librerie --
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
--------------------------------------------------------------
entity filtro_FIR is
generic (
num_bit : integer :=5;
num_taps : integer :=4
);
port(
clk : in std_logic;
reset : in std_logic;
data_in : in unsigned(num_bit-1 downto 0);
data_out : out unsigned(2*num_bit-1 downto 0)
);
end filtro_FIR;
architecture filtro_FIR of filtro_FIR is
component reg
port(
reg_clk : in std_logic;
reg_reset : in std_logic;
D : in unsigned(num_bit-1 downto 0);
Q : out unsigned(num_bit-1 downto 0)
);
end component;
constant ca : integer := 7;
constant cb : integer := 15;
signal d0,d1,d2,d3 : unsigned(num_bit-1 downto 0);
signal t0,t1,t2,t3 : unsigned(2*num_bit-1 downto 0); --prodotti parziali a 2*num_bit (num_bit x num_bit)
begin
d0 <= data_in;
delay1 : reg
port map(clk,reset,d0,d1);
delay2 : reg
port map(clk,reset,d1,d2);
delay3 : reg
port map(clk,reset,d2,d3);
t0 <= d0 * conv_unsigned(ca,5); -- conversione in binario
t1 <= d1 * conv_unsigned(cb,5);
t2 <= d2 * conv_unsigned(cb,5);
t3 <= d3 * conv_unsigned(ca,5);
--per come quartus gestisce le somme, occorre dare
--agli addendi la stessa ampiezza in bit,
--quindi posso usare la conv_unsigned(...)
data_out <= conv_unsigned(t0,2*num_bit)+conv_unsigned(t1,2*num_bit)+conv_unsigned(t2,2*num_bit)+conv_unsigned(t3,2*num_bit);
end filtro_FIR;
-- Implementazione del blocco di ritardo elementare mediante flip-flop con reset asincrono -- che ho messo in un altro file vhdl
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
entity reg is
generic (num_bit : integer :=5);
port(
reg_clk : in std_logic;
reg_reset : in std_logic;
D : in unsigned(num_bit-1 downto 0);
Q : out unsigned(num_bit-1 downto 0)
);
end reg;
architecture reg of reg is
begin
process(reg_clk,reg_reset)
begin
if reg_reset='0' then
Q <= (others => '0');
else if reg_clk'event and reg_clk='1' then
Q <= D;
end if;
end if;
end process;
end reg;