async_8n1_rx.vhd 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. entity async_8n1_rx is
  5. port
  6. (
  7. clk : in std_logic;
  8. rst : in std_logic;
  9. en : in std_logic;
  10. read : in std_logic;
  11. data_in : in std_logic;
  12. data_available : out std_logic;
  13. frame_error : out std_logic;
  14. overflow_error : out std_logic;
  15. data_out : out unsigned (7 downto 0)
  16. );
  17. end entity;
  18. architecture beh of async_8n1_rx is
  19. -- RX shift register related
  20. signal i_reg_rx_data : unsigned(8 downto 0) := (others => '1');
  21. signal i_sig_data : unsigned(7 downto 0);
  22. signal i_sig_finished : std_logic;
  23. signal i_sig_clear_rx_data : std_logic;
  24. signal i_sig_frame_error : std_logic;
  25. -- Received data related
  26. signal i_reg_stored_data : unsigned(7 downto 0) := (others => '0');
  27. signal i_reg_available : std_logic := '0';
  28. signal i_reg_overflow : std_logic := '0';
  29. signal i_reg_frame_error : std_logic := '0';
  30. signal i_sig_storage_full : std_logic;
  31. signal i_sig_load_data : std_logic;
  32. signal i_sig_overflow_next : std_logic;
  33. signal i_sig_available_next : std_logic;
  34. begin
  35. -- Outputs
  36. data_available <= i_reg_available;
  37. frame_error <= i_reg_frame_error;
  38. overflow_error <= i_reg_overflow;
  39. data_out <= i_reg_stored_data;
  40. -- Concurrent statements
  41. -- RX shift register concurrent statements
  42. -- This is the data when a complete frame is received
  43. i_sig_data <= i_reg_rx_data(8 downto 1);
  44. -- When the start bit has propagated to bit 0 in shift register, frame is finished
  45. i_sig_finished <= not i_reg_rx_data(0);
  46. -- When frame is finished, reset shift register to only '1's
  47. i_sig_clear_rx_data <= i_sig_finished;
  48. -- If incoming stop bit is '0', we have a framing error
  49. i_sig_frame_error <= i_sig_finished and not data_in;
  50. -- Storage register concurrent statements
  51. -- The storage is considered full (next cycle) when data is available and no read is performed
  52. i_sig_storage_full <= i_reg_available and not read;
  53. -- Only load received byte if storage is not full
  54. i_sig_load_data <= i_sig_finished and not i_sig_storage_full;
  55. -- If there is a received byte, and the storage is full, and no read is performed, next cycle will
  56. -- cause an overflow and the latest received byte is discarded
  57. i_sig_overflow_next <= not read and (i_reg_overflow or (i_reg_available and i_sig_finished));
  58. -- If a byte just has been received, or the storage is full, then there will be data available next cycle
  59. i_sig_available_next <= i_sig_finished or i_sig_storage_full;
  60. -- Register
  61. process(clk) is
  62. begin
  63. if rising_edge(clk) then
  64. if en = '1' then
  65. -- i_reg_rx_data
  66. if i_sig_clear_rx_data = '0' then
  67. -- Take a step
  68. i_reg_rx_data <= data_in & i_sig_data;
  69. else
  70. -- Synchronously set to '1'
  71. i_reg_rx_data <= (others => '1');
  72. end if;
  73. -- i_reg_stored_data and i_reg_frame_error
  74. -- Update data store with received byte and frame status
  75. if i_sig_load_data = '1' then
  76. i_reg_stored_data <= i_sig_data;
  77. i_reg_frame_error <= i_sig_frame_error;
  78. else
  79. i_reg_stored_data <= i_reg_stored_data;
  80. i_reg_frame_error <= i_reg_frame_error;
  81. end if;
  82. -- i_reg_available
  83. -- Assume next evaluated value
  84. i_reg_available <= i_sig_available_next;
  85. -- i_reg_overflow
  86. -- Assume next evaluated value
  87. i_reg_overflow <= i_sig_overflow_next;
  88. else
  89. -- don't load registers (explicitly)
  90. i_reg_rx_data <= i_reg_rx_data;
  91. i_reg_stored_data <= i_reg_stored_data;
  92. i_reg_frame_error <= i_reg_frame_error;
  93. i_reg_available <= i_reg_available;
  94. i_reg_overflow <= i_reg_overflow;
  95. end if;
  96. end if;
  97. if rst = '1' then
  98. -- Async reset
  99. -- Only registers whose initial value matters
  100. i_reg_rx_data <= (others => '1');
  101. i_reg_available <= '0';
  102. i_reg_overflow <= '0';
  103. end if;
  104. end process;
  105. end architecture;