⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_module.vhd

📁 描述:LED示范、按钮及开关、视频输出、键入、含Xilinx PicoBlaze微处理器的存储器模块
💻 VHD
📖 第 1 页 / 共 2 页
字号:
--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 + -