📄 camera.vhd
字号:
ENTITY camera IS
GENERIC(
CONSTANT filec: IN STRING := "videoinput.hex" ; -- Hex-video filename
CONSTANT tclk: IN TIME := 100 ns; -- Clock speed
CONSTANT ths: IN INTEGER := 3; -- Horz. sync time (in clks)
CONSTANT tvs: IN INTEGER := 29; -- Vert. sync time (in clks)
CONSTANT tlin: IN INTEGER := 8); -- Line time vert. sync
PORT(
SIGNAL vdat: OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ; -- Data
SIGNAL clk: OUT STD_LOGIC; -- Clock
SIGNAL n_hs: OUT STD_LOGIC; -- Horizontal sync
SIGNAL n_vs: OUT STD_LOGIC; -- Vertical sync
SIGNAL dv: OUT STD_LOGIC); -- Data valid
END camera;
---------------------------------------------------------------------------------------------
ARCHITECTURE behav OF camera IS
SIGNAL clkx: STD_LOGIC := '0' ;
FILE image: hex_image_file IS IN filec; -- File open
BEGIN
---- Clock generator ----------------------------------------------------------------------
pclk: PROCESS
BEGIN
WAIT FOR tclk;
clkx <= NOT(clkx);
clk <= clkx;
END PROCESS;
---- Camera simulation --------------------------------------------------------------------
pcamera: PROCESS (clkx)
VARIABLE cnt1: INTEGER := 0 ; -- horz. sync counter
VARIABLE cnt2: INTEGER := 0 ; -- vert. sync counter
VARIABLE cnt3: INTEGER := 0 ; -- horz. sync in vert. sync
M
BEGIN
IF clkx = '0' THEN
------ Data process time, no vertical or horizontal syncs
IF cnt1=0 AND cnt2=0 THEN
IF not (ENDFILE (image)) THEN
READ (image,chr1); -- First character is read
IF (chr1 = CR) THEN -- CR-LF detected, horizontal sync must be generated
READ (image,chr2); -- Second character is read. It must be Line Feed
vdat <= (OTHERS => '0'); -- Data is cleared
cnt1 := ths; -- Horizontal sync time
n_hs <= '0'; -- Horizontal sync
n_vs <= '1'; -- Vertical sync
dv <= '0'; -- Data no valid
ELSIF chr1 = '*' THEN -- '*' detected, vertical sync must be generated
vdat <= (OTHERS => '0'); -- Data is cleared
cnt2 := tvs; -- Vertical sync time
cnt3 := tlin; -- Line time for vertical sync
n_vs <= '0'; -- Vertical sync
dv <= '0'; -- Data no valid
ELSE -- Hex data
chr2hex(chr1,hex_nib); -- First character is converted to STD_LOGIC
hex2std(hex_nib,idat(7 DOWNTO 4));
READ (image,chr2); -- Second character is read and
chr2hex(chr2,hex_nib); -- converted to STD_LOGIC
hex2std(hex_nib,idat(3 DOWNTO 0));
vdat <= idat; -- Data out
n_hs <= '1'; -- No horizontal sync
n_vs <= '1'; -- No vertical sync
dv <= '1'; -- Data valid
END IF;
ELSE -- If end of file is reached
ASSERT (false)
REPORT "File end reached..."; -- Console message
n_hs <= '1'; -- No horizontal sync
n_vs <= '0'; -- Vertical sync
dv <= '0'; -- Data no valid
END IF;
END IF;
------ Horizontal sync generation
IF cnt1>0 THEN
n_hs <= '0';
n_vs <= '1';
cnt1 := cnt1-1; -- Clock count for horizontal sync time
ELSE
n_hs <= '1';
END IF;
------ Vertical sync generation
IF cnt2>0 THEN
n_vs <= '0';
cnt2 := cnt2-1; -- Clock count for vert. sync time
cnt3 := cnt3-1; -- Clock count for horz. sync time inside vert. sync
ELSE
n_vs <= '1';
END IF;
------ Horizontal sync generation inside vertical sync
IF cnt3=0 AND cnt2>0 THEN
n_hs <= '0';
cnt1 := ths-1;
cnt3 := tlin+ths;
END IF;
END IF;
END PROCESS;
END behav;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -