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.