--------------------------------------------------------------- -- MAC main entity --------------------------------------------------------------- library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; -- Nota: il segnale di reset e' INDISPENSABILE per resettare ad un valore noto -- i FF del registro. Il segnale di enable e' facoltativo entity mac is port (clk,reset,enable : in std_logic; in_chan1,in_chan2 : in unsigned(3 downto 0); out_chan : out unsigned(7 downto 0) ); end mac; architecture s of mac is component reg port ( clk,reset,enable : in std_logic; reg_in : in unsigned(7 downto 0); reg_out : out unsigned(7 downto 0) ); end component; signal ck_in1,ck_in2 : unsigned(3 downto 0); signal prod,ck_prod,sum,newsum : unsigned(7 downto 0); begin -- Sincronizzazione degli ingressi, potrebbe essere descritto -- attraverso una subentity gerarchica (non fa' differenza) process(clk,reset) begin if reset='1' then ck_in1<="0000"; ck_in2<="0000"; elsif clk'event and clk='1' then if enable='1' then ck_in1<=in_chan1; ck_in2<=in_chan2; end if; end if; end process; -- Blocco di moltiplicazione, potrebbe essere ugualmente descritto -- attraverso una subentity gerarchica (non fa' differenza) prod <= ck_in1 * ck_in2; -- Registro di pipeline, potrebbe essere descritto ugualmente attraverso -- un processo (non fa' differenza) Pipe_reg : reg port map (clk,reset,enable,prod,ck_prod); -- Result Accumulator newsum <= sum+ck_prod; -- Registro accumulatore, potrbbe essere descritto ugualmente attraverso -- un processo (non fa' differenza) acc_reg : reg port map (clk,reset,enable,newsum,sum); -- Il risultato viene portato sui pins di uscita out_chan <= sum; end s; ----------------------------------------------------------------------- -- DATA_REG : General purpose Register entity ----------------------------------------------------------------------- library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity reg is port ( clk,reset,enable : in std_logic; reg_in : in unsigned(7 downto 0); reg_out : out unsigned(7 downto 0) ); end reg; architecture b of reg is begin process(clk,reset) begin if reset='1' then reg_out <= ( others => '0'); elsif clk'event and clk='1' then if enable='1' then reg_out <= reg_in; end if; end if; end process; end b; NOTA: In questa soluzione, su FPGA Max7000, la soluzione non pipelied ha un critical path attorno ai 40ns, mentre la soluzione pipelined si assesta attorno ai 24ns, per uno speedup di circa 40%, con un aumento di ingombro di sole 5 l.c. Tali cifre possono comunque variare a seconda dell'implementazione (e anche della quantita' di memoria del PC su cui si e' eseguita la sintesi ...)