LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; ENTITY morse IS PORT ( clk : IN STD_ULOGIC; --Systemtakt btn_Taster : IN STD_ULOGIC; --Morsetaster Btn. 3 ext_Taster : IN STD_ULOGIC := 'X'; --Externer Taster über GPIO 0 (PIN_AB22) (oben links) reset_btn : IN STD_ULOGIC; --Resetschalter choiceWPM : IN STD_ULOGIC_VECTOR (1 DOWNTO 0); --Schaltersignal zur Auswahl der gewünschten Wortgeschwindigkeit wpm6, wpm7 : OUT STD_ULOGIC_VECTOR (6 DOWNTO 0); --7-Segment-Anzeigen zur Darstellung der aktuellen --Wortgeschwindigkeit modus : OUT STD_ULOGIC_VECTOR (6 DOWNTO 0); --7-Segment-Anzeige zur Darstellung des aktuellen Betriebsmodus --(d = Decoder, E = Encoder) led3 : OUT STD_ULOGIC_vector (2 DOWNTO 0); --drei LEDs zur Darstellung der länge einer Morsetasterbetätigung data_cntr : OUT STD_ULOGIC_VECTOR (3 DOWNTO 0); --Steuersignale des LCD, wie z.B. LCD_EN, LCD_RW etc. data_out : OUT STD_ULOGIC_VECTOR (7 DOWNTO 0); --Datensignale für das LCD (sowohl druckbare-, als auch --Steuerzeichen) enable : IN STD_ULOGIC; --Switch Signal zum Umschalten zwischen dem Decoder und Encoder data_keyboard : INOUT STD_ULOGIC_VECTOR (7 DOWNTO 0); --Datensignal das angibt, welche Taste auf der Tastatur gedrückt --wurde keyclock : IN STD_ULOGIC; --Taktsignal der PS/2-Tastatur keydata : IN STD_ULOGIC; --serielles Datensignal der PS/2-Tastatur (besteht aus Startbit, 8 --Datenbits, Paritybit und Stop-Bit) done_pressing : INOUT STD_ULOGIC; --gibt an ob die Tastaturtaste losgelassen wurde und die Datenübertragung --beendet wurde ready_LED : OUT STD_ULOGIC; --Anzeige ob der Audio-Codec bereit ist um benutzt zu werden word : IN STD_ULOGIC; --Signal zur Aktivierung des "Wort"-Modus im Keyboard_Encoder mem_addr_leds : OUT STD_ULOGIC_VECTOR (7 DOWNTO 0); --LEDs zur Darstellung der aktuellen Speicheradresse des RAMs in --der Entity "Keyboard_Encoder" --WM8731 pins = Pins benötigt für den Audio-Codec-- AUD_BCLK : OUT STD_ULOGIC; --Audio-Codec Bit-Stream Clock AUD_XCK : OUT STD_ULOGIC; --Audio-Codec Chip Clock AUD_ADCLRCK : OUT STD_ULOGIC; --Audio-Codec ADC LR Clock AUD_ADCDAT : IN STD_ULOGIC; --Audio-Codec ADC Data AUD_DACLRCK : OUT STD_ULOGIC; --Audio-Codec DAC LR Clock AUD_DACDAT : OUT STD_ULOGIC; --Audio-Codec DAC Data I2C_DATA : INOUT STD_ULOGIC; --I²C-Datensignal I2C_CLOCK : OUT STD_ULOGIC --I²C-Taktsignal ); END morse; ARCHITECTURE structure OF morse IS COMPONENT press_duration PORT ( clock, reset, enable, button : IN STD_ULOGIC; short_press, long_press, long_pause : OUT STD_ULOGIC ); END COMPONENT; COMPONENT LCD PORT ( clock_400hz_en, reset : IN STD_ULOGIC; data_input : IN STD_ULOGIC_VECTOR (13 DOWNTO 0); data_keyboard : IN STD_ULOGIC_VECTOR (7 DOWNTO 0); data_cntr : OUT STD_ULOGIC_VECTOR (3 DOWNTO 0); data_out : OUT STD_ULOGIC_VECTOR (7 DOWNTO 0); enable_char : IN STD_ULOGIC; enable : IN STD_ULOGIC; done_pressing : IN STD_ULOGIC ); END COMPONENT; COMPONENT clock_divider PORT (clk : IN STD_ULOGIC; reset : IN STD_ULOGIC; choiceWPM : IN STD_ULOGIC_VECTOR (1 DOWNTO 0); wpm6 : OUT STD_ULOGIC_VECTOR (6 DOWNTO 0); wpm7 : OUT STD_ULOGIC_VECTOR (6 DOWNTO 0); clockNC : OUT STD_ULOGIC; clock_400hz_en : OUT STD_ULOGIC; clock_12MHz_en : OUT STD_ULOGIC ); END COMPONENT; COMPONENT keyboard PORT ( clk : IN STD_ULOGIC; reset : IN STD_ULOGIC; keyclock : IN STD_ULOGIC; keydata : IN STD_ULOGIC; enable : IN STD_ULOGIC; data_keyboard : INOUT STD_ULOGIC_VECTOR (7 DOWNTO 0); done_pressing : INOUT STD_ULOGIC ); END COMPONENT; COMPONENT Audio_Codec PORT ( AUD_BCLK : OUT STD_ULOGIC; AUD_XCK : OUT STD_ULOGIC; AUD_ADCLRCK : OUT STD_ULOGIC; AUD_ADCDAT : IN STD_ULOGIC; AUD_DACLRCK : OUT STD_ULOGIC; AUD_DACDAT : OUT STD_ULOGIC; clock_50 : IN STD_ULOGIC; key : IN STD_ULOGIC; reset : IN STD_ULOGIC; FPGA_I2C_SCLK : OUT STD_ULOGIC; FPGA_I2C_SDAT : INOUT STD_ULOGIC; enable : IN STD_ULOGIC; sound : IN STD_ULOGIC; clock_12MHz_en : IN STD_ULOGIC ); END COMPONENT; COMPONENT Keyboard_Encoder PORT ( clock_50 : IN STD_ULOGIC; clockNC : IN STD_ULOGIC; reset : IN STD_ULOGIC; done_pressing : IN STD_ULOGIC; data_keyboard : IN STD_ULOGIC_VECTOR (7 DOWNTO 0); Audio_Out : OUT STD_ULOGIC; word : IN STD_ULOGIC; mem_addr_leds : OUT STD_ULOGIC_VECTOR (7 DOWNTO 0) ); END COMPONENT; SIGNAL short, long, pause : STD_ULOGIC; SIGNAL token : STD_ULOGIC_vector(13 DOWNTO 0); SIGNAL clockNC : STD_ULOGIC; SIGNAL clock_400hz_en : STD_ULOGIC; SIGNAL clock_12MHz_en : STD_ULOGIC; SIGNAL sound : STD_ULOGIC; SIGNAL reset : STD_ULOGIC := '1'; SIGNAL soft_reset : STD_ULOGIC := '1'; SIGNAL button : STD_ULOGIC := '1'; BEGIN PressDur: COMPONENT press_duration PORT MAP ( clock => clk, reset => reset, enable => clockNC, button => button, short_press => short, long_press => long, long_pause => pause ); Display: COMPONENT LCD PORT MAP ( clock_400hz_en => clock_400hz_en, reset => reset, data_input => token, data_cntr => data_cntr, data_out => data_out, enable_char => pause, enable => enable, data_keyboard => data_keyboard, done_pressing => done_pressing -- leds => leds ); ClockUnit: COMPONENT clock_divider PORT MAP ( clk => clk, reset => reset, choiceWPM => choiceWPM, wpm6 => wpm6, wpm7 => wpm7, clockNC => clockNC, clock_400hz_en => clock_400hz_en, clock_12MHz_en => clock_12MHz_en ); Keys: COMPONENT keyboard PORT MAP ( clk => clk, reset => reset, keyclock => keyclock, keydata => keydata, enable => enable, data_keyboard => data_keyboard, done_pressing => done_pressing ); Audio: COMPONENT Audio_Codec PORT MAP ( AUD_BCLK => AUD_BCLK, AUD_XCK => AUD_XCK, AUD_ADCLRCK => AUD_ADCLRCK, AUD_ADCDAT => AUD_ADCDAT, AUD_DACLRCK => AUD_DACLRCK, AUD_DACDAT => AUD_DACDAT, clock_50 => clk, key => button, reset => reset, FPGA_I2C_SCLK => I2C_CLOCK, FPGA_I2C_SDAT => I2C_DATA, enable => enable, sound => sound, clock_12MHz_en => clock_12MHz_en ); Encoder: COMPONENT Keyboard_Encoder PORT MAP ( clock_50 => clk, clockNC => clockNC, reset => reset, done_pressing => done_pressing, data_keyboard => data_keyboard, Audio_Out => sound, word => word, mem_addr_leds => mem_addr_leds ); modus <= "0100001" WHEN enable = '0' ELSE "0000110"; --Anzeige des aktuellen Modus (d = Decoder, E = Encoder) reset <= '0' WHEN reset_btn = '0' OR soft_reset = '1' ELSE '1'; ready_LED <= reset; --Status-LED zur Anzeige wann ein Reset stattfindet button <= '0' WHEN btn_Taster = '0' OR ext_Taster = '0' ELSE '1'; --Möglichkeit den integrierten Taster zu verwenden, oder einen --externen Taster ('0'); ELSIF clk'EVENT AND clk = '1' THEN IF enable = '0' THEN IF clockNC='1' THEN IF short='1' THEN token <= token(11 DOWNTO 0) & "01"; -- kurzer Impuls ELSIF long='1' THEN token <= token(11 DOWNTO 0) & "11"; -- langer Impuls ELSIF pause='1' THEN -- Ende des Zeichens erreicht -- Anzeige kann angesteuert werden token <= (OTHERS =>'0'); END IF; END IF; END IF; END IF; END PROCESS; led3(0) <= short AND NOT enable; -- kurzer Impuls erkannt led3(1) <= long AND NOT enable; -- langer Impuls erkannt led3(2) <= pause AND NOT enable; -- Pausen-Impuls erkannt END structure;