library ieee; use ieee.std_logic_1164.all; use ieee.numeric_bit.all; use IEEE.STD_LOGIC_ARITH.all; use ieee.std_logic_unsigned.all; ENTITY TENBASET_TxD IS PORT ( clk20 : IN std_logic; Ethernet_TDp : OUT bit; Ethernet_TDm : OUT bit); END ENTITY TENBASET_TxD; ARCHITECTURE translated OF TENBASET_TxD IS -- "Physical Address" - put the address of the PC you want to send to CONSTANT PhysicalAddress_1 : bit_vector(7 DOWNTO 0) := "00000000"; CONSTANT PhysicalAddress_2 : bit_vector(7 DOWNTO 0) := "00000111"; CONSTANT PhysicalAddress_3 : bit_vector(7 DOWNTO 0) := "10010101"; CONSTANT PhysicalAddress_4 : bit_vector(7 DOWNTO 0) := "00001011"; CONSTANT PhysicalAddress_5 : bit_vector(7 DOWNTO 0) := "11111011"; CONSTANT PhysicalAddress_6 : bit_vector(7 DOWNTO 0) := "10101111"; --//////////////////////////////////////////////////////////////////// -- sends a packet roughly every second SIGNAL counter : bit_vector(23 DOWNTO 0):="000000000000000000000000"; SIGNAL StartSending : bit; --//////////////////////////////////////////////////////////////////// -- we send a UDP packet, 18 bytes payload SIGNAL rdaddress : bit_vector(6 DOWNTO 0); SIGNAL pkt_data : bit_vector(7 DOWNTO 0); --//////////////////////////////////////////////////////////////////// -- and finally the 10BASE-T's magic SIGNAL ShiftCount : bit_vector(3 DOWNTO 0); SIGNAL SendingPacket : bit; SIGNAL temp_xhdl3 : bit_vector(3 DOWNTO 0); SIGNAL readram : bit; SIGNAL temp_xhdl4 : bit_vector(6 DOWNTO 0); SIGNAL ShiftData : bit_vector(7 DOWNTO 0); SIGNAL temp_xhdl5 : bit_vector(7 DOWNTO 0); SIGNAL CRC : bit_vector(31 DOWNTO 0); SIGNAL CRCflush : bit; SIGNAL CRCinit : bit; SIGNAL temp_xhdl6 : bit; SIGNAL CRCinput : bit; SIGNAL temp_xhdl7 : bit_vector(31 DOWNTO 0); SIGNAL LinkPulseCount : bit_vector(17 DOWNTO 0); SIGNAL temp_xhdl8 : bit_vector(17 DOWNTO 0); SIGNAL LinkPulse : bit; -- TP_IDL, shift-register and manchester encoder SIGNAL SendingPacketData : bit; SIGNAL idlecount : bit_vector(2 DOWNTO 0); SIGNAL temp_xhdl9 : bit; SIGNAL dataout : bit; SIGNAL qo : bit; SIGNAL temp_xhdl10 : bit; SIGNAL qoe : bit; SIGNAL temp_xhdl11 : bit; SIGNAL temp_xhdl12 : bit; SIGNAL Ethernet_TDp_xhdl1 : bit; SIGNAL Ethernet_TDm_xhdl2 : bit; BEGIN Ethernet_TDp <= Ethernet_TDp_xhdl1; Ethernet_TDm <= Ethernet_TDm_xhdl2; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN counter<= counter + "000000000000000000000001"; END IF; END PROCESS; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN StartSending <= and_br(counter); END IF; END PROCESS; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN CASE rdaddress IS -- Ethernet preamble WHEN "0000000" => pkt_data <= "01010101"; WHEN "0000001" => pkt_data <= "01010101"; WHEN "0000010" => pkt_data <= "01010101"; WHEN "0000011" => pkt_data <= "01010101"; WHEN "0000100" => pkt_data <= "01010101"; WHEN "0000101" => pkt_data <= "01010101"; WHEN "0000110" => pkt_data <= "01010101"; WHEN "0000111" => pkt_data <= "11010101"; -- Ethernet header WHEN "0001000" => pkt_data <= PhysicalAddress_1; WHEN "0001001" => pkt_data <= PhysicalAddress_2; WHEN "0001010" => pkt_data <= PhysicalAddress_3; WHEN "0001011" => pkt_data <= PhysicalAddress_4; WHEN "0001100" => pkt_data <= PhysicalAddress_5; WHEN "0001101" => pkt_data <= PhysicalAddress_6; WHEN "0001110" => pkt_data <= "00000000"; WHEN "0001111" => pkt_data <= "00010010"; WHEN "0010000" => pkt_data <= "00110100"; WHEN "0010001" => pkt_data <= "01010110"; WHEN "0010010" => pkt_data <= "01111000"; WHEN "0010011" => pkt_data <= "10010000"; -- IP header WHEN "0010100" => pkt_data <= "00001000"; WHEN "0010101" => pkt_data <= "00000000"; WHEN "0010110" => pkt_data <= "01000101"; WHEN "0010111" => pkt_data <= "00000000"; WHEN "0011000" => pkt_data <= "00000000"; WHEN "0011001" => pkt_data <= "00101110"; WHEN "0011010" => pkt_data <= "00000000"; WHEN "0011011" => pkt_data <= "00000000"; WHEN "0011100" => pkt_data <= "00000000"; WHEN "0011101" => pkt_data <= "00000000"; WHEN "0011110" => pkt_data <= "10000000"; WHEN "0011111" => pkt_data <= "00010001"; WHEN "0100000" => pkt_data <= "10000110"; WHEN "0100001" => pkt_data <= "01101111"; WHEN "0100010" => pkt_data <= "11000000"; WHEN "0100011" => pkt_data <= "10101000"; WHEN "0100100" => pkt_data <= "00000000"; WHEN "0100101" => pkt_data <= "00000001"; WHEN "0100110" => pkt_data <= "11000000"; WHEN "0100111" => pkt_data <= "10101000"; WHEN "0101000" => pkt_data <= "00000000"; WHEN "0101001" => pkt_data <= "00000011"; -- UDP header WHEN "0101010" => pkt_data <= "00000100"; WHEN "0101011" => pkt_data <= "00000000"; WHEN "0101100" => pkt_data <= "00000100"; WHEN "0101101" => pkt_data <= "00000000"; WHEN "0101110" => pkt_data <= "00000000"; WHEN "0101111" => pkt_data <= "00011010"; WHEN "0110000" => pkt_data <= "00000000"; WHEN "0110001" => pkt_data <= "00000000"; -- payload WHEN "0110010" => pkt_data <= "00000000"; -- put here the data that you want to send WHEN "0110011" => pkt_data <= "00000001"; -- put here the data that you want to send WHEN "0110100" => pkt_data <= "00000010"; -- put here the data that you want to send WHEN "0110101" => pkt_data <= "00000011"; -- put here the data that you want to send WHEN "0110110" => pkt_data <= "00000100"; -- put here the data that you want to send WHEN "0110111" => pkt_data <= "00000101"; -- put here the data that you want to send WHEN "0111000" => pkt_data <= "00000110"; -- put here the data that you want to send WHEN "0111001" => pkt_data <= "00000111"; -- put here the data that you want to send WHEN "0111010" => pkt_data <= "00001000"; -- put here the data that you want to send WHEN "0111011" => pkt_data <= "00001001"; -- put here the data that you want to send WHEN "0111100" => pkt_data <= "00001010"; -- put here the data that you want to send WHEN "0111101" => pkt_data <= "00001011"; -- put here the data that you want to send WHEN "0111110" => pkt_data <= "00001100"; -- put here the data that you want to send WHEN "0111111" => pkt_data <= "00001101"; -- put here the data that you want to send WHEN "1000000" => pkt_data <= "00001110"; -- put here the data that you want to send WHEN "1000001" => pkt_data <= "00001111"; -- put here the data that you want to send WHEN "1000010" => pkt_data <= "00010000"; -- put here the data that you want to send WHEN "1000011" => pkt_data <= "00010001"; -- put here the data that you want to send WHEN OTHERS => pkt_data <= "00000000"; END CASE; END IF; END PROCESS; PROCESS (clk20) BEGIN IF rising_edge(clk20) THEN IF (StartSending = '1') THEN SendingPacket <= '1'; ELSE IF (ShiftCount = "1110" AND rdaddress = "1001000") THEN SendingPacket <= '0'; END IF; END IF; END IF; END PROCESS; temp_xhdl3 <= ShiftCount + "0001" WHEN SendingPacket = '1' ELSE "1111"; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN ShiftCount <= temp_xhdl3; END IF; END PROCESS; readram <= TO_BIT(ShiftCount = "1111") ; temp_xhdl4 <= rdaddress + "0000001" WHEN SendingPacket = '1' ELSE "0000000"; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN IF (ShiftCount = "1111") THEN rdaddress <= temp_xhdl4; END IF; END IF; END PROCESS; temp_xhdl5 <= pkt_data WHEN readram = '1' ELSE '0' & ShiftData(7 DOWNTO 1); PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN -- generate the CRC32 IF (ShiftCount(0) = '1') THEN ShiftData <= temp_xhdl5; END IF; END IF; END PROCESS; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN IF (CRCflush = '1') THEN CRCflush <= SendingPacket; ELSE IF (readram = '1') THEN CRCflush <= TO_BIT(rdaddress = "1000100"); END IF; END IF; END IF; END PROCESS; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN IF (readram = '1') THEN CRCinit <= TO_BIT(rdaddress = "0000111"); END IF; END IF; END PROCESS; temp_xhdl6 <= '0' WHEN CRCflush = '1' ELSE (ShiftData(0) XOR CRC(31)); CRCinput <= temp_xhdl6 ; temp_xhdl7 <= "00000000000000000000000000000000" WHEN CRCinit = '1' ELSE (CRC(30 DOWNTO 0) & '0' XOR (CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput & CRCinput AND "00000100110000010001110110110111")); PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN -- generate the NLP IF (ShiftCount(0) = '1') THEN CRC <= temp_xhdl7; END IF; END IF; END PROCESS; temp_xhdl8 <= "000000000000000000" WHEN SendingPacket = '1' ELSE LinkPulseCount + "000000000000000001"; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN LinkPulseCount <= temp_xhdl8; END IF; END PROCESS; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN LinkPulse <= and_br(LinkPulseCount(17 DOWNTO 1)); END IF; END PROCESS; PROCESS (clk20) BEGIN IF ((clk20'EVENT) AND (clk20 = '1')) THEN SendingPacketData <= SendingPacket; END IF; END PROCESS; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN IF (SendingPacketData = '1') THEN idlecount <= "000"; ELSE IF (NOT and_br(idlecount) = '1') THEN idlecount <= idlecount + "001"; END IF; END IF; END IF; END PROCESS; temp_xhdl9 <= NOT CRC(31) WHEN CRCflush = '1' ELSE ShiftData(0); dataout <= temp_xhdl9 ; temp_xhdl10 <= (NOT dataout XOR ShiftCount(0)) WHEN SendingPacketData = '1' ELSE '1'; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN qo <= temp_xhdl10; END IF; END PROCESS; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN qoe <= SendingPacketData OR LinkPulse OR TO_BIT(idlecount < "110"); END IF; END PROCESS; temp_xhdl11 <= qo WHEN qoe = '1' ELSE '0'; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN Ethernet_TDp_xhdl1 <= temp_xhdl11; END IF; END PROCESS; temp_xhdl12 <= NOT qo WHEN qoe = '1' ELSE '0'; PROCESS (clk20) BEGIN IF (clk20'EVENT AND clk20 = '1') THEN Ethernet_TDm_xhdl2 <= temp_xhdl12; END IF; END PROCESS; END ARCHITECTURE translated;