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

Subversion Repositories light8080

[/] [light8080/] [trunk/] [vhdl/] [soc/] [uart.vhdl] - Blame information for rev 77

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 70 ja_rd
--##############################################################################
2
-- uart.vhdl -- Basic, hardwired RS232 UART.
3
--
4
-- Most operational parameters are hardcoded: 8 bit words, no parity, 1 stop 
5
-- bit. The only parameter that can be configured in run time is the baud rate.
6
--
7
-- The receiver logic is a simplified copy of the 8051 UART. The bit period is 
8
-- split in 16 sampling periods, and 3 samples are taken at the center of each 
9
-- bit period. The bit value is decided by majority. The receiver logic has some
10
-- error recovery capability that should make this core reliable enough for
11
-- actual application use -- yet, the core does not have a format test bench.
12
--
13
-- See usage notes below.
14
--
15
--------------------------------------------------------------------------------
16
-- This file is free software (See COPYING.TXT) 
17
--##############################################################################
18
 
19
library ieee;
20
use ieee.std_logic_1164.all;
21
use ieee.numeric_std.all;
22
 
23
--------------------------------------------------------------------------------
24
-- UART programmer model
25
--------------------------------------------------------------------------------
26
--
27
-- The UART has a number of configuration registers addressable with input 
28
-- signal addr_i:
29
--
30
-- [00] => Data buffer, both transmission and reception.
31
-- [01] => Status/control register (r/w).
32
-- [10] => Bit period register, low byte.
33
-- [11] => Bit period register, high byte.
34
--
35
--
36
-- Data buffers:
37
----------------
38
--
39
-- The same address [00b] is used for both the receive buffer and the 
40
-- transmision buffer. 
41
--
42
-- Writing to the data buffer when flag TxRdy is high will trigger a 
43
-- transmission and clear flag TxRdy.
44
-- Writing to the data buffer when flag TxRdy is clear will have no effect.
45
-- 
46
-- Reading the data register when flag RxRdy is high will return the last 
47
-- received data byte, and will clear flag RxRdy but NOT RxIrq. 
48
-- Reading the register when flag RxRdy is clear will return indeterminate data,
49
-- which in practice will usually be the last byte received.
50
--
51
-- Interrupts:
52
--------------
53
--
54
-- The core has two interrupt sources tied to a single external irq line. The
55
-- sources are these:
56
-- 
57
-- -# Receiver interrupt: Raised when the stop bit is sampled and determined 
58
--    to be valid (about the middle of the bit period).
59
--    If the stop bit is not valid (not high) then the interrupt is not 
60
--    triggered. If a start bit is determined to be spurious (i.e. the falling
61
--    edge is detected but the bit value when sampled is not 0) then the
62 77 ja_rd
--    interrupt is not triggered.
63 70 ja_rd
--    This interrupt sets flag RxIrw in the status register.
64
-- -# Transmitter interrupt: Raised at the end of the transmission of the stop
65
--    bit.
66
--    This interrupt sets flag TxIrq in the status register 1 clock cycle after
67
--    the interrupt is raised.
68
-- 
69
-- The core does not have any interrupt enable mask. If any interrupt source 
70
-- triggers, the output irq_o is asserted for one cycle. This is all the extent 
71
-- of the interrupt processing done by this module: this UART needs a separate 
72
-- interrupt controller to interface the light8080 core.
73
-- 
74
-- Error detection:
75
-------------------
76
--
77
-- The core is capable of detecting and recovering from these error conditions:
78
-- 
79
-- -# When a start bit is determined to be spurious (i.e. the falling edge is 
80
--    detected but the bit value when sampled is not 0) then the core returns to
81
--    its idle state (waiting for a new start bit).
82
-- -# If a stop bit is determined to be invalid (not 1 when sampled), the 
83
--    reception interrupt is not triggered and the received byte is discarded.
84
-- -# When the 3 samples taken from the center of a bit period are not equal, 
85
--    the bit value is decided by majority.
86
-- 
87
-- In none of the 3 cases does the core raise any error flag. It would be very 
88
-- easy to include those flags in the core, but it would take a lot more time 
89
-- to test them minimally and that's why they haven't been included.
90
--
91
-- Status register flags:
92
-------------------------
93
--
94
--      7       6       5       4       3       2       1       0
95
--  +-------+-------+-------+-------+-------+-------+-------+-------+
96
--  |   0   |   0   | RxIrq | TxIrq |   0   |   0   | RxRdy | TxRdy |
97
--  +-------+-------+-------+-------+-------+-------+-------+-------+
98
--      h       h      W1C     W1C      h       h       r       r     
99
--
100
--  Bits marked 'h' are hardwired and can't be modified. 
101
--  Bits marked 'r' are read only; they are set and clear by the core.
102
--  Bits marked W1C ('Write 1 Clear') are set by the core when an interrupt 
103
--  has been triggered and must be cleared by the software by writing a '1'.
104
--
105
-- -# Status bit TxRdy is high when there isn't any transmission in progress. 
106
--    It is cleared when data is written to the transmission buffer and is 
107
--    raised at the same time the transmission interrupt is triggered.
108
-- -# Status bit RxRdy is raised at the same time the receive interrupt is
109
--    triggered and is cleared when the data register is read.
110
-- -# Status bit TxIrq is raised when the transmission interrupt is triggered 
111
--    and is cleared when a 1 is written to it.
112
-- -# Status bit RxIrq is raised when the reception interrupt is triggered 
113
--    and is cleared when a 1 is written to it.
114
--
115
-- When writing to the status/control registers, only flags TxIrq and RxIrq are
116
-- affected, and only when writing a '1' as explained above. All other flags 
117
-- are read-only.
118
--
119
-- Baud rate configuration:
120
---------------------------
121
--
122
-- The baud rate is determined by the value of 14-bit register 'bit_period_reg'.
123
-- This register holds the length of the bit period in clock cycles and its
124
-- value may be hardcoded or configured at run time.
125
--
126
-- When generic HARDWIRED is true, bit_period_reg is hardwired with a value 
127
-- computed from the value of generic BAUD_RATE. The bit period computation 
128
-- needs to know the master clock rate, which should be given in generic 
129
-- CLOCK_RATE.
130
-- Writes to the baud registers when HARDWIRED is true will be ignored.
131
--
132
-- When generic HARDWIRED is false, generics BAUD_RATE and CLOCK_RATE determine 
133
-- the reset value of bit_period_reg, but the register can be changed at run 
134
-- time by writing at addresses [10b] and [11b], which access the low and high 
135
-- bytes of the register, respectively.
136
-- Reading from those register addresses returns the value of the status 
137
-- register (a LUT saving measure) so the registers are effectively write-only.
138
--
139
--------------------------------------------------------------------------------
140
-- Core interface signals:
141
--
142
-- clk_i:     Clock input, active rising edge.
143
-- reset_i:   Synchronous reset.
144
-- txd_o:     TxD UART output.
145
-- rxd_i:     RxD UART input -- synchronization logic included.
146
-- irq_o:     Interrupt output, asserted for 1 cycle when triggered.
147
-- data_i:    Data bus, input.
148
-- data_o:    Data bus, output.
149
-- addr_i:    Register selection address (see above).
150
-- wr_i:      Write enable input.
151
-- rd_i:      Read enable input.
152
-- ce_i:      Chip enable, must be active at the same time as wr_i or rd_i.
153
-- 
154
--
155
-- A detailed explanation of the interface timing will not be given. The core 
156
-- reads and writes like a synchronous memory. There's usage examples in other 
157
-- project files.
158
--------------------------------------------------------------------------------
159
 
