|
-------------------------------------------------------------------[01.11.2014]
|
|
-- Encoder
|
|
-------------------------------------------------------------------------------
|
|
-- V1.0 03.08.2014 Initial release
|
|
-- V2.0 01.11.2014 Added AUX
|
|
|
|
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
|
|
|
entity encoder is
|
|
port (
|
|
CLK : in STD_LOGIC;
|
|
DATA : in STD_LOGIC_VECTOR (7 downto 0);
|
|
C : in STD_LOGIC_VECTOR (1 downto 0);
|
|
VDE : in STD_LOGIC; -- Video Data Enable (VDE)
|
|
ADE : in STD_LOGIC := '0'; -- Audio/auxiliary Data Enable (ADE)
|
|
AUX : in STD_LOGIC_VECTOR (3 downto 0) := "0000";
|
|
ENCODED : out STD_LOGIC_VECTOR (9 downto 0));
|
|
end encoder;
|
|
|
|
architecture rtl of encoder is
|
|
signal xored : STD_LOGIC_VECTOR (8 downto 0);
|
|
signal xnored : STD_LOGIC_VECTOR (8 downto 0);
|
|
signal ones : STD_LOGIC_VECTOR (3 downto 0);
|
|
signal data_word : STD_LOGIC_VECTOR (8 downto 0);
|
|
signal data_word_inv : STD_LOGIC_VECTOR (8 downto 0);
|
|
signal data_word_disparity : STD_LOGIC_VECTOR (3 downto 0);
|
|
signal dc_bias : STD_LOGIC_VECTOR (3 downto 0) := (others => '0');
|
|
|
|
begin
|
|
-- Work our the two different encodings for the byte
|
|
xored(0) <= DATA(0);
|
|
xored(1) <= DATA(1) xor xored(0);
|
|
xored(2) <= DATA(2) xor xored(1);
|
|
xored(3) <= DATA(3) xor xored(2);
|
|
xored(4) <= DATA(4) xor xored(3);
|
|
xored(5) <= DATA(5) xor xored(4);
|
|
xored(6) <= DATA(6) xor xored(5);
|
|
xored(7) <= DATA(7) xor xored(6);
|
|
xored(8) <= '1';
|
|
|
|
xnored(0) <= DATA(0);
|
|
xnored(1) <= DATA(1) xnor xnored(0);
|
|
xnored(2) <= DATA(2) xnor xnored(1);
|
|
xnored(3) <= DATA(3) xnor xnored(2);
|
|
xnored(4) <= DATA(4) xnor xnored(3);
|
|
xnored(5) <= DATA(5) xnor xnored(4);
|
|
xnored(6) <= DATA(6) xnor xnored(5);
|
|
xnored(7) <= DATA(7) xnor xnored(6);
|
|
xnored(8) <= '0';
|
|
|
|
-- Count how many ones are set in data
|
|
ones <= "0000" + DATA(0) + DATA(1) + DATA(2) + DATA(3) + DATA(4) + DATA(5) + DATA(6) + DATA(7);
|
|
|
|
-- Decide which encoding to use
|
|
process (ones, DATA(0), xnored, xored)
|
|
begin
|
|
if ones > 4 or (ones = 4 and DATA(0) = '0') then
|
|
data_word <= xnored;
|
|
data_word_inv <= NOT(xnored);
|
|
else
|
|
data_word <= xored;
|
|
data_word_inv <= NOT(xored);
|
|
end if;
|
|
end process;
|
|
|
|
-- Work out the DC bias of the dataword;
|
|
data_word_disparity <= "1100" + data_word(0) + data_word(1) + data_word(2) + data_word(3) + data_word(4) + data_word(5) + data_word(6) + data_word(7);
|
|
|
|
-- Now work out what the output should be
|
|
process(CLK)
|
|
begin
|
|
if (CLK'event and CLK = '1') then
|
|
-- Video Data Coding
|
|
if VDE = '1' then
|
|
if dc_bias = "00000" or data_word_disparity = 0 then
|
|
-- dataword has no disparity
|
|
if data_word(8) = '1' then
|
|
ENCODED <= "01" & data_word(7 downto 0);
|
|
dc_bias <= dc_bias + data_word_disparity;
|
|
else
|
|
ENCODED <= "10" & data_word_inv(7 downto 0);
|
|
dc_bias <= dc_bias - data_word_disparity;
|
|
end if;
|
|
elsif (dc_bias(3) = '0' and data_word_disparity(3) = '0') or
|
|
(dc_bias(3) = '1' and data_word_disparity(3) = '1') then
|
|
ENCODED <= '1' & data_word(8) & data_word_inv(7 downto 0);
|
|
dc_bias <= dc_bias + data_word(8) - data_word_disparity;
|
|
else
|
|
ENCODED <= '0' & data_word;
|
|
dc_bias <= dc_bias - data_word_inv(8) + data_word_disparity;
|
|
end if;
|
|
-- TERC4 Coding
|
|
elsif ADE = '1' then
|
|
case AUX is
|
|
when "0000" => ENCODED <= "1010011100";
|
|
when "0001" => ENCODED <= "1001100011";
|
|
when "0010" => ENCODED <= "1011100100";
|
|
when "0011" => ENCODED <= "1011100010";
|
|
when "0100" => ENCODED <= "0101110001";
|
|
when "0101" => ENCODED <= "0100011110";
|
|
when "0110" => ENCODED <= "0110001110";
|
|
when "0111" => ENCODED <= "0100111100";
|
|
when "1000" => ENCODED <= "1011001100";
|
|
when "1001" => ENCODED <= "0100111001";
|
|
when "1010" => ENCODED <= "0110011100";
|
|
when "1011" => ENCODED <= "1011000110";
|
|
when "1100" => ENCODED <= "1010001110";
|
|
when "1101" => ENCODED <= "1001110001";
|
|
when "1110" => ENCODED <= "0101100011";
|
|
when others => ENCODED <= "1011000011";
|
|
end case;
|
|
else
|
|
-- In the control periods, all values have and have balanced bit count
|
|
case C is
|
|
when "00" => ENCODED <= "1101010100";
|
|
when "01" => ENCODED <= "0010101011";
|
|
when "10" => ENCODED <= "0101010100";
|
|
when others => ENCODED <= "1010101011";
|
|
end case;
|
|
dc_bias <= (others => '0');
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
end rtl;
|
|
|
|
--
|
|
-- process(CLK)
|
|
-- begin
|
|
-- if (CLK'event and CLK = '1') then
|
|
-- case encoding is
|
|
-- when "00"
|