915 lines
No EOL
44 KiB
VHDL
915 lines
No EOL
44 KiB
VHDL
----------------------------------------------------------------------------------
|
|
-- Engineer: Mike Field <hamster@snap.net.nz>
|
|
--
|
|
-- Create Date: 10.07.2015 20:06:49
|
|
-- Design Name:
|
|
-- Module Name: TMDS_decoder - Behavioral
|
|
--
|
|
-- Description: Decoding for TMDS encoded symbols. This performs the conversion
|
|
-- using a table lookup for simplicity
|
|
--
|
|
------------------------------------------------------------------------------------
|
|
-- The MIT License (MIT)
|
|
--
|
|
-- Copyright (c) 2015 Michael Alan Field
|
|
--
|
|
-- Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
-- of this software and associated documentation files (the "Software"), to deal
|
|
-- in the Software without restriction, including without limitation the rights
|
|
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
-- copies of the Software, and to permit persons to whom the Software is
|
|
-- furnished to do so, subject to the following conditions:
|
|
--
|
|
-- The above copyright notice and this permission notice shall be included in
|
|
-- all copies or substantial portions of the Software.
|
|
--
|
|
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
-- THE SOFTWARE.
|
|
------------------------------------------------------------------------------------
|
|
----- Want to say thanks? ----------------------------------------------------------
|
|
------------------------------------------------------------------------------------
|
|
--
|
|
-- This design has taken many hours - with the industry metric of 30 lines
|
|
-- per day, it is equivalent to about 6 months of work. I'm more than happy
|
|
-- to share it if you can make use of it. It is released under the MIT license,
|
|
-- so you are not under any onus to say thanks, but....
|
|
--
|
|
-- If you what to say thanks for this design how about trying PayPal?
|
|
-- Educational use - Enough for a beer
|
|
-- Hobbyist use - Enough for a pizza
|
|
-- Research use - Enough to take the family out to dinner
|
|
-- Commercial use - A weeks pay for an engineer (I wish!)
|
|
--
|
|
----------------------------------------------------------------------------------
|
|
|
|
library IEEE;
|
|
use IEEE.std_logic_1164.ALL;
|
|
use IEEE.NUMERIC_STD.ALL;
|
|
|
|
entity TMDS_decoder is
|
|
Port ( clk : in std_logic;
|
|
symbol : in std_logic_vector (9 downto 0);
|
|
invalid_symbol : out std_logic;
|
|
|
|
ctl_valid : out std_logic;
|
|
ctl : out std_logic_vector (1 downto 0);
|
|
|
|
terc4_valid : out std_logic;
|
|
terc4 : out std_logic_vector (3 downto 0);
|
|
|
|
guardband_valid : out std_logic;
|
|
guardband : out std_logic_vector (0 downto 0);
|
|
|
|
data_valid : out std_logic;
|
|
data : out std_logic_vector (7 downto 0));
|
|
end TMDS_decoder;
|
|
|
|
architecture Behavioral of TMDS_decoder is
|
|
signal lookup : std_logic_vector (8 downto 0);
|
|
begin
|
|
|
|
decode_ctl: process(clk)
|
|
begin
|
|
if rising_edge(clk) then
|
|
------------------
|
|
-- TMDS data bytes
|
|
if lookup(8) = '1' then
|
|
data_valid <= '1';
|
|
data <= lookup(7 downto 0);
|
|
else
|
|
data_valid <= '0';
|
|
end if;
|
|
|
|
------------
|
|
-- CTL codes
|
|
if lookup(8 downto 7) = "01" then
|
|
ctl_valid <= '1';
|
|
ctl <= lookup(1 downto 0);
|
|
else
|
|
ctl_valid <= '0';
|
|
end if;
|
|
|
|
------------------------------
|
|
-- All other codes are invalid
|
|
------------------------------
|
|
if lookup(8 downto 7) = "00" then
|
|
invalid_symbol <= '1';
|
|
else
|
|
invalid_symbol <= '0';
|
|
end if;
|
|
|
|
terc4_valid <= '0';
|
|
guardband_valid <= '0';
|
|
if lookup(8) = '1' then
|
|
-------------------------
|
|
-- Decode the guard bands
|
|
-------------------------
|
|
case lookup(7 downto 0) is
|
|
when x"55" => guardband_valid <= '1'; guardband <= "0";
|
|
when x"AB" => guardband_valid <= '1'; guardband <= "1";
|
|
when others => null;
|
|
end case;
|
|
|
|
-------------------------
|
|
-- Decode TERC4 data
|
|
-------------------------
|
|
case lookup(7 downto 0) is
|
|
when x"5B" => terc4_valid <= '1'; terc4 <= "0000";-- "1010011100" TERC4 0000
|
|
when x"5A" => terc4_valid <= '1'; terc4 <= "0001"; -- "1001100011" TERC4 0001
|
|
when x"D3" => terc4_valid <= '1'; terc4 <= "0010"; -- "1011100100" TERC4 0010
|
|
when x"D9" => terc4_valid <= '1'; terc4 <= "0011"; -- "1011100010" TERC4 0011
|
|
when x"93" => terc4_valid <= '1'; terc4 <= "0100"; -- "0101110001" TERC4 0100
|
|
when x"22" => terc4_valid <= '1'; terc4 <= "0101"; -- "0100011110" TERC4 0101
|
|
when x"92" => terc4_valid <= '1'; terc4 <= "0110"; -- "0110001110" TERC4 0110
|
|
when x"44" => terc4_valid <= '1'; terc4 <= "0111"; -- "0100111100" TERC4 0111
|
|
when x"AB" => terc4_valid <= '1'; terc4 <= "1000"; -- "1011001100" TERC4 1000 & HDMI Guard band (video C0 and Video C2)
|
|
when x"4B" => terc4_valid <= '1'; terc4 <= "1001"; -- "0100111001" TERC4 1001
|
|
when x"A4" => terc4_valid <= '1'; terc4 <= "1010"; -- "0110011100" TERC4 1010
|
|
when x"B5" => terc4_valid <= '1'; terc4 <= "1011"; -- "1011000110" TERC4 1011
|
|
when x"6D" => terc4_valid <= '1'; terc4 <= "1100"; -- "1010001110" TERC4 1100
|
|
when x"6C" => terc4_valid <= '1'; terc4 <= "1101"; -- "1001110001" TERC4 1101
|
|
when x"A5" => terc4_valid <= '1'; terc4 <= "1110"; -- "0101100011" TERC4 1110
|
|
when x"BA" => terc4_valid <= '1'; terc4 <= "1111"; -- "1011000011" TERC4 1111
|
|
when others => null;
|
|
end case;
|
|
end if;
|
|
|
|
-------------------------------------------------------------
|
|
-- Convert the incoming signal to something we can decode
|
|
--
|
|
-- For data symbols
|
|
-- ----------------
|
|
-- bit 8 - 1 -- Data word flage
|
|
-- bits 7:0 - xxxxxxxx - Data value
|
|
--
|
|
-- For CTL symbols
|
|
-- ---------------
|
|
-- bit 8 - 0 - Data word flage
|
|
-- bit 7 - 1 - CTL Indicator
|
|
-- bits 6:2 - X - Ignored
|
|
-- bits 1:0 - xx - CTL value
|
|
--
|
|
-- For Invalid symbols
|
|
-- -------------------
|
|
-- bit 8 - 0 - Data word flage
|
|
-- bit 7 - 0 - TERC4 Inicated
|
|
-- bit 6 - 0 - CTL Indicator
|
|
-- bit 5 - 0 - Guard band indicator
|
|
-- bits 4:0 - X - Unused
|
|
--
|
|
-------------------------------------------------------------
|
|
case symbol is
|
|
-- DVI-D Data sybmols
|
|
-- Data 00
|
|
when "1111111111" => lookup <= "100000000";
|
|
when "0100000000" => lookup <= "100000000";
|
|
-- Data 01
|
|
when "0111111111" => lookup <= "100000001";
|
|
when "1100000000" => lookup <= "100000001";
|
|
-- Data 02
|
|
when "0111111110" => lookup <= "100000010";
|
|
when "1100000001" => lookup <= "100000010";
|
|
-- Data 03
|
|
when "1111111110" => lookup <= "100000011";
|
|
when "0100000001" => lookup <= "100000011";
|
|
-- Data 04
|
|
when "0111111100" => lookup <= "100000100";
|
|
when "1100000011" => lookup <= "100000100";
|
|
-- Data 05
|
|
when "1111111100" => lookup <= "100000101";
|
|
when "0100000011" => lookup <= "100000101";
|
|
-- Data 06
|
|
when "1111111101" => lookup <= "100000110";
|
|
when "0100000010" => lookup <= "100000110";
|
|
-- Data 07
|
|
when "0111111101" => lookup <= "100000111";
|
|
when "1100000010" => lookup <= "100000111";
|
|
-- Data 08
|
|
when "0111111000" => lookup <= "100001000";
|
|
when "1100000111" => lookup <= "100001000";
|
|
-- Data 09
|
|
when "1111111000" => lookup <= "100001001";
|
|
when "0100000111" => lookup <= "100001001";
|
|
-- Data 0a
|
|
when "1111111001" => lookup <= "100001010";
|
|
when "0100000110" => lookup <= "100001010";
|
|
-- Data 0b
|
|
when "0111111001" => lookup <= "100001011";
|
|
when "1100000110" => lookup <= "100001011";
|
|
-- Data 0c
|
|
when "1111111011" => lookup <= "100001100";
|
|
when "0100000100" => lookup <= "100001100";
|
|
-- Data 0d
|
|
when "0111111011" => lookup <= "100001101";
|
|
when "1100000100" => lookup <= "100001101";
|
|
-- Data 0e
|
|
when "0111111010" => lookup <= "100001110";
|
|
when "1100000101" => lookup <= "100001110";
|
|
-- Data 0f
|
|
when "1111111010" => lookup <= "100001111";
|
|
when "0100000101" => lookup <= "100001111";
|
|
-- Data 10
|
|
when "0111110000" => lookup <= "100010000";
|
|
-- Data 11
|
|
when "0100001111" => lookup <= "100010001";
|
|
-- Data 12
|
|
when "1111110001" => lookup <= "100010010";
|
|
when "0100001110" => lookup <= "100010010";
|
|
-- Data 13
|
|
when "0111110001" => lookup <= "100010011";
|
|
when "1100001110" => lookup <= "100010011";
|
|
-- Data 14
|
|
when "1111110011" => lookup <= "100010100";
|
|
when "0100001100" => lookup <= "100010100";
|
|
-- Data 15
|
|
when "0111110011" => lookup <= "100010101";
|
|
when "1100001100" => lookup <= "100010101";
|
|
-- Data 16
|
|
when "0111110010" => lookup <= "100010110";
|
|
when "1100001101" => lookup <= "100010110";
|
|
-- Data 17
|
|
when "1111110010" => lookup <= "100010111";
|
|
when "0100001101" => lookup <= "100010111";
|
|
-- Data 18
|
|
when "1111110111" => lookup <= "100011000";
|
|
when "0100001000" => lookup <= "100011000";
|
|
-- Data 19
|
|
when "0111110111" => lookup <= "100011001";
|
|
when "1100001000" => lookup <= "100011001";
|
|
-- Data 1a
|
|
when "0111110110" => lookup <= "100011010";
|
|
when "1100001001" => lookup <= "100011010";
|
|
-- Data 1b
|
|
when "1111110110" => lookup <= "100011011";
|
|
when "0100001001" => lookup <= "100011011";
|
|
-- Data 1c
|
|
when "0111110100" => lookup <= "100011100";
|
|
when "1100001011" => lookup <= "100011100";
|
|
-- Data 1d
|
|
when "1111110100" => lookup <= "100011101";
|
|
when "0100001011" => lookup <= "100011101";
|
|
-- Data 1e
|
|
when "1001011111" => lookup <= "100011110";
|
|
when "0010100000" => lookup <= "100011110";
|
|
-- Data 1f
|
|
when "0001011111" => lookup <= "100011111";
|
|
when "1010100000" => lookup <= "100011111";
|
|
-- Data 20
|
|
when "1100011111" => lookup <= "100100000";
|
|
when "0111100000" => lookup <= "100100000";
|
|
-- Data 21
|
|
when "0100011111" => lookup <= "100100001";
|
|
when "1111100000" => lookup <= "100100001";
|
|
-- Data 22
|
|
when "0100011110" => lookup <= "100100010"; -- TERC4 0101
|
|
-- Data 23
|
|
when "0111100001" => lookup <= "100100011";
|
|
-- Data 24
|
|
when "1111100011" => lookup <= "100100100";
|
|
when "0100011100" => lookup <= "100100100";
|
|
-- Data 25
|
|
when "0111100011" => lookup <= "100100101";
|
|
when "1100011100" => lookup <= "100100101";
|
|
-- Data 26
|
|
when "0111100010" => lookup <= "100100110";
|
|
-- Data 27
|
|
when "0100011101" => lookup <= "100100111";
|
|
-- Data 28
|
|
when "1111100111" => lookup <= "100101000";
|
|
when "0100011000" => lookup <= "100101000";
|
|
-- Data 29
|
|
when "0111100111" => lookup <= "100101001";
|
|
when "1100011000" => lookup <= "100101001";
|
|
-- Data 2a
|
|
when "0111100110" => lookup <= "100101010";
|
|
when "1100011001" => lookup <= "100101010";
|
|
-- Data 2b
|
|
when "1111100110" => lookup <= "100101011";
|
|
when "0100011001" => lookup <= "100101011";
|
|
-- Data 2c
|
|
when "0111100100" => lookup <= "100101100";
|
|
-- Data 2d
|
|
when "0100011011" => lookup <= "100101101";
|
|
-- Data 2e
|
|
when "1001001111" => lookup <= "100101110";
|
|
when "0010110000" => lookup <= "100101110";
|
|
-- Data 2f
|
|
when "0001001111" => lookup <= "100101111";
|
|
when "1010110000" => lookup <= "100101111";
|
|
-- Data 30
|
|
when "1111101111" => lookup <= "100110000";
|
|
when "0100010000" => lookup <= "100110000";
|
|
-- Data 31
|
|
when "0111101111" => lookup <= "100110001";
|
|
when "1100010000" => lookup <= "100110001";
|
|
-- Data 32
|
|
when "0111101110" => lookup <= "100110010";
|
|
when "1100010001" => lookup <= "100110010";
|
|
-- Data 33
|
|
when "1111101110" => lookup <= "100110011";
|
|
when "0100010001" => lookup <= "100110011";
|
|
-- Data 34
|
|
when "0111101100" => lookup <= "100110100";
|
|
when "1100010011" => lookup <= "100110100";
|
|
-- Data 35
|
|
when "1111101100" => lookup <= "100110101";
|
|
when "0100010011" => lookup <= "100110101";
|
|
-- Data 36
|
|
when "1001000111" => lookup <= "100110110";
|
|
-- Data 37
|
|
when "1010111000" => lookup <= "100110111";
|
|
-- Data 38
|
|
when "0111101000" => lookup <= "100111000";
|
|
-- Data 39
|
|
when "0100010111" => lookup <= "100111001";
|
|
-- Data 3a
|
|
when "0010111100" => lookup <= "100111010";
|
|
when "1001000011" => lookup <= "100111010";
|
|
-- Data 3b
|
|
when "1010111100" => lookup <= "100111011";
|
|
when "0001000011" => lookup <= "100111011";
|
|
-- Data 3c
|
|
when "0010111110" => lookup <= "100111100";
|
|
when "1001000001" => lookup <= "100111100";
|
|
-- Data 3d
|
|
when "1010111110" => lookup <= "100111101";
|
|
when "0001000001" => lookup <= "100111101";
|
|
-- Data 3e
|
|
when "1010111111" => lookup <= "100111110";
|
|
when "0001000000" => lookup <= "100111110";
|
|
-- Data 3f
|
|
when "0010111111" => lookup <= "100111111";
|
|
when "1001000000" => lookup <= "100111111";
|
|
-- Data 40
|
|
when "1100111111" => lookup <= "101000000";
|
|
when "0111000000" => lookup <= "101000000";
|
|
-- Data 41
|
|
when "0100111111" => lookup <= "101000001";
|
|
when "1111000000" => lookup <= "101000001";
|
|
-- Data 42
|
|
when "0100111110" => lookup <= "101000010";
|
|
when "1111000001" => lookup <= "101000010";
|
|
-- Data 43
|
|
when "1100111110" => lookup <= "101000011";
|
|
when "0111000001" => lookup <= "101000011";
|
|
-- Data 44
|
|
when "0100111100" => lookup <= "101000100"; -- TERC4 0111
|
|
-- Data 45
|
|
when "0111000011" => lookup <= "101000101";
|
|
-- Data 46
|
|
when "1100111101" => lookup <= "101000110";
|
|
when "0111000010" => lookup <= "101000110";
|
|
-- Data 47
|
|
when "0100111101" => lookup <= "101000111";
|
|
when "1111000010" => lookup <= "101000111";
|
|
-- Data 48
|
|
when "1111000111" => lookup <= "101001000";
|
|
when "0100111000" => lookup <= "101001000";
|
|
-- Data 49
|
|
when "0111000111" => lookup <= "101001001";
|
|
when "1100111000" => lookup <= "101001001";
|
|
-- Data 4a
|
|
when "0111000110" => lookup <= "101001010";
|
|
-- Data 4b
|
|
when "0100111001" => lookup <= "101001011"; -- TERC4 1001
|
|
-- Data 4c
|
|
when "1100111011" => lookup <= "101001100";
|
|
when "0111000100" => lookup <= "101001100";
|
|
-- Data 4d
|
|
when "0100111011" => lookup <= "101001101";
|
|
when "1111000100" => lookup <= "101001101";
|
|
-- Data 4e
|
|
when "1001101111" => lookup <= "101001110";
|
|
when "0010010000" => lookup <= "101001110";
|
|
-- Data 4f
|
|
when "0001101111" => lookup <= "101001111";
|
|
when "1010010000" => lookup <= "101001111";
|
|
-- Data 50
|
|
when "1111001111" => lookup <= "101010000";
|
|
when "0100110000" => lookup <= "101010000";
|
|
-- Data 51
|
|
when "0111001111" => lookup <= "101010001";
|
|
when "1100110000" => lookup <= "101010001";
|
|
-- Data 52
|
|
when "0111001110" => lookup <= "101010010";
|
|
when "1100110001" => lookup <= "101010010";
|
|
-- Data 53
|
|
when "1111001110" => lookup <= "101010011";
|
|
when "0100110001" => lookup <= "101010011";
|
|
-- Data 54
|
|
when "0111001100" => lookup <= "101010100";
|
|
-- Data 55
|
|
when "0100110011" => lookup <= "101010101"; -- HDMI Guard band (video C1, data C1 & C2)
|
|
-- Data 56
|
|
when "1001100111" => lookup <= "101010110";
|
|
when "0010011000" => lookup <= "101010110";
|
|
-- Data 57
|
|
when "0001100111" => lookup <= "101010111";
|
|
when "1010011000" => lookup <= "101010111";
|
|
-- Data 58
|
|
when "1100110111" => lookup <= "101011000";
|
|
when "0111001000" => lookup <= "101011000";
|
|
-- Data 59
|
|
when "0100110111" => lookup <= "101011001";
|
|
when "1111001000" => lookup <= "101011001";
|
|
-- Data 5a
|
|
when "1001100011" => lookup <= "101011010"; -- TERC4 0001
|
|
-- Data 5b
|
|
when "1010011100" => lookup <= "101011011"; -- TERC4 0000
|
|
-- Data 5c
|
|
when "0010011110" => lookup <= "101011100";
|
|
when "1001100001" => lookup <= "101011100";
|
|
-- Data 5d
|
|
when "1010011110" => lookup <= "101011101";
|
|
when "0001100001" => lookup <= "101011101";
|
|
-- Data 5e
|
|
when "1010011111" => lookup <= "101011110";
|
|
when "0001100000" => lookup <= "101011110";
|
|
-- Data 5f
|
|
when "0010011111" => lookup <= "101011111";
|
|
when "1001100000" => lookup <= "101011111";
|
|
-- Data 60
|
|
when "1111011111" => lookup <= "101100000";
|
|
when "0100100000" => lookup <= "101100000";
|
|
-- Data 61
|
|
when "0111011111" => lookup <= "101100001";
|
|
when "1100100000" => lookup <= "101100001";
|
|
-- Data 62
|
|
when "0111011110" => lookup <= "101100010";
|
|
when "1100100001" => lookup <= "101100010";
|
|
-- Data 63
|
|
when "1111011110" => lookup <= "101100011";
|
|
when "0100100001" => lookup <= "101100011";
|
|
-- Data 64
|
|
when "0111011100" => lookup <= "101100100";
|
|
when "1100100011" => lookup <= "101100100";
|
|
-- Data 65
|
|
when "1111011100" => lookup <= "101100101";
|
|
when "0100100011" => lookup <= "101100101";
|
|
-- Data 66
|
|
when "1001110111" => lookup <= "101100110";
|
|
when "0010001000" => lookup <= "101100110";
|
|
-- Data 67
|
|
when "0001110111" => lookup <= "101100111";
|
|
when "1010001000" => lookup <= "101100111";
|
|
-- Data 68
|
|
when "0111011000" => lookup <= "101101000";
|
|
-- Data 69
|
|
when "0100100111" => lookup <= "101101001";
|
|
-- Data 6a
|
|
when "1001110011" => lookup <= "101101010";
|
|
when "0010001100" => lookup <= "101101010";
|
|
-- Data 6b
|
|
when "0001110011" => lookup <= "101101011";
|
|
when "1010001100" => lookup <= "101101011";
|
|
-- Data 6c
|
|
when "1001110001" => lookup <= "101101100"; -- TERC4 1101
|
|
-- Data 6d
|
|
when "1010001110" => lookup <= "101101101"; -- TERC4 1100
|
|
-- Data 6e
|
|
when "1010001111" => lookup <= "101101110";
|
|
when "0001110000" => lookup <= "101101110";
|
|
-- Data 6f
|
|
when "0010001111" => lookup <= "101101111";
|
|
when "1001110000" => lookup <= "101101111";
|
|
-- Data 70
|
|
when "1100101111" => lookup <= "101110000";
|
|
when "0111010000" => lookup <= "101110000";
|
|
-- Data 71
|
|
when "0100101111" => lookup <= "101110001";
|
|
when "1111010000" => lookup <= "101110001";
|
|
-- Data 72
|
|
when "1001111011" => lookup <= "101110010";
|
|
when "0010000100" => lookup <= "101110010";
|
|
-- Data 73
|
|
when "0001111011" => lookup <= "101110011";
|
|
when "1010000100" => lookup <= "101110011";
|
|
-- Data 74
|
|
when "1001111001" => lookup <= "101110100";
|
|
when "0010000110" => lookup <= "101110100";
|
|
-- Data 75
|
|
when "0001111001" => lookup <= "101110101";
|
|
when "1010000110" => lookup <= "101110101";
|
|
-- Data 76
|
|
when "1010000111" => lookup <= "101110110";
|
|
-- Data 77
|
|
when "1001111000" => lookup <= "101110111";
|
|
-- Data 78
|
|
when "1001111101" => lookup <= "101111000";
|
|
when "0010000010" => lookup <= "101111000";
|
|
-- Data 79
|
|
when "0001111101" => lookup <= "101111001";
|
|
when "1010000010" => lookup <= "101111001";
|
|
-- Data 7a
|
|
when "0001111100" => lookup <= "101111010";
|
|
when "1010000011" => lookup <= "101111010";
|
|
-- Data 7b
|
|
when "1001111100" => lookup <= "101111011";
|
|
when "0010000011" => lookup <= "101111011";
|
|
-- Data 7c
|
|
when "0001111110" => lookup <= "101111100";
|
|
when "1010000001" => lookup <= "101111100";
|
|
-- Data 7d
|
|
when "1001111110" => lookup <= "101111101";
|
|
when "0010000001" => lookup <= "101111101";
|
|
-- Data 7e
|
|
when "1001111111" => lookup <= "101111110";
|
|
when "0010000000" => lookup <= "101111110";
|
|
-- Data 7f
|
|
when "0001111111" => lookup <= "101111111";
|
|
when "1010000000" => lookup <= "101111111";
|
|
-- Data 80
|
|
when "1101111111" => lookup <= "110000000";
|
|
when "0110000000" => lookup <= "110000000";
|
|
-- Data 81
|
|
when "0101111111" => lookup <= "110000001";
|
|
when "1110000000" => lookup <= "110000001";
|
|
-- Data 82
|
|
when "0101111110" => lookup <= "110000010";
|
|
when "1110000001" => lookup <= "110000010";
|
|
-- Data 83
|
|
when "1101111110" => lookup <= "110000011";
|
|
when "0110000001" => lookup <= "110000011";
|
|
-- Data 84
|
|
when "0101111100" => lookup <= "110000100";
|
|
when "1110000011" => lookup <= "110000100";
|
|
-- Data 85
|
|
when "1101111100" => lookup <= "110000101";
|
|
when "0110000011" => lookup <= "110000101";
|
|
-- Data 86
|
|
when "1101111101" => lookup <= "110000110";
|
|
when "0110000010" => lookup <= "110000110";
|
|
-- Data 87
|
|
when "0101111101" => lookup <= "110000111";
|
|
when "1110000010" => lookup <= "110000111";
|
|
-- Data 88
|
|
when "0101111000" => lookup <= "110001000";
|
|
-- Data 89
|
|
when "0110000111" => lookup <= "110001001";
|
|
-- Data 8a
|
|
when "1101111001" => lookup <= "110001010";
|
|
when "0110000110" => lookup <= "110001010";
|
|
-- Data 8b
|
|
when "0101111001" => lookup <= "110001011";
|
|
when "1110000110" => lookup <= "110001011";
|
|
-- Data 8c
|
|
when "1101111011" => lookup <= "110001100";
|
|
when "0110000100" => lookup <= "110001100";
|
|
-- Data 8d
|
|
when "0101111011" => lookup <= "110001101";
|
|
when "1110000100" => lookup <= "110001101";
|
|
-- Data 8e
|
|
when "1000101111" => lookup <= "110001110";
|
|
when "0011010000" => lookup <= "110001110";
|
|
-- Data 8f
|
|
when "0000101111" => lookup <= "110001111";
|
|
when "1011010000" => lookup <= "110001111";
|
|
-- Data 90
|
|
when "1110001111" => lookup <= "110010000";
|
|
when "0101110000" => lookup <= "110010000";
|
|
-- Data 91
|
|
when "0110001111" => lookup <= "110010001";
|
|
when "1101110000" => lookup <= "110010001";
|
|
-- Data 92
|
|
when "0110001110" => lookup <= "110010010"; -- TERC4 0110
|
|
-- Data 93
|
|
when "0101110001" => lookup <= "110010011"; -- TERC4 0100
|
|
-- Data 94
|
|
when "1101110011" => lookup <= "110010100";
|
|
when "0110001100" => lookup <= "110010100";
|
|
-- Data 95
|
|
when "0101110011" => lookup <= "110010101";
|
|
when "1110001100" => lookup <= "110010101";
|
|
-- Data 96
|
|
when "1000100111" => lookup <= "110010110";
|
|
-- Data 97
|
|
when "1011011000" => lookup <= "110010111";
|
|
-- Data 98
|
|
when "1101110111" => lookup <= "110011000";
|
|
when "0110001000" => lookup <= "110011000";
|
|
-- Data 99
|
|
when "0101110111" => lookup <= "110011001";
|
|
when "1110001000" => lookup <= "110011001";
|
|
-- Data 9a
|
|
when "0011011100" => lookup <= "110011010";
|
|
when "1000100011" => lookup <= "110011010";
|
|
-- Data 9b
|
|
when "1011011100" => lookup <= "110011011";
|
|
when "0000100011" => lookup <= "110011011";
|
|
-- Data 9c
|
|
when "0011011110" => lookup <= "110011100";
|
|
when "1000100001" => lookup <= "110011100";
|
|
-- Data 9d
|
|
when "1011011110" => lookup <= "110011101";
|
|
when "0000100001" => lookup <= "110011101";
|
|
-- Data 9e
|
|
when "1011011111" => lookup <= "110011110";
|
|
when "0000100000" => lookup <= "110011110";
|
|
-- Data 9f
|
|
when "0011011111" => lookup <= "110011111";
|
|
when "1000100000" => lookup <= "110011111";
|
|
-- Data a0
|
|
when "1110011111" => lookup <= "110100000";
|
|
when "0101100000" => lookup <= "110100000";
|
|
-- Data a1
|
|
when "0110011111" => lookup <= "110100001";
|
|
when "1101100000" => lookup <= "110100001";
|
|
-- Data a2
|
|
when "0110011110" => lookup <= "110100010";
|
|
when "1101100001" => lookup <= "110100010";
|
|
-- Data a3
|
|
when "1110011110" => lookup <= "110100011";
|
|
when "0101100001" => lookup <= "110100011";
|
|
-- Data a4
|
|
when "0110011100" => lookup <= "110100100"; -- TERC4 1010
|
|
-- Data a5
|
|
when "0101100011" => lookup <= "110100101"; -- TERC4 1110
|
|
-- Data a6
|
|
when "1000110111" => lookup <= "110100110";
|
|
when "0011001000" => lookup <= "110100110";
|
|
-- Data a7
|
|
when "0000110111" => lookup <= "110100111";
|
|
when "1011001000" => lookup <= "110100111";
|
|
-- Data a8
|
|
when "1101100111" => lookup <= "110101000";
|
|
when "0110011000" => lookup <= "110101000";
|
|
-- Data a9
|
|
when "0101100111" => lookup <= "110101001";
|
|
when "1110011000" => lookup <= "110101001";
|
|
-- Data aa
|
|
when "1000110011" => lookup <= "110101010";
|
|
-- Data ab
|
|
when "1011001100" => lookup <= "110101011"; -- TERC4 1000 & HDMI Guard band (video C0 and Video C2)
|
|
-- Data ac
|
|
when "0011001110" => lookup <= "110101100";
|
|
when "1000110001" => lookup <= "110101100";
|
|
-- Data ad
|
|
when "1011001110" => lookup <= "110101101";
|
|
when "0000110001" => lookup <= "110101101";
|
|
-- Data ae
|
|
when "1011001111" => lookup <= "110101110";
|
|
when "0000110000" => lookup <= "110101110";
|
|
-- Data af
|
|
when "0011001111" => lookup <= "110101111";
|
|
when "1000110000" => lookup <= "110101111";
|
|
-- Data b0
|
|
when "1101101111" => lookup <= "110110000";
|
|
when "0110010000" => lookup <= "110110000";
|
|
-- Data b1
|
|
when "0101101111" => lookup <= "110110001";
|
|
when "1110010000" => lookup <= "110110001";
|
|
-- Data b2
|
|
when "1000111011" => lookup <= "110110010";
|
|
when "0011000100" => lookup <= "110110010";
|
|
-- Data b3
|
|
when "0000111011" => lookup <= "110110011";
|
|
when "1011000100" => lookup <= "110110011";
|
|
-- Data b4
|
|
when "1000111001" => lookup <= "110110100";
|
|
-- Data b5
|
|
when "1011000110" => lookup <= "110110101"; -- TERC4 1011
|
|
-- Data b6
|
|
when "1011000111" => lookup <= "110110110";
|
|
when "0000111000" => lookup <= "110110110";
|
|
-- Data b7
|
|
when "0011000111" => lookup <= "110110111";
|
|
when "1000111000" => lookup <= "110110111";
|
|
-- Data b8
|
|
when "1000111101" => lookup <= "110111000";
|
|
when "0011000010" => lookup <= "110111000";
|
|
-- Data b9
|
|
when "0000111101" => lookup <= "110111001";
|
|
when "1011000010" => lookup <= "110111001";
|
|
-- Data ba
|
|
when "1011000011" => lookup <= "110111010"; -- TERC4 1111
|
|
-- Data bb
|
|
when "1000111100" => lookup <= "110111011";
|
|
-- Data bc
|
|
when "0000111110" => lookup <= "110111100";
|
|
when "1011000001" => lookup <= "110111100";
|
|
-- Data bd
|
|
when "1000111110" => lookup <= "110111101";
|
|
when "0011000001" => lookup <= "110111101";
|
|
-- Data be
|
|
when "1000111111" => lookup <= "110111110";
|
|
when "0011000000" => lookup <= "110111110";
|
|
-- Data bf
|
|
when "0000111111" => lookup <= "110111111";
|
|
when "1011000000" => lookup <= "110111111";
|
|
-- Data c0
|
|
when "1110111111" => lookup <= "111000000";
|
|
when "0101000000" => lookup <= "111000000";
|
|
-- Data c1
|
|
when "0110111111" => lookup <= "111000001";
|
|
when "1101000000" => lookup <= "111000001";
|
|
-- Data c2
|
|
when "0110111110" => lookup <= "111000010";
|
|
when "1101000001" => lookup <= "111000010";
|
|
-- Data c3
|
|
when "1110111110" => lookup <= "111000011";
|
|
when "0101000001" => lookup <= "111000011";
|
|
-- Data c4
|
|
when "0110111100" => lookup <= "111000100";
|
|
when "1101000011" => lookup <= "111000100";
|
|
-- Data c5
|
|
when "1110111100" => lookup <= "111000101";
|
|
when "0101000011" => lookup <= "111000101";
|
|
-- Data c6
|
|
when "1000010111" => lookup <= "111000110";
|
|
-- Data c7
|
|
when "1011101000" => lookup <= "111000111";
|
|
-- Data c8
|
|
when "0110111000" => lookup <= "111001000";
|
|
-- Data c9
|
|
when "0101000111" => lookup <= "111001001";
|
|
-- Data ca
|
|
when "0011101100" => lookup <= "111001010";
|
|
when "1000010011" => lookup <= "111001010";
|
|
-- Data cb
|
|
when "1011101100" => lookup <= "111001011";
|
|
when "0000010011" => lookup <= "111001011";
|
|
-- Data cc
|
|
when "0011101110" => lookup <= "111001100";
|
|
when "1000010001" => lookup <= "111001100";
|
|
-- Data cd
|
|
when "1011101110" => lookup <= "111001101";
|
|
when "0000010001" => lookup <= "111001101";
|
|
-- Data ce
|
|
when "1011101111" => lookup <= "111001110";
|
|
when "0000010000" => lookup <= "111001110";
|
|
-- Data cf
|
|
when "0011101111" => lookup <= "111001111";
|
|
when "1000010000" => lookup <= "111001111";
|
|
-- Data d0
|
|
when "1101001111" => lookup <= "111010000";
|
|
when "0110110000" => lookup <= "111010000";
|
|
-- Data d1
|
|
when "0101001111" => lookup <= "111010001";
|
|
when "1110110000" => lookup <= "111010001";
|
|
-- Data d2
|
|
when "1000011011" => lookup <= "111010010";
|
|
-- Data d3
|
|
when "1011100100" => lookup <= "111010011"; -- TERC4 0010
|
|
-- Data d4
|
|
when "0011100110" => lookup <= "111010100";
|
|
when "1000011001" => lookup <= "111010100";
|
|
-- Data d5
|
|
when "1011100110" => lookup <= "111010101";
|
|
when "0000011001" => lookup <= "111010101";
|
|
-- Data d6
|
|
when "1011100111" => lookup <= "111010110";
|
|
when "0000011000" => lookup <= "111010110";
|
|
-- Data d7
|
|
when "0011100111" => lookup <= "111010111";
|
|
when "1000011000" => lookup <= "111010111";
|
|
-- Data d8
|
|
when "1000011101" => lookup <= "111011000";
|
|
-- Data d9
|
|
when "1011100010" => lookup <= "111011001"; -- TERC4 0011
|
|
-- Data da
|
|
when "1011100011" => lookup <= "111011010";
|
|
when "0000011100" => lookup <= "111011010";
|
|
-- Data db
|
|
when "0011100011" => lookup <= "111011011";
|
|
when "1000011100" => lookup <= "111011011";
|
|
-- Data dc
|
|
when "1011100001" => lookup <= "111011100";
|
|
-- Data dd
|
|
when "1000011110" => lookup <= "111011101";
|
|
-- Data de
|
|
when "1000011111" => lookup <= "111011110";
|
|
when "0011100000" => lookup <= "111011110";
|
|
-- Data df
|
|
when "0000011111" => lookup <= "111011111";
|
|
when "1011100000" => lookup <= "111011111";
|
|
-- Data e0
|
|
when "1101011111" => lookup <= "111100000";
|
|
when "0110100000" => lookup <= "111100000";
|
|
-- Data e1
|
|
when "0101011111" => lookup <= "111100001";
|
|
when "1110100000" => lookup <= "111100001";
|
|
-- Data e2
|
|
when "0011110100" => lookup <= "111100010";
|
|
when "1000001011" => lookup <= "111100010";
|
|
-- Data e3
|
|
when "1011110100" => lookup <= "111100011";
|
|
when "0000001011" => lookup <= "111100011";
|
|
-- Data e4
|
|
when "0011110110" => lookup <= "111100100";
|
|
when "1000001001" => lookup <= "111100100";
|
|
-- Data e5
|
|
when "1011110110" => lookup <= "111100101";
|
|
when "0000001001" => lookup <= "111100101";
|
|
-- Data e6
|
|
when "1011110111" => lookup <= "111100110";
|
|
when "0000001000" => lookup <= "111100110";
|
|
-- Data e7
|
|
when "0011110111" => lookup <= "111100111";
|
|
when "1000001000" => lookup <= "111100111";
|
|
-- Data e8
|
|
when "0011110010" => lookup <= "111101000";
|
|
when "1000001101" => lookup <= "111101000";
|
|
-- Data e9
|
|
when "1011110010" => lookup <= "111101001";
|
|
when "0000001101" => lookup <= "111101001";
|
|
-- Data ea
|
|
when "1011110011" => lookup <= "111101010";
|
|
when "0000001100" => lookup <= "111101010";
|
|
-- Data eb
|
|
when "0011110011" => lookup <= "111101011";
|
|
when "1000001100" => lookup <= "111101011";
|
|
-- Data ec
|
|
when "1011110001" => lookup <= "111101100";
|
|
when "0000001110" => lookup <= "111101100";
|
|
-- Data ed
|
|
when "0011110001" => lookup <= "111101101";
|
|
when "1000001110" => lookup <= "111101101";
|
|
-- Data ee
|
|
when "1000001111" => lookup <= "111101110";
|
|
-- Data ef
|
|
when "1011110000" => lookup <= "111101111";
|
|
-- Data f0
|
|
when "0011111010" => lookup <= "111110000";
|
|
when "1000000101" => lookup <= "111110000";
|
|
-- Data f1
|
|
when "1011111010" => lookup <= "111110001";
|
|
when "0000000101" => lookup <= "111110001";
|
|
-- Data f2
|
|
when "1011111011" => lookup <= "111110010";
|
|
when "0000000100" => lookup <= "111110010";
|
|
-- Data f3
|
|
when "0011111011" => lookup <= "111110011";
|
|
when "1000000100" => lookup <= "111110011";
|
|
-- Data f4
|
|
when "1011111001" => lookup <= "111110100";
|
|
when "0000000110" => lookup <= "111110100";
|
|
-- Data f5
|
|
when "0011111001" => lookup <= "111110101";
|
|
when "1000000110" => lookup <= "111110101";
|
|
-- Data f6
|
|
when "0011111000" => lookup <= "111110110";
|
|
when "1000000111" => lookup <= "111110110";
|
|
-- Data f7
|
|
when "1011111000" => lookup <= "111110111";
|
|
when "0000000111" => lookup <= "111110111";
|
|
-- Data f8
|
|
when "1011111101" => lookup <= "111111000";
|
|
when "0000000010" => lookup <= "111111000";
|
|
-- Data f9
|
|
when "0011111101" => lookup <= "111111001";
|
|
when "1000000010" => lookup <= "111111001";
|
|
-- Data fa
|
|
when "0011111100" => lookup <= "111111010";
|
|
when "1000000011" => lookup <= "111111010";
|
|
-- Data fb
|
|
when "1011111100" => lookup <= "111111011";
|
|
when "0000000011" => lookup <= "111111011";
|
|
-- Data fc
|
|
when "0011111110" => lookup <= "111111100";
|
|
when "1000000001" => lookup <= "111111100";
|
|
-- Data fd
|
|
when "1011111110" => lookup <= "111111101";
|
|
when "0000000001" => lookup <= "111111101";
|
|
-- Data fe
|
|
when "1011111111" => lookup <= "111111110";
|
|
when "0000000000" => lookup <= "111111110";
|
|
-- Data ff
|
|
when "0011111111" => lookup <= "111111111";
|
|
when "1000000000" => lookup <= "111111111";
|
|
|
|
-- DVI-D CTL symbols
|
|
when "0010101011" => lookup <= "01" & "00000" & "01"; -- CTL1
|
|
when "0101010100" => lookup <= "01" & "00000" & "10"; -- CTL2
|
|
when "1010101011" => lookup <= "01" & "00000" & "11"; -- CTL3
|
|
when "1101010100" => lookup <= "01" & "00000" & "00"; -- CTL0
|
|
|
|
-- Invalid symbols
|
|
when others => lookup <= "0000" & "00000";
|
|
end case;
|
|
end if;
|
|
end process;
|
|
end Behavioral;
|
|
|
|
-- For Guard band and TERC4 decoding (to be done later!)
|
|
-- when x"55" => -- "0100110011" HDMI Guard band (video C1, data C1 & C2)
|
|
-- when x"5B" => -- "1010011100" TERC4 0000
|
|
-- when x"5A" => -- "1001100011" TERC4 0001
|
|
-- when x"D3" => -- "1011100100" TERC4 0010
|
|
-- when x"D9" => -- "1011100010" TERC4 0011
|
|
-- when x"93" => -- "0101110001" TERC4 0100
|
|
-- when x"22" => -- "0100011110" TERC4 0101
|
|
-- when x"92" => -- "0110001110" TERC4 0110
|
|
-- when x"44" => -- "0100111100" TERC4 0111
|
|
-- when x"AB" => -- "1011001100" TERC4 1000 & HDMI Guard band (video C0 and Video C2)
|
|
-- when x"4B" => -- "0100111001" TERC4 1001
|
|
-- when x"A4" => -- "0110011100" TERC4 1010
|
|
-- when x"B5" => -- "1011000110" TERC4 1011
|
|
-- when x"6D" => -- "1010001110" TERC4 1100
|
|
-- when x"6C" => -- "1001110001" TERC4 1101
|
|
-- when x"A5" => -- "0101100011" TERC4 1110
|
|
-- when x"BA" => -- "1011000011" TERC4 1111 |