OpenCores
URL https://opencores.org/ocsvn/baudgen/baudgen/trunk

Subversion Repositories baudgen

[/] [baudgen/] [trunk/] [rtl/] [am_baud_rate_gen.vhd] - Rev 5

Compare with Previous | Blame | View Log

-----------------------------------------------------------------------------
--	Filename:	am_baud_rate_gen.vhd
--
--	Description:
--		a paramatizable baud rate generator
--
--	input a 'high speed' clock, and get out a clock enable of x times the baud rate, and the baud rate.
--	  paramiters are the high speed clock frequency, the baud rate required, and the over sample needed.
--
-- works by having two counters,
-- fast counter, counts down to x time baud rate
-- slow counter, then divides this to give baud rate.
--
--
--	Copyright (c) 2007 by Andrew Mulcock 
--		an OpenCores.org Project
--		free to use, but see documentation for conditions 
--
--	Revision 	History:
--	Revision 	Date       		Author    	Comment
--	-------- 	---------- 		---------	-----------
--	1.0      	26/Nov/07  	A Mulcock	Initial revision
--
-----------------------------------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.numeric_std.all ;
 
entity am_baud_rate_gen is
   generic( 
      baudrate       : integer := 115200;
      clock_freq_mhz : real    := 200.0;
      over_sample    : integer := 4
   );
	port(
		clk     	 : in std_logic;	
		rst     	 : in std_logic;
		baud_x_en : out std_logic;
		baud_en   : out std_logic
		);
end entity;
 
-- ==========================================================================================
 
architecture baud_rtl of am_baud_rate_gen is
 
-- calculate from the clock freq, the baud rate, and the over sample ratio
--  the size and count of the two counters.
 
constant	div_ratio_real 	: real	   := ( clock_freq_mhz * 1000000.0) / ((real(baudrate) * real(over_sample)) );
constant	div_ratio_int		: integer	:= integer ( div_ratio_real - 0.5); -- 0.5 gives rounding up / down 
constant over_sample_ratio : integer   := over_sample -1;
constant max_count         : integer   := div_ratio_int;
 
signal   fast_counter      : integer range 0 to div_ratio_int;
signal   slow_counter      : integer range 0 to over_sample_ratio;
signal   slow_cnt_en       : std_logic;
 
begin
 
 
 
------------------------------------------------------------
------------ baud rate counter -----------------------------
------------------------------------------------------------
 
-- in an fpga, don't need to reset a wrap around counter,
-- but somepeople still like to for simulation
-- so comparmise and reset syncronously, as suits the syncronous counter.
 
process(clk)
begin
   if rising_edge(clk) then 
      if ( (rst = '1')  or (fast_counter = 0) ) then                    
         fast_counter <= max_count;
         slow_cnt_en <= not( rst );
      else
         fast_counter <= fast_counter - 1;
         slow_cnt_en <= '0';
      end if;
	end if;
end process;
 
process(clk)
begin
   if rising_edge(clk) then 
      if (rst = '1') or ( slow_counter = 0 and slow_cnt_en = '1' ) then                    
         slow_counter <= over_sample_ratio;
         baud_en <= not( rst);
      elsif slow_cnt_en = '1' then
         slow_counter <= slow_counter - 1;
         baud_en <= '0';
      else
         slow_counter <= slow_counter;
         baud_en <= '0';
      end if;
	end if;
end process;
 
         baud_x_en <= slow_cnt_en;
 
end baud_rtl;
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.