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

Subversion Repositories modbus

[/] [modbus/] [trunk/] [enlace/] [clock_generator_for_uart_rs232.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 guanucolui
--------------------------------------------------------------------------------
2
-- Company: University of Vigo
3
-- Engineer: L. Jacobo Alvarez Ruiz de Ojeda
4
--
5
-- Create Date:    10:07:16 10/20/06
6
-- Design Name:    
7
-- Module Name:    clock_generator_for_uart_rs232 - Behavioral
8
-- Project Name:   
9
-- Target Device:  
10
-- Tool versions:  
11
-- Description:
12
-- This is a clock generator useful for the RS232 UART
13
-- The uart_clock must have a frequency of eight times faster than the desired baud rate
14
-- This clock generator obtains the uart_clock from a 50 MHz clock input
15
-- Below are some values for the constant "divide_by", which allow to obtain some of the RS232 standard
16
-- baud rates. Put the desired value in the definition of the constant or adapt this value if
17
-- you need another baud rate or if your clock input frequency is other than 50 MHz.
18
--
19
-- Dependencies:
20
-- 
21
-- Revision:
22
-- Revision 0.01 - File Created
23
-- Additional Comments:
24
-- 
25
--------------------------------------------------------------------------------
26
library IEEE;
27
use IEEE.STD_LOGIC_1164.ALL;
28
use IEEE.STD_LOGIC_ARITH.ALL;
29
use IEEE.STD_LOGIC_UNSIGNED.ALL;
30
 
31
---- Uncomment the following library declaration if instantiating
32
---- any Xilinx primitives in this code.
33
--library UNISIM;
34
--use UNISIM.VComponents.all;
35
 
36
entity clock_generator_for_uart_rs232 is
37
    Port ( clk : in std_logic;
38
                          reset : in std_logic;
39
           uart_clk : out std_logic);
40
end clock_generator_for_uart_rs232;
41
 
42
architecture Behavioral of clock_generator_for_uart_rs232 is
43
 
44
constant divide_by: integer := 651;
45
 
46
-- For 1200 bps, divide_by = 5208;
47
-- For 2400 bps, divide_by = 2604;
48
-- For 4800 bps, divide_by = 1302;
49
-- For 9600 bps, divide_by = 651;
50
-- For 19200 bps, divide_by = 325;
51
-- For 38400 bps, divide_by = 163;
52
-- For 57600 bps, divide_by = 108;
53
-- For 115200 bps, divide_by = 54;
54
-- For 230400 bps, divide_by = 27;
55
-- For 460800 bps, divide_by = 13;
56
-- For 921600 bps, divide_by = 7;
57
-- For 1 Mbps, divide_by = 6;
58
 
59
-- At the higher frequencies, the resulting frequency of the clock output has less accuracy, so maybe
60
-- there will be some problems with bit snchronization. If this is the case, it is recommended to obtain
61
-- the needed frequency through another tupe of circuit, like a DLL or PLL
62
 
63
signal count: integer range 0 to ((divide_by / 2) - 1);
64
signal clk_out: std_logic;
65
 
66
begin
67
 
68
uart_clk <= clk_out;
69
 
70
process (clk, reset, count, clk_out)
71
begin
72
        if reset = '1' then
73
                clk_out <='0';
74
                count <= 0;
75
        elsif
76
                clk='1' and clk'event then
77
                        if count = ((divide_by / 2) - 1) then
78
                                clk_out <= not clk_out;
79
                                count <= 0;
80
                        else count <= count+1;
81
                        end if;
82
        end if;
83
end process;
84
 
85
 
86
end Behavioral;

powered by: WebSVN 2.1.0

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