Auslesen.vhd


1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity Auslesen is Port(
6
  CLK100: in std_logic;
7
--   ADC Signale?
8
  UART_RX: in std_logic;
9
  UART_TX: out std_logic);
10
end Auslesen;
11
12
architecture Behavioral of Auslesen is
13
14
component uart is
15
  generic(
16
  clk_freq: integer;
17
  baudrate: integer);
18
  Port (
19
  clk : in std_logic;
20
  start_snd: in std_logic;
21
  start_rcv: out std_logic;
22
  byte_snd : in std_logic_vector(7 downto 0);
23
  byte_rcv : out std_logic_vector(7 downto 0);
24
  tx : out std_logic;
25
  rx : in std_logic;
26
  ready : out std_logic);
27
end component;
28
29
-- component ADC is ...
30
31
signal ADC_data_ready: std_logic:='0';
32
signal ADC_data: std_logic_vector(15 downto 0):=(others => '0');
33
34
--------------------------------------- FSM Control --------------
35
type s_control_type is(s_wait, s_fill_sample, s_send_wait_one, s_send_samples_l, s_send_samples_h);
36
signal s_control: s_control_type:= s_wait;
37
--------------------------------------- FSM Send UART ------------
38
type Sample_Array is array (0 to 2**15-1) of std_logic_vector(15 downto 0); 
39
signal Sample_Arr : Sample_Array := (others => x"0000");
40
signal Sample_Addr: integer range 0 to 2**13-1:=0;
41
signal ADC_select: integer range 0 to 15:=0;
42
signal Sample_len2hoch: integer range 8 to 15:=10;
43
signal Sample_from_RAM: std_logic_vector(15 downto 0):=(others => '0');
44
-------------------------- UART -------------------------------------
45
signal UART_start_snd: std_logic:='0';
46
signal UART_start_rcv: std_logic:='0';
47
signal UART_byte_snd: std_logic_vector(7 downto 0):="00000000";
48
signal UART_byte_rcv: std_logic_vector(7 downto 0):="00000000";
49
signal UART_ready: std_logic:='0';
50
51
begin
52
  
53
UART_0: uart 
54
  generic map(
55
  clk_freq => 100000000,
56
  baudrate => 9600)
57
  port map(
58
  clk => CLK100,
59
  start_snd => UART_start_snd,
60
  start_rcv => UART_start_rcv,
61
  byte_snd =>  UART_byte_snd,
62
  byte_rcv =>  UART_byte_rcv,
63
  tx => UART_TX,
64
  rx => UART_RX,
65
  ready => UART_ready);
66
  
67
------------------------- FSM -----------------------------------------------------------
68
process begin
69
  wait until rising_edge(CLK100);
70
  UART_start_snd <= '0';
71
  Sample_from_RAM <= Sample_Arr(Sample_Addr);
72
  if    s_control = s_wait then
73
    if UART_start_rcv = '1' then
74
      s_control <= s_fill_sample;
75
      Sample_Addr <= 0;
76
        
77
      ADC_select <= to_integer(unsigned(UART_byte_rcv(3 downto 0)));
78
      if unsigned(UART_byte_rcv(7 downto 4)) > 7 then
79
        Sample_len2hoch <= to_integer(unsigned(UART_byte_rcv(7 downto 4)));
80
      else
81
        Sample_len2hoch <= 8;
82
      end if;
83
    end if;
84
  elsif s_control = s_fill_sample then
85
    if    ADC_select = 0 and ADC_data_ready = '1' then
86
      Sample_Arr(Sample_Addr) <= ADC_data;
87
      if Sample_Addr < 2**Sample_len2hoch-1 then
88
        Sample_Addr <= Sample_Addr +1;
89
      else
90
        Sample_Addr <= 0;
91
        s_control <= s_send_wait_one;
92
      end if;
93
    -- elsif ADC_select = 1, ...
94
    end if;
95
  elsif s_control = s_send_wait_one then
96
    s_control <= s_send_samples_h;
97
  elsif s_control = s_send_samples_h then
98
    if UART_ready = '1' then
99
      UART_byte_snd <= Sample_from_RAM(15 downto 8);
100
      UART_start_snd <= '1';
101
      s_control <= s_send_samples_l;
102
    end if;
103
  elsif s_control = s_send_samples_l then
104
    if UART_ready = '1' then
105
      UART_byte_snd <= Sample_from_RAM(7 downto 0);
106
      UART_start_snd <= '1';
107
      if Sample_Addr < 2**Sample_len2hoch-1 then
108
        Sample_Addr <= Sample_Addr +1; 
109
        s_control <= s_send_samples_h;
110
      else
111
        Sample_Addr <= 0;
112
        s_control <= s_wait;
113
      end if;
114
    end if;
115
  end if;
116
end process;
117
118
end Behavioral;