OpenCores
URL https://opencores.org/ocsvn/hf-risc/hf-risc/trunk

Subversion Repositories hf-risc

[/] [hf-risc/] [trunk/] [hf-riscv/] [core_rv32i/] [uart.vhd] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 serginhofr
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_textio.all;
4
use ieee.std_logic_unsigned.all;
5
use std.textio.all;
6
 
7
entity uart is
8
        generic(log_file : string := "UNUSED");
9
        port(   clk             : in std_logic;
10
                reset           : in std_logic;
11
                divisor         : in std_logic_vector(11 downto 0);
12
                enable_read     : in std_logic;
13
                enable_write    : in std_logic;
14
                data_in         : in std_logic_vector(7 downto 0);
15
                data_out        : out std_logic_vector(7 downto 0);
16
                uart_read       : in std_logic;
17
                uart_write      : out std_logic;
18
                busy_write      : out std_logic;
19
                data_avail      : out std_logic
20
        );
21
end;
22
 
23
architecture logic of uart is
24
        signal delay_write_reg : std_logic_vector(11 downto 0);
25
        signal bits_write_reg  : std_logic_vector(3 downto 0);
26
        signal data_write_reg  : std_logic_vector(8 downto 0);
27
        signal delay_read_reg  : std_logic_vector(11 downto 0);
28
        signal bits_read_reg   : std_logic_vector(3 downto 0);
29
        signal data_read_reg   : std_logic_vector(7 downto 0);
30
        signal data_save_reg   : std_logic_vector(8 downto 0);
31
        signal busy_write_sig  : std_logic;
32
        signal read_value_reg  : std_logic_vector(7 downto 0);
33
        signal uart_read2      : std_logic;
34
 
35
begin
36
 
37
        uart_proc:
38
        process(clk, reset, enable_read, enable_write, data_in, data_write_reg, bits_write_reg,
39
                delay_write_reg, data_read_reg, bits_read_reg, delay_read_reg, data_save_reg,
40
                read_value_reg, uart_read2, busy_write_sig, uart_read)
41
        begin
42
                uart_read2 <= read_value_reg(read_value_reg'length - 1);
43
 
44
                if reset = '1' then
45
                        data_write_reg  <= x"00" & '1';
46
                        bits_write_reg  <= "0000";
47
                        delay_write_reg <= (others => '0');
48
                        read_value_reg  <= (others => '1');
49
                        data_read_reg   <= (others => '0');
50
                        bits_read_reg   <= "0000";
51
                        delay_read_reg  <= (others => '0');
52
                        data_save_reg   <= (others => '0');
53
                elsif clk'event and clk = '1' then
54
                        -- UART write
55
                        if bits_write_reg = "0000" then                                                 --nothing left to write?
56
                                if enable_write = '1' then
57
                                        delay_write_reg <= (others => '0');                              --delay before next bit
58
                                        bits_write_reg <= "1010";                                       --number of bits to write
59
                                        data_write_reg <= data_in & '0';                         --remember data & start bit
60
                                end if;
61
                        else
62
                                if delay_write_reg /= divisor then
63
                                        delay_write_reg <= delay_write_reg + 1;                         --delay before next bit
64
                                else
65
                                        delay_write_reg <= (others => '0');                              --reset delay
66
                                        bits_write_reg <= bits_write_reg - 1;                           --bits left to write
67
                                        data_write_reg <= '1' & data_write_reg(8 downto 1);
68
                                end if;
69
                        end if;
70
 
71
                        -- average uart_read signal
72
                        if uart_read = '1' then
73
                                if read_value_reg /= x"ff" then
74
                                        read_value_reg <= read_value_reg + 1;
75
                                end if;
76
                        else
77
                                if read_value_reg /= x"00" then
78
                                        read_value_reg <= read_value_reg - 1;
79
                                end if;
80
                        end if;
81
 
82
                        -- UART read
83
                        if delay_read_reg = x"0000" then                                                --done delay for read?
84
                                if bits_read_reg = "0000" then                                          --nothing left to read?
85
                                        if uart_read2 = '0' then                                 --wait for start bit
86
                                                delay_read_reg <= '0' & divisor(11 downto 1);            --half period
87
                                                bits_read_reg <= "1001";                                --bits left to read
88
                                        end if;
89
                                else
90
                                        delay_read_reg <= divisor;                                      --initialize delay
91
                                        bits_read_reg <= bits_read_reg - 1;                             --bits left to read
92
                                        data_read_reg <= uart_read2 & data_read_reg(7 downto 1);
93
                                end if;
94
                        else
95
                                delay_read_reg <= delay_read_reg - 1;                                   --delay
96
                        end if;
97
 
98
                        if bits_read_reg = "0000" and delay_read_reg = divisor then
99
                                data_save_reg <= '1' & data_read_reg;
100
                        elsif enable_read = '1' then
101
                                data_save_reg(8) <= '0';                                         --data_available
102
                        end if;
103
                end if;
104
 
105
                if bits_write_reg /= "0000"
106
        --              and log_file = "UNUSED"
107
                then
108
                        busy_write_sig <= '1';
109
                else
110
                        busy_write_sig <= '0';
111
                end if;
112
 
113
                uart_write <= data_write_reg(0);
114
                busy_write <= busy_write_sig;
115
                data_avail <= data_save_reg(8);
116
                data_out <= data_save_reg(7 downto 0);
117
        end process;
118
 
119
-- synthesis_off
120
        uart_logger:
121
        if log_file /= "UNUSED" generate
122
                uart_proc:
123
                process(clk, enable_write, data_in)
124
                        file store_file : text open write_mode is log_file;
125
                        variable hex_file_line : line;
126
                        variable c : character;
127
                        variable index : natural;
128
                        variable line_length : natural := 0;
129
                begin
130
                        if clk'event and clk = '1' and busy_write_sig = '0' then
131
                                if enable_write = '1' then
132
                                        index := conv_integer(data_in(6 downto 0));
133
                                        if index /= 10 then
134
                                                c := character'val(index);
135
                                                write(hex_file_line, c);
136
                                                line_length := line_length + 1;
137
                                        end if;
138
                                        if index = 10 or line_length >= 72 then
139
                                                writeline(store_file, hex_file_line);
140
                                                line_length := 0;
141
                                        end if;
142
                                end if;
143
                        end if;
144
                end process;
145
        end generate;
146
-- synthesis_on
147
end;

powered by: WebSVN 2.1.0

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