160
entity uart is
161
  generic (
162
    HARDWIRED     : boolean := true;  -- Baud rate hardwired to constant value 
163
    BAUD_RATE     : integer := 19200; -- Default (or hardwired) baud rate 
164
    CLOCK_FREQ    : integer := 50E6); -- Clock rate
165
    port (
166
        rxd_i     : in std_logic;
167
        txd_o     : out std_logic;
168
 
169
        irq_o     : out std_logic;
170
 
171
        data_i    : in std_logic_vector(7 downto 0);
172
        data_o    : out std_logic_vector(7 downto 0);
173
 
174
        addr_i    : in std_logic_vector(1 downto 0);
175
        wr_i      : in std_logic;
176
        rd_i      : in std_logic;
177
        ce_i      : in std_logic;
178
 
179
        clk_i     : in std_logic;
180
        reset_i   : in std_logic);
181
end uart;
182
 
183
architecture hardwired of uart is
184
 
185
-- Bit period expressed in master clock cycles
186
constant DEFAULT_BIT_PERIOD : integer := (CLOCK_FREQ / BAUD_RATE);
187
 
188
-- Bit sampling period is 1/16 of the baud rate.
189
constant DEFAULT_SAMPLING_PERIOD : integer := DEFAULT_BIT_PERIOD / 16;
190
 
