Ciao a tutti,
sono nuovo del forum e lo trovo molto interessante.
Per quanto riguarda l'ottimizzazione del codice del filtro sono completamente d'accordo con deluca.
Infatti per i linguaggi di descrizione dell'HW la leggibilità del codice è veramente molto importante, forse più che per gli altri linguaggi di programmazione in quanto la concorrenzialità dei processi potrebbe facilmente confondere il progettista.
Pertanto propongo come evoluzione del codice scritto in precedenza il segente:
- Code: Select all
ENTITY digital_filter IS
generic(
NUM_CHANNELS : integer := 5 -- NUM_CHANNELS+1 base 0
);
PORT (
CH : IN std_logic_vector(0 to NUM_CHANNELS); -- for number of channels
CH_filt : OUT std_logic_vector(0 to NUM_CHANNELS); -- change CH and CH_filt
Clk : IN std_logic
);
END digital_filter;
ARCHITECTURE arch_digital_filter OF digital_filter IS
SIGNAL temp_CH : std_logic_vector(0 to NUM_CHANNELS):=(others=>'0');
BEGIN
filtri:for i in 0 to NUM_CHANNELS generate
signal filter: std_logic_vector(0 to 3):=(others=>'0');
begin
Channel:PROCESS(CLK)
BEGIN
IF (CLK'event AND CLK = '1') THEN
filter(1 to 3) <= filter(0 to 2);
filter(0) <= CH(i);
IF filter(1 to 3) = "000" THEN
temp_CH(i) <= '0';
END IF;
IF filter(1 to 3) = "111" THEN
temp_CH(i) <= '1';
END IF;
END IF;
END PROCESS;
end generate;
CH_filt <= temp_CH;
END arch_digital_filter;
E' un pò più snello?
In questo modo per aumentare i canali basta solo modificare il valore nel generic in testa alla definizione dell'entity (1 modifica).
In VHDL purtroppo non sembra esistere un equivalente del #define del C. Si potrebbe creare una libreria da includere ad inizio progetto, ma è poco pratico in quanto deve essere ricompilato (da ModelSim per esempio, QuartusII o ISE Xilinx non lo permettono) ogni volta che si cambia qualche valore e sempre separatamente dalla compilazione del progetto. Quindi meglio il generic.
Un saluto a tutti,
e buona Pasqua.