Buongiorno a tutti ,devo progettare un'entità che sia in grado a partire da un ingresso seriale(din) di generare due uscite(out_h e out_l) in corrispondenza di multipli interi del 16 impulso di clock.
I due segnali dovranno essere emessi sole se i bit di posizione dispari in arrivo dall'ingresso soddisfano la parola chiave(01001110) e dovranno contenere rispettivamente:
- OUTH i 4 bit più significativi di posizione pari in arrivo dall’ingresso;
- OUTL i 4 bit meno significativi derivanti dalla somma della parola chiave con
gli otto bit di posizione pari in arrivo dall’ingresso.
sono presenti segnali di enable e reset.
Ecco la mia soluzione:
- Code: Select all
- entity agosto7 is
 port(clk,reset,enable,din:in std_logic;
 out_h,out_l: out std_logic_vector(3 downto 0));
 end agosto7;
 architecture Behavioral of agosto7 is
 signal cnt: integer:=0;
 signal reg: std_logic_vector(15 downto 0):="0000000000000000";
 signal reg1: std_logic_vector(7 downto 0):="00000000";
 signal outh: std_logic_vector(3 downto 0);
 signal outl: std_logic_vector(3 downto 0);
 begin
 process(clk,reset,enable)
 begin
 if rising_edge(clk) then
 if enable='1' then
 if reset='1' then
 if cnt>=0 and cnt<=15 then
 reg<=reg(14 downto 0)&din;
 cnt<=cnt+1;
 elsif cnt=16 then
 reg1<=reg(15)®(13)®(11)®(9)®(7)®(5)®(3)®(1);
 cnt<=cnt+1;
 elsif cnt=17 then
 if reg1="01001110" then
 outh<=reg(14)®(12)®(10)®(8);
 outl<=reg1(3 downto 0)+reg(14)®(12)®(10)®(8);
 cnt<=cnt+1;
 else
 outh<="ZZZZ";
 outl<="ZZZZ";
 cnt<=cnt+1;
 end if;
 elsif cnt=18 then
 reg<="0000000000000000";
 reg1<="00000000";
 cnt<=0;
 end if;
 else--reset=0
 outh<="XXXX";
 outl<="XXXX";
 cnt<=0;
 end if;
 else--enable=0
 outh<="ZZZZ";
 outl<="ZZZZ";
 cnt<=0;
 end if;
 end if;
 end process;
 out_h<=outh;
 out_l<=outl;
 end Behavioral;
e simulando ottengo dei problemi di visualizzazione che spero sappiate aiutarmi a capire.. grazie in anticipo.



 
 