191
 
192
 
193
--##############################################################################
194
 
195
-- Common signals
196
 
197
signal reset :            std_logic;
198
signal clk :              std_logic;
199
 
200
 
201
signal bit_period_reg :   unsigned(13 downto 0);
202
signal sampling_period :  unsigned(9 downto 0);
203
 
204
 
205
-- Interrupt & status register signals
206
 
207
signal tx_irq_flag :      std_logic;
208
signal rx_irq_flag :      std_logic;
209
signal load_stat_reg :    std_logic;
210
signal load_tx_reg :      std_logic;
211
 
212
-- Receiver signals
213
signal rxd_q :            std_logic;
214
signal tick_ctr :         unsigned(3 downto 0);
215
signal state :            unsigned(3 downto 0);
216
signal next_state :       unsigned(3 downto 0);
217
signal start_bit_detected : std_logic;
218
signal reset_tick_ctr :   std_logic;
219
signal stop_bit_sampled : std_logic;
220
signal load_rx_buffer :   std_logic;
221
signal stop_error :       std_logic;
222
signal samples :          std_logic_vector(2 downto 0);
223
signal sampled_bit :      std_logic;
224
signal do_shift :         std_logic;
225
signal rx_buffer :        std_logic_vector(7 downto 0);
226
signal rx_shift_reg :     std_logic_vector(9 downto 0);
227
signal tick_ctr_enable :  std_logic;
228
signal tick_baud_ctr :    unsigned(10 downto 0);
229
 
230
signal rx_rdy_flag :      std_logic;
231
signal rx_irq :           std_logic;
232
signal set_rx_rdy_flag :  std_logic;
233
signal rxd :              std_logic;
234
 
235
signal read_rx :          std_logic;
236
signal status :           std_logic_vector(7 downto 0);
237
 
238
-- Transmitter signals 
239
 
240
signal tx_counter :       unsigned(13 downto 0);
241
signal tx_data :          std_logic_vector(10 downto 0);
242
signal tx_ctr_bit :       unsigned(3 downto 0);
243
signal tx_busy :          std_logic;
244
signal tx_irq :           std_logic;
245
 
246
 
247
 
248
begin
249
 
250
-- Rename the most commonly used inputs to get rid of the i/o suffix
251
clk <= clk_i;
252
reset <= reset_i;
253
rxd <= rxd_i;
254
 
255
 
256
-- Serial port status byte -- only 2 status flags
257
status <=
258
    "00" & rx_irq_flag & tx_irq_flag &  -- Interrupt flags
259
    "00" & rx_rdy_flag & (not tx_busy); -- State flags
260
 
261
-- Read register multiplexor
262
with addr_i select data_o <=
263
    rx_buffer   when "00",
264
    status      when others;
265
 
266
 
267
load_tx_reg <= '1' when wr_i = '1' and ce_i = '1' and addr_i = "00" else '0';
268
load_stat_reg <= '1' when wr_i = '1' and ce_i = '1' and addr_i = "01" else '0';
269
read_rx <= '1' when rd_i = '1' and ce_i = '1' else '0';
270
 
271
rx_irq <= set_rx_rdy_flag;
272
 
273
irq_o <= rx_irq or tx_irq;
274
 
275
interrupt_flags:
276
process(clk)
277
begin
278
  if clk'event and clk='1' then
279
    if reset = '1' then
280
      rx_irq_flag <= '0';
281
      tx_irq_flag <= '0';
282
    else
283
      if set_rx_rdy_flag='1' then
284
        rx_irq_flag <= '1';
285
      elsif load_stat_reg='1' and data_i(5)='1' then
286
        rx_irq_flag <= '0';
287
      end if;
288
      if tx_irq='1' then
289
        tx_irq_flag <= '1';
290
      elsif load_stat_reg='1' and data_i(4)='1' then
291
        tx_irq_flag <= '0';
292
      end if;
293
    end if;
294
  end if;
295
end process interrupt_flags;
296
 
297
 
298
baud_rate_registers:
299
process(clk)
300
begin
301
  if clk'event and clk='1' then
302
    if reset = '1' then
303
      bit_period_reg <= to_unsigned(DEFAULT_BIT_PERIOD,14);
304
    else
305
      if wr_i = '1' and ce_i = '1' then
306
        if addr_i = "10" then
307
          bit_period_reg(7 downto 0) <= unsigned(data_i);
308
        elsif addr_i = "11" then
