📄 main_module.vhd
字号:
--this main module links the other parts together and also does
--some maintainance stuff
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use main_package.all;
entity main_module is
Port ( CLK : in std_logic; --50 MHz clock
BUTTON_0 : in std_logic; --The push button on the board (used as reset)
BUTTON_5_1 : in std_logic_vector(4 downto 0); --Buttons on DIO4
LED_0 : out std_logic; --LED on the board
LED_8_1 : out std_logic_vector(7 downto 0); --The leds on DIO4
LEDGATE : out std_logic; --The Led enable signal
SWITCH_8_1 : in std_logic_vector(7 downto 0); --Switches on DIO4
ANODES : out std_logic_vector(3 downto 0); --Anodes of the 7seg displays on DIO4
SSEG_DISP : out std_logic_vector(7 downto 0); --Catodes of 7seg displays on DIO4
KEYBOARD_CLK : in std_logic; --Keyboard CLK (DIO4)
KEYBOARD_DATA : in std_logic; --Keyboard data (DIO4)
SPK : out std_logic; --A digital output for the speaker PWM
R, G, B, HS, VS: out std_logic; --Signals for the DIO4 video controller
RAM0_CS, RAM1_CS : out std_logic; --Signals for the RAM
MEM_OE, MEM_WR : out std_logic;
MEM_DATA : inout std_logic_vector(7 downto 0);
MEM_ADDR : out std_logic_vector(18 downto 0) );
end main_module;
architecture Behavioral of main_module is
component embedded_kcpsm is
Port ( port_id : out std_logic_vector(7 downto 0);
write_strobe : out std_logic;
read_strobe : out std_logic;
out_port : out std_logic_vector(7 downto 0);
in_port : in std_logic_vector(7 downto 0);
interrupt : in std_logic;
reset : in std_logic;
clk : in std_logic;
switches : in std_logic_vector(7 downto 0));
end component;
component LimitCounter is
generic ( element_width: positive := 8);
Port ( RESET : in std_logic;
CLK : in std_logic;
SWITCH_LIMIT : in std_logic_vector(element_width-1 downto 0);
OUTPUT_SIGNAL : out std_logic);
end component;
component FreqDivider is
generic ( division_factor: positive := 4);
Port ( CLK : in std_logic;
DIVIDED_CLK : out std_logic);
end component;
component LedControl is
generic ( pwm_precision: positive := 8 );
Port ( LED0_IN : in std_logic_vector(pwm_precision-1 downto 0);
LED1_IN : in std_logic_vector(pwm_precision-1 downto 0);
LED2_IN : in std_logic_vector(pwm_precision-1 downto 0);
LED3_IN : in std_logic_vector(pwm_precision-1 downto 0);
LED4_IN : in std_logic_vector(pwm_precision-1 downto 0);
LED5_IN : in std_logic_vector(pwm_precision-1 downto 0);
LED6_IN : in std_logic_vector(pwm_precision-1 downto 0);
LED7_IN : in std_logic_vector(pwm_precision-1 downto 0);
CLK : in std_logic;
RESET : in std_logic;
LED_OUT : out std_logic_vector(7 downto 0));
end component;
component SevenSegDisplay is
generic ( pwm_precision: positive := 8 );
Port ( CLK : in std_logic;
RESET : in std_logic;
SEG0_VALUE : in std_logic_vector(7 downto 0);
SEG0_BRIGHTNESS : in std_logic_vector(pwm_precision - 1 downto 0);
SEG1_VALUE : in std_logic_vector(7 downto 0);
SEG1_BRIGHTNESS : in std_logic_vector(pwm_precision - 1 downto 0);
SEG2_VALUE : in std_logic_vector(7 downto 0);
SEG2_BRIGHTNESS : in std_logic_vector(pwm_precision - 1 downto 0);
SEG3_VALUE : in std_logic_vector(7 downto 0);
SEG3_BRIGHTNESS : in std_logic_vector(pwm_precision - 1 downto 0);
ANODES : out std_logic_vector(3 downto 0);
LEDS : out std_logic_vector(7 downto 0));
end component;
component KeyboardHandler is
generic ( buffer_size: positive := 32);
Port ( KEYBOARD_CLK : in std_logic;
KEYBOARD_DATA : in std_logic;
RESET : in std_logic;
CLK : in std_logic;
FIRST_CHAR_INDEX : out std_logic_vector(7 downto 0);
FIRST_FREE_INDEX : out std_logic_vector(7 downto 0);
CHAR_INDEX : in std_logic_vector(7 downto 0);
CHAR_DATA : out std_logic_vector(7 downto 0);
READ_FIRST_CHAR : out std_logic_vector(7 downto 0);
READ_FIRST_CHAR_STROBE : in std_logic);
end component;
component AudioController is
Port ( CLK : in std_logic;
SPK : out std_logic;
RESET : in std_logic;
FREQ_STEP : in std_logic_vector(7 downto 0);
TURN_OFF_COUNT : in std_logic_vector(7 downto 0);
REAL_TURN_OFF_COUNT: out std_logic_vector(7 downto 0));
end component;
component VideoController is
Port ( CLK : in std_logic;
RESET : in std_logic;
R : out std_logic;
G : out std_logic;
B : out std_logic;
HS, VS : out std_logic;
COLUMN : in std_logic_vector(5 downto 0);
ROW : in std_logic_vector(3 downto 0);
CHAR_CODE_READ : out std_logic_vector(7 downto 0);
CHAR_CODE_WRITE : in std_logic_vector(7 downto 0);
CHAR_ATTRIBUTES_READ : out std_logic_vector(7 downto 0);
CHAR_ATTRIBUTES_WRITE : in std_logic_vector(7 downto 0);
CHAR_WRITE_STROBE : in std_logic;
PALETTE_INDEX : in std_logic_vector(2 downto 0);
PALETTE_READ : out std_logic_vector(7 downto 0);
PALETTE_WRITE : in std_logic_vector(7 downto 0);
PALETTE_WRITE_STROBE : in std_logic);
end component;
component Debouncer is
generic ( wait_period: positive := 10);
Port ( CLK : in std_logic;
SIG_IN : in std_logic;
SIG_OUT : out std_logic);
end component;
signal port_id, out_port, in_port: std_logic_vector(7 downto 0);
signal write_strobe, read_strobe, interrupt, kpcsm_clk: std_logic;
signal pwm_clock: std_logic;
signal led_0_intensity: std_logic_vector(7 downto 0);
signal led_1_intensity, led_2_intensity, led_3_intensity, led_4_intensity,
led_5_intensity, led_6_intensity, led_7_intensity, led_8_intensity: std_logic_vector(7 downto 0);
signal seg_0_data, seg_0_intensity, seg_1_data, seg_1_intensity,
seg_2_data, seg_2_intensity, seg_3_data, seg_3_intensity: std_logic_vector(7 downto 0);
signal first_char_index, first_free_index, char_index, char_data, first_char_value: std_logic_vector(7 downto 0);
signal read_first_char_value: std_logic;
signal FreqStep, TurnOffCount, RealTurnoffCount: std_logic_vector(7 downto 0);
signal CharColumn, CharRow, CharCodeRead, CharCodeWrite,
CharAttributeRead, CharAttributeWrite,
PaletteIndex, PaletteRead, PaletteWrite: std_logic_vector(7 downto 0);
signal CharWriteStrobe, PaletteWriteStrobe: std_logic;
signal MemoryAddress0, MemoryAddress1: std_logic_vector(7 downto 0);
signal seg_0_data_override, seg_0_intensity_override, seg_1_data_override, seg_1_intensity_override,
seg_2_data_override, seg_2_intensity_override, seg_3_data_override, seg_3_intensity_override: std_logic_vector(7 downto 0);
signal button_0_debounced: std_logic;
begin
--button 0 is beeing debounced, because there is no hardware debouncing for it
BUTTON_0_DB: Debouncer port map (CLK, BUTTON_0, button_0_debounced);
kcpsm: embedded_kcpsm port map (
port_id, write_strobe, read_strobe, out_port, in_port, interrupt,
button_0_debounced, kpcsm_clk, SWITCH_8_1
);
--This generates the clock used for the PWM of the LEDs
pwm_clock_generator: FreqDivider
generic map (division_factor => 10)
port map ( CLK, pwm_clock );
led_0_control: LimitCounter port map ( button_0_debounced, pwm_clock, led_0_intensity, LED_0 );
led_8_1_control: LedControl port map ( led_1_intensity, led_2_intensity, led_3_intensity, led_4_intensity,
led_5_intensity, led_6_intensity, led_7_intensity, led_8_intensity, pwm_clock, button_0_debounced, LED_8_1 );
--process to display the selected program bank during a reset cycle
process (button_0_debounced, seg_3_data, seg_3_intensity,
seg_2_data, seg_2_intensity, seg_1_data, seg_1_intensity,
seg_0_data, seg_0_intensity, SWITCH_8_1)
begin
if (button_0_debounced = '0') then
seg_3_data_override <= seg_3_data;
seg_3_intensity_override <= seg_3_intensity;
seg_2_data_override <= seg_2_data;
seg_2_intensity_override <= seg_2_intensity;
seg_1_data_override <= seg_1_data;
seg_1_intensity_override <= seg_1_intensity;
seg_0_data_override <= seg_0_data;
seg_0_intensity_override <= seg_0_intensity;
else
seg_3_data_override <= hex_to_led("0000");
seg_2_data_override <= hex_to_led("0000");
seg_1_data_override <= hex_to_led(SWITCH_8_1(7 downto 4));
seg_0_data_override <= hex_to_led(SWITCH_8_1(3 downto 0));
seg_3_intensity_override <= X"FF";
seg_2_intensity_override <= X"FF";
seg_1_intensity_override <= X"FF";
seg_0_intensity_override <= X"FF";
end if;
end process;
sseg_control: SevenSegDisplay port map (pwm_clock, '0', seg_0_data_override, seg_0_intensity_override, seg_1_data_override, seg_1_intensity_override,
seg_2_data_override, seg_2_intensity_override, seg_3_data_override, seg_3_intensity_override, ANODES, SSEG_DISP);
keyboard_controller: KeyboardHandler port map (
KEYBOARD_CLK, KEYBOARD_DATA, button_0_debounced, CLK,
first_char_index, first_free_index,
char_index, char_data, first_char_value,
read_first_char_value
);
audio_controller: AudioController port map (
CLK, SPK,
button_0_debounced,
FreqStep, TurnOffCount, RealTurnoffCount
);
video_controller: VideoController port map (
CLK, button_0_debounced,
R, G, B, HS, VS,
CharColumn(5 downto 0), CharRow(3 downto 0),
CharCodeRead, CharCodeWrite, CharAttributeRead, CharAttributeWrite,
CharWriteStrobe,
PaletteIndex(2 downto 0), PaletteRead, PaletteWrite,
PaletteWriteStrobe
);
--handle the (part of the) memory signals seperately,
--because they are inout type and need special care
MEM_ADDR <= "000" & MemoryAddress1 & MemoryAddress0;
MEM_OE <= not(button_0_debounced);
RAM0_CS <= not(button_0_debounced);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -