📄 video_segmentation.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--***********************************************
ENTITY VIDEO_SEGMENTATION IS
PORT(
RED:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
GREEN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
BLUE:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DE:IN STD_LOGIC;
HS:IN STD_LOGIC;
VS:IN STD_LOGIC;
DCLK:IN STD_LOGIC;
DATA:OUT STD_LOGIC_VECTOR(23 DOWNTO 0);
ADDRESS:OUT STD_LOGIC_VECTOR(13 DOWNTO 0);
OE:OUT STD_LOGIC;
WE:OUT STD_LOGIC
);
END VIDEO_SEGMENTATION;
--************************************************
ARCHITECTURE A OF VIDEO_SEGMENTATION IS
CONSTANT HOLD_HS_CONSTANT:STD_LOGIC_VECTOR(8 DOWNTO 0):="000100100";--"100101100";
CONSTANT HOLD_PIXEL_CONSTANT:STD_LOGIC_VECTOR(8 DOWNTO 0):="110111100";
SIGNAL HOLD_HS_COUNTER:STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL HOLD_PIXEL_COUNTER:STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL HS_COUNTER:STD_LOGIC_VECTOR(10 DOWNTO 0);
SIGNAL PIXEL_COUNTER:STD_LOGIC_VECTOR(10 DOWNTO 0);
SIGNAL HS_ADDR_COUNTER:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL PIXEL_ADDR_COUNTER:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL ADDRESS_COUNTER_L:STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL ADDRESS_COUNTER_H:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL H_START:STD_LOGIC;
SIGNAL V_START:STD_LOGIC;
SIGNAL V_PANEL:STD_LOGIC;
SIGNAL H_PANEL:STD_LOGIC;
SIGNAL PANEL:STD_LOGIC;
SIGNAL WE_T:STD_LOGIC;
BEGIN
PROCESS(HS)
BEGIN
IF VS='0'THEN
HOLD_HS_COUNTER<="000000000";
ELSIF HS'EVENT AND HS='1'THEN
-- IF DE='1'THEN
IF HOLD_HS_COUNTER=HOLD_HS_CONSTANT THEN
HOLD_HS_COUNTER<=HOLD_HS_COUNTER;
ELSE
HOLD_HS_COUNTER<=HOLD_HS_COUNTER+1;
END IF;
-- END IF;
END IF;
END PROCESS;
H_START<='1' WHEN HOLD_HS_COUNTER=HOLD_HS_CONSTANT ELSE
'0';
--***********************
PROCESS(HS)
BEGIN
IF VS='0'THEN
HS_COUNTER<="00000000000";
ELSIF HS'EVENT AND HS='1'THEN
IF H_START='1' THEN
HS_COUNTER<=HS_COUNTER+1;
END IF;
END IF;
END PROCESS;
--************************
PROCESS(DCLK)
BEGIN
IF HS='0'THEN
HOLD_PIXEL_COUNTER<="000000000";
ELSIF DCLK'EVENT AND DCLK='1'THEN
IF DE='1'THEN
IF HOLD_PIXEL_COUNTER=HOLD_PIXEL_CONSTANT THEN
HOLD_PIXEL_COUNTER<=HOLD_PIXEL_COUNTER;
ELSE
HOLD_PIXEL_COUNTER<=HOLD_PIXEL_COUNTER+1;
END IF;
END IF;
END IF;
END PROCESS;
V_START<='1' WHEN HOLD_PIXEL_COUNTER=HOLD_PIXEL_CONSTANT ELSE
'0';
--***********************
PROCESS ( DCLK )
BEGIN
IF HS='0' THEN
PIXEL_COUNTER<="00000000000";
ELSIF DCLK'EVENT AND DCLK='1' THEN
IF DE='1'THEN
IF V_START='1' THEN
PIXEL_COUNTER<=PIXEL_COUNTER+1;
-- IF PIXEL_COUNTER(7 DOWNTO 0)="11111110" THEN
-- PIXEL_COUNTER(10 DOWNTO 8)<=PIXEL_COUNTER(10 DOWNTO 9)+1;
-- PIXEL_COUNTER(7 DOWNTO 0)<="00000000";
-- ELSE
-- PIXEL_COUNTER(7 DOWNTO 0)<=PIXEL_COUNTER(7 DOWNTO 0)+1;
-- END IF;
END IF;
END IF;
END IF;
END PROCESS;
--************************
V_PANEL<='1'WHEN V_START='1' AND PIXEL_COUNTER(10 DOWNTO 8)="000" ELSE
'0';
H_PANEL<='1'WHEN H_START='1' AND HS_COUNTER(10 DOWNTO 4)="0000000"ELSE
'0';
PANEL<='1' WHEN V_PANEL='1'AND H_PANEL='1'ELSE
'0';
PROCESS(DCLK)
BEGIN
IF VS='0'THEN
ADDRESS_COUNTER_L<="100001111";
ADDRESS_COUNTER_H<="0000";
ELSIF DCLK'EVENT AND DCLK='1'THEN
IF PANEL='1'THEN
IF ADDRESS_COUNTER_L="011110100"THEN
ADDRESS_COUNTER_L<="011101111";
ELSIF ADDRESS_COUNTER_L="000111100" THEN
ADDRESS_COUNTER_L<="000110111";
ELSIF ADDRESS_COUNTER_L="000011101" THEN
ADDRESS_COUNTER_L<="000010111";
ELSIF ADDRESS_COUNTER_L="000010011" THEN
ADDRESS_COUNTER_L<="000001111";
ELSIF ADDRESS_COUNTER_L="000000000"THEN
ADDRESS_COUNTER_L<="100001111";
ADDRESS_COUNTER_H<=ADDRESS_COUNTER_H+1;
ELSE
ADDRESS_COUNTER_L<=ADDRESS_COUNTER_L-1;
END IF;
END IF;
END IF;
END PROCESS;
WE<='0'WHEN PANEL='1'AND DCLK='0' ELSE
'1';
OE<='1';
ADDRESS<='0' & ADDRESS_COUNTER_H & ADDRESS_COUNTER_L;
PROCESS(DCLK)
BEGIN
IF DCLK'EVENT AND DCLK='1'THEN
DATA<=RED(7 DOWNTO 0)&GREEN(7 DOWNTO 0)& BLUE(7 DOWNTO 0);
END IF;
END PROCESS;
END A;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -