Demo entry 6344385

C

   

Submitted by anonymous on Jan 12, 2017 at 09:49
Language: TeX. Code size: 3.1 kB.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity divisore is
  
port(
		
--segnali per il funzionamento
	clock, serial_in: in std_logic;
	shift_enable: out std_logic;
		
--segnali per il monitoraggio
    en_divider_out: out std_logic;
    out_11counter_out: out std_logic_vector (3 downto 0);
    count66to115_out: out std_logic_vector (9 downto 0)
    
);

end divisore;


architecture arch of divisore is



--divider: è il contatore che esegue la divisione della frequenza 
COMPONENT count66to115	PORT (
	sclr	: IN STD_LOGIC ;
	clock	: IN STD_LOGIC ;
	q	: OUT STD_LOGIC_VECTOR (9 DOWNTO 0);
	cnt_en	: IN STD_LOGIC 
);
END COMPONENT;

--counter: è il contatore del numero di bit	ricevuti
COMPONENT count11	PORT (
	sclr	: IN STD_LOGIC ;
	clock	: IN STD_LOGIC ;
	q	: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
	cnt_en	: IN STD_LOGIC 
);
END COMPONENT;
	

type st_value is (nop, working);
signal st_pres, st_next: st_value;

signal en_divider ,sclr_divider: std_logic;
signal out_divider: std_logic_vector (9 downto 0);

signal sclr_counter: std_logic;
signal out_11counter: std_logic_vector (3 downto 0);

signal segnale: std_logic;


begin 

count66to115_inst : count66to115 PORT MAP (
	clock	 => clock,
	cnt_en	 => en_divider,
	sclr	 => sclr_divider,
	q	 => out_divider
);
	
	
count11_inst : count11 PORT MAP (
	clock	 => clock,
	cnt_en	 => sclr_divider,
	sclr	 => sclr_counter,
	q	 => out_11counter
);
	

--processo per il funzionamento della macchina a stati
process(clock) 
  
begin
  
	if(rising_edge(clock)) then
		st_pres<=st_next;
    end if;
  
end process;

--macchina a stati per abilitare il divider all'arrivo dello starting_bit
process(clock, st_pres, serial_in, out_11counter)

begin

--default
en_divider<='0';
st_next<=nop;

	case st_pres is
                  
	when nop =>
	
		if(serial_in='1') then
			 
			st_next <= working; 
			 
		else
		
			st_next <= nop;  
			
		end if; 
		                                        
	when working =>
	
		en_divider <= '1';
		
		if(out_11counter="1011") then
			
			en_divider<='0';
			st_next<=nop;
			
		else
			
			st_next<=working;
		
		end if;
		
	end case;
	
end process;


--produzione dell'output e reset
process(clock,out_divider)

begin
	
	if(rising_edge(clock)) then
	
		--si sfasa il segnale di shift enable rispetto alle transizioni
		if(out_divider= "0010000000" ) then    				
			segnale<='1';
		else
		   	segnale<='0';
		end if;	
	
	
		if(out_divider= "1000111100" ) then     
		 --il numero è 572= 66000/115	
		 					
			sclr_divider<='1';        --clear per il divider
			
		else
		   	sclr_divider<='0';
		end if;	
		
		
		if(out_11counter="1011") then      		--il numero è 11		
			sclr_counter<='1';                  --clear per il counter
		else
			sclr_counter<='0';
		end if;		
			
			
	end if;
	
end process;

--assegnazione degli output
shift_enable<=segnale;
en_divider_out<= en_divider;
out_11counter_out<= out_11counter;
count66to115_out<=out_divider;


end arch;

This snippet took 0.00 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).