309
          bit_period_reg(13 downto 8) <= unsigned(data_i(5 downto 0));
310
        end if;
311
      end if;
312
    end if;
313
  end if;
314
end process baud_rate_registers;
315
 
316
sampling_period <= bit_period_reg(13 downto 4);
317
 
318
 
319
-- Receiver --------------------------------------------------------------------
320
 
321
baud_counter:
322
process(clk)
323
begin
324
  if clk'event and clk='1' then
325
    if reset='1' then
326
      tick_baud_ctr <= (others => '0');
327
    else
328
      if tick_baud_ctr=sampling_period then
329
        tick_baud_ctr <= (others => '0');
330
      else
331
        tick_baud_ctr <= tick_baud_ctr + 1;
332
      end if;
333
    end if;
334
  end if;
335
end process baud_counter;
336
 
337
tick_ctr_enable<= '1' when tick_baud_ctr=sampling_period else '0';
338
 
339
-- Register RxD at the bit sampling rate -- 16 times the baud rate. 
340
rxd_input_register:
341
process(clk)
342
begin
343
  if clk'event and clk='1' then
344
    if reset='1' then
345
      rxd_q <= '0';
346
    else
347
      if tick_ctr_enable='1' then
348
        rxd_q <= rxd;
349
      end if;
350
    end if;
351
  end if;
352
end process rxd_input_register;
353
 
354
-- We detect the start bit when...
355
start_bit_detected <= '1' when
356
      state="0000" and        -- ...we're waiting for the start bit...
357
      rxd_q='1' and rxd='0'   -- ...and we see RxD going 1-to-0
358
      else '0';
359
 
360
-- As soon as we detect the start bit we synchronize the bit sampler to 
361
-- the start bit's falling edge.
362
reset_tick_ctr <= '1' when start_bit_detected='1' else '0';
363
 
364
-- We have seen the end of the stop bit when...
365
stop_bit_sampled <= '1' when
366
      state="1010" and        -- ...we're in the stop bit period...
367
      tick_ctr="1011"         -- ...and we get the 11th sample in the bit period
368
      else '0';
369
 
370
-- Load the RX buffer with the shift register when...
371
load_rx_buffer <= '1' when
372
      stop_bit_sampled='1' and  -- ...we've just seen the end of the stop bit...
373
      sampled_bit='1'           -- ...and its value is correct (1)
374
      else '0';
375
 
376
-- Conversely, we detect a stop bit error when...   
377
stop_error <= '1' when
378
      stop_bit_sampled='1' and  -- ...we've just seen the end of the stop bit...
379
      sampled_bit='0'           -- ...and its value is incorrect (0)
380
      else '0';
381
 
382
-- tick_ctr is a counter 16 times faster than the baud rate that is aligned to 
383
-- the falling edge of the start bit, so that when tick_ctr=0 we're close to 
384
-- the start of a bit period.      
385
bit_sample_counter:
386
process(clk)
387
begin
388
  if clk'event and clk='1' then
389
    if reset='1' then
390
      tick_ctr <= "0000";
391
    else
392
      if tick_ctr_enable='1' then
393
        -- Restart counter when it reaches 15 OR when the falling edge
394
        -- of the start bit is detected; this is how we synchronize to the 
395
        -- start bit.
396
        if tick_ctr="1111" or reset_tick_ctr='1' then
397
          tick_ctr <= "0000";
398
        else
399
          tick_ctr <= tick_ctr + 1;
400
        end if;
401
      end if;
402
    end if;
403
  end if;
404
end process bit_sample_counter;
405
 
406
-- Main RX state machine: 
407
-- 0      -> waiting for start bit
408
-- 1      -> sampling start bit
409
-- 2..9   -> sampling data bit 0 to 7
410
-- 10     -> sampling stop bit
411
next_state <=
412
  -- Start sampling the start bit when we detect the falling edge
413
  "0001" when state="0000" and start_bit_detected='1' else
414
  -- Return to idle state if the start bit is not a clean 0
415
  "0000" when state="0001" and tick_ctr="1010" and sampled_bit='1' else
416
  -- Return to idle state at the end of the stop bit period
417
  "0000" when state="1010" and tick_ctr="1111" else
418
  -- Otherwise, proceed to next bit period at the end of each period
419
  state + 1 when tick_ctr="1111" and do_shift='1' else
420
  state;
421
 
422
rx_state_machine_register:
423
process(clk)
424
begin
425
  if clk'event and clk='1' then
426
    if reset='1' then
427
      state <= "0000";
428
    else
429
      if tick_ctr_enable='1' then
430
        state <= next_state;
431
      end if;
432
    end if;
433
  end if;
434
end process rx_state_machine_register;
435
 
436
-- Collect 3 RxD samples from the 3 central sampling periods of the bit period.
437
rx_sampler:
438
process(clk)
439
begin
440
  if clk'event and clk='1' then
441
    if reset='1' then
442
      samples <= "000";
443
    else
444
      if tick_ctr_enable='1' then
445
        if tick_ctr="0111" then
446
          samples(0) <= rxd;
447
        end if;
448
        if tick_ctr="1000" then
449
          samples(1) <= rxd;
450
        end if;
451
        if tick_ctr="1001" then
452
          samples(2) <= rxd;
453
        end if;
454
      end if;
455
    end if;
456
  end if;
457
end process rx_sampler;
458
 
459
-- Decide the value of the RxD bit by majority
460
with samples select
461
  sampled_bit <=  '0' when "000",
462
                  '0' when "001",
463
                  '0' when "010",
464
                  '1' when "011",
465
                  '0' when "100",
466
                  '1' when "101",
467
                  '1' when "110",
468
                  '1' when others;
469
 
470
rx_buffer_register:
471
process(clk)
472
begin
473
  if clk'event and clk='1' then
474
    if reset='1' then
475
      rx_buffer <= "00000000";
476
      set_rx_rdy_flag <= '0';
477
    else
478
      if tick_ctr_enable='1' and load_rx_buffer='1' and rx_rdy_flag='0' then
479
        rx_buffer <= rx_shift_reg(8 downto 1);
480
        set_rx_rdy_flag <= '1';
481
      else
482
        set_rx_rdy_flag <= '0';
483
      end if;
484
    end if;
485
  end if;
486
end process rx_buffer_register;
487
 
488
rx_flag:
489
process(clk)
490
begin
491
  if clk'event and clk='1' then
492
    if reset='1' then
493
      rx_rdy_flag <= '0';
494
    else
495
      if set_rx_rdy_flag='1' then
496
        rx_rdy_flag <= '1';
497
      else
498
        if read_rx = '1' then
499
          rx_rdy_flag <= '0';
500
        end if;
501
      end if;
502
    end if;
503
  end if;
504
end process rx_flag;
505
 
506
-- RX shifter control: shift in any state other than idle state (0)
507
do_shift <= state(0) or state(1) or state(2) or state(3);
508
 
509
rx_shift_register:
510
process(clk)
511
begin
512
  if clk'event and clk='1' then
513
    if reset='1' then
514
      rx_shift_reg <= "1111111111";
515
    else
516
      if tick_ctr_enable='1' then
517
        if tick_ctr="1010" and do_shift='1' then
518
          rx_shift_reg(9) <= sampled_bit;
519
          rx_shift_reg(8 downto 0) <= rx_shift_reg(9 downto 1);
520
        end if;
521
      end if;
522
    end if;
523
  end if;
524
end process rx_shift_register;
525
 
526
 
527
-- Transmitter -----------------------------------------------------------------
528
 
529
 
530
main_tx_process:
531
process(clk)
532
begin
533
if clk'event and clk='1' then
534
 
535
  if reset='1' then
536
    tx_data <= "10111111111";
537
    tx_busy <= '0';
538
    tx_irq <= '0';
539
    tx_ctr_bit <= "0000";
540
    tx_counter <= (others => '0');
541
  elsif load_tx_reg='1' and tx_busy='0' then
542
    tx_data <= "1"&data_i&"01";
543
    tx_busy <= '1';
544
  else
545
    if tx_busy='1' then
546
      if tx_counter = bit_period_reg then
547
        tx_counter <= (others => '0');
548
        tx_data(9 downto 0) <= tx_data(10 downto 1);
549
        tx_data(10) <= '1';
550
        if tx_ctr_bit = "1010" then
551
           tx_busy <= '0';
552
           tx_irq <= '1';
553
           tx_ctr_bit <= "0000";
554
        else
555
           tx_ctr_bit <= tx_ctr_bit + 1;
556
        end if;
557
      else
558
        tx_counter <= tx_counter + 1;
559
      end if;
560
    else
561
      tx_irq <= '0';
562
    end if;
563
  end if;
564
end if;
565
end process main_tx_process;
566
 
567
txd_o <= tx_data(0);
568
 
569
end hardwired;

powered by: WebSVN 2.1.0

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