sinewave.vhd

来自「基于fpga的屏幕测试程序」· VHDL 代码 · 共 316 行

VHD
316
字号
LIBRARY ieee ;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;USE ieee.std_logic_arith.ALL;USE ieee.numeric_std.all; ENTITY sinewave ISGENERIC(		DST		: integer :=32;	LBAR    : integer :=480;	RBAR    : integer :=800;	HWIDTH  : integer :=180;	VWIDTH	: integer :=50	);PORT(	clk     		: IN STD_LOGIC;	clken	 		: IN STD_LOGIC;  	hcount  		: IN STD_LOGIC_VECTOR(10 DOWNTO 0);  	vcount  		: IN STD_LOGIC_VECTOR(10 DOWNTO 0);	HAC				: IN STD_LOGIC_VECTOR(10 DOWNTO 0);	VAC				: IN STD_LOGIC_VECTOR(10 DOWNTO 0);	graymax			: IN STD_LOGIC_VECTOR(9 DOWNTO 0);	graymin			: IN STD_LOGIC_VECTOR(9 DOWNTO 0);	ram_data		: IN STD_LOGIC_VECTOR(7 DOWNTO 0);	ram_wraddress	: IN STD_LOGIC_VECTOR(8 DOWNTO 0);		cycle			: IN STD_LOGIC_VECTOR(3 DOWNTO 0);	reverse			: IN STD_LOGIC;	download		: IN STD_LOGIC;	speed			: IN STD_LOGIC_VECTOR(5 DOWNTO 0);	delay			: IN STD_LOGIC_VECTOR(3 DOWNTO 0);	distance		: IN STD_LOGIC_VECTOR(3 DOWNTO 0);		red_out			: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);	gre_out			: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);	blu_out			: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END sinewave;ARCHITECTURE rtl OF sinewave ISSIGNAL nn			: integer RANGE 1023 DOWNTO 0 := 0;SIGNAL dist			: integer RANGE 511 DOWNTO 0 ;SIGNAL count		: integer RANGE 359 DOWNTO 0 ;SIGNAL countmax		: integer RANGE 511 DOWNTO 0 ;SIGNAL HCE 			: integer range 1023 downto 0 := 640;SIGNAL VCE 			: integer range 1023 downto 0 := 512;SIGNAL flag		    : STD_LOGIC_VECTOR (3 DOWNTO 0);SIGNAL GLmax		: STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL GLmin		: STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL ram_rdaddress_a  	: STD_LOGIC_VECTOR (8 DOWNTO 0);SIGNAL tmp_rdaddress_a  	: STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL ram_qa 	    		: STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL ram_rdaddress_b  	: STD_LOGIC_VECTOR (8 DOWNTO 0);SIGNAL tmp_rdaddress_b  	: STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL ram_qb 	    		: STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL rom_address1  : STD_LOGIC_VECTOR (12 DOWNTO 0);SIGNAL main_address1 : STD_LOGIC_VECTOR (3 DOWNTO 0);SIGNAL sub_address1  : STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL sub_ad_temp1  : STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL q1 	   		 : STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL q_temp1	   : STD_LOGIC_VECTOR (15 DOWNTO 0);SIGNAL q_out1	   : STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL rom_address2  : STD_LOGIC_VECTOR (12 DOWNTO 0);SIGNAL main_address2 : STD_LOGIC_VECTOR (3 DOWNTO 0);SIGNAL sub_address2  : STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL sub_ad_temp2  : STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL q2		     : STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL q_temp2	    : STD_LOGIC_VECTOR (15 DOWNTO 0);SIGNAL q_out2 	    : STD_LOGIC_VECTOR (7 DOWNTO 0);SIGNAL storage_out		: STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL red_out_temp		: STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL gre_out_temp		: STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL blu_out_temp		: STD_LOGIC_VECTOR(7 DOWNTO 0);COMPONENT buf_ram IS PORT(	data		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);	wraddress	: IN STD_LOGIC_VECTOR (8 DOWNTO 0);	rdaddress_a	: IN STD_LOGIC_VECTOR (8 DOWNTO 0);	rdaddress_b	: IN STD_LOGIC_VECTOR (8 DOWNTO 0);	wren		: IN STD_LOGIC  := '1';	clock		: IN STD_LOGIC ;	qa		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);	qb		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END COMPONENT;	COMPONENT sinewave_rom IS PORT	(		clock	: IN STD_LOGIC ;		address	: IN STD_LOGIC_VECTOR (12 DOWNTO 0);		q		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)	);END COMPONENT;COMPONENT sinewave_rom2 IS PORT	(		clock	: IN STD_LOGIC ;		address	: IN STD_LOGIC_VECTOR (12 DOWNTO 0);		q		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)	);END COMPONENT;-------------------------------------------------------------	BEGINw0: buf_ram PORT MAP	(  		data		=>	ram_data,		wraddress	=>	ram_wraddress,		rdaddress_a	=>	ram_rdaddress_a,		rdaddress_b	=>	ram_rdaddress_b,		wren		=>	'1',		clock		=>	clk,		qa			=>	ram_qa,		qb			=>	ram_qb	);w1 : sinewave_rom PORT MAP	(		clock	=>	clk,		address	=>	rom_address1,		q		=>	q1	);w2 : sinewave_rom2 PORT MAP	(		clock	=>	clk,		address	=>	rom_address2,		q		=>	q2	);-------------------------------------------------------------PROCESS(clk)BEGIN	IF clk'event AND clk='1' THEN		HCE 		<= conv_integer(HAC(10 downto 1));		VCE 		<= conv_integer(VAC(10 downto 1));		countmax 	<= conv_integer(delay)*30;		GLmax 		<= graymax(9 DOWNTO 2);		GLmin  		<= graymin(9 DOWNTO 2);					main_address1 <= cycle;		main_address2 <= cycle;	END IF;END PROCESS;PROCESS(clk,distance)BEGINIF clk'event AND clk='1' THEN	CASE distance IS		WHEN  "0000"=>	dist <= 0;		WHEN  "0001"=>	dist <= DST*1;		WHEN  "0010"=>	dist <= DST*2;	    WHEN  "0011"=>	dist <= DST*3;	    WHEN  "0100"=>	dist <= DST*4;	    WHEN  "0101"=>	dist <= DST*5;	    WHEN  "0110"=>	dist <= DST*6;	    WHEN  "0111"=>	dist <= DST*7;	    WHEN  "1000"=>	dist <= DST*8;	    WHEN  "1001"=>	dist <= DST*9;		WHEN  "1010"=>	dist <= DST*10;		WHEN  "1011"=>	dist <= DST*11;		WHEN  "1100"=>	dist <= DST*12;		WHEN  "1101"=>	dist <= DST*13;		WHEN  "1110"=>	dist <= DST*14;		WHEN  "1111"=>	dist <= DST*15;	    WHEN OTHERS =>	dist <= 0;	END CASE;END IF;	END PROCESS;PROCESS(clk)BEGIN	IF clk'event AND clk='1' THEN		rom_address1 <= main_address1 & sub_address1(8 DOWNTO 0);		q_temp1 <= (GLmax-GLmin)*q1;		q_out1 <= GLmin + q_temp1(15 DOWNTO 8);				rom_address2 <= main_address2 & sub_address2(8 DOWNTO 0);		q_temp2 <= (GLmax-GLmin)*q2;		q_out2 <= GLmin + q_temp2(15 DOWNTO 8);				ram_rdaddress_a <=	tmp_rdaddress_a(8 DOWNTO 0);		ram_rdaddress_b <=	tmp_rdaddress_b(8 DOWNTO 0);	END IF;END PROCESS;PROCESS(clk)BEGINIF clk'event AND clk='1' THEN	IF clken='1' THEN   		IF nn>=RBAR+dist THEN   			if count=countmax then				nn <= LBAR-dist;				count <= 0;			else 				count <= count+1;				nn <= RBAR+dist;			end if;		ELSE			nn <= (nn+conv_integer(speed));		END IF;	END IF;END IF;END PROCESS;PROCESS(clk,hcount,nn)BEGINIF clk'event AND clk='1' THEN	sub_ad_temp1 <= (hcount-nn);  END IF;END PROCESS; PROCESS(clk,sub_ad_temp1)BEGINIF clk'event AND clk='1' THEN	if  sub_ad_temp1<HWIDTH+HWIDTH then 		sub_address1 <= sub_ad_temp1; 	else 		sub_address1 <= "00000000000";	end if;END IF;END PROCESS;PROCESS(clk)BEGIN	IF clk'event AND clk='1' THEN		if hcount>=HCE-HWIDTH and hcount<HCE+HWIDTH		 then			sub_address2 	<= hcount-(HCE-HWIDTH);			tmp_rdaddress_a <= hcount-(HCE-HWIDTH);			tmp_rdaddress_b <= hcount-(HCE-HWIDTH);		 else			sub_address2 	<= "00000000000";			tmp_rdaddress_a <= "00000000000";			tmp_rdaddress_b <= "00000000000";					end if;	END IF;END PROCESS;PROCESS(clk)BEGIN	IF clk'event AND clk='1' THEN		if vcount>=VCE-VWIDTH+75 and vcount<=VCE+VWIDTH+75 and hcount>=LBAR-dist and hcount<RBAR+dist --and hcount>=nn and hcount<nn+HWIDTH+HWIDTH		then			 flag <= "0001";  -- motion object		elsif vcount>=VCE-VWIDTH-75 and vcount<=VCE+VWIDTH-75 and hcount>=HCE-HWIDTH and hcount<HCE+HWIDTH		then	 			flag <= "0010";	  -- still object		else			flag <= "0100";			end if;	END IF;END PROCESS;PROCESS(clk)BEGINIF clk'event AND clk='1' THEN	CASE download IS		WHEN '0' =>			storage_out	<=	q_out2;		WHEN OTHERS =>			storage_out	<=	ram_qa;	END CASE;END IF;END PROCESS;PROCESS(clk)BEGINIF clk'event AND clk='1' THEN	CASE flag IS		WHEN "0001" =>		-- motion object			red_out_temp	<=	q_out1;			gre_out_temp	<=	q_out1;			blu_out_temp	<=	q_out1;		WHEN "0010" =>		-- still object			red_out_temp	<=	storage_out;			gre_out_temp	<=	storage_out;			blu_out_temp	<=	storage_out;		WHEN OTHERS =>			red_out_temp	<=	"00000000";			gre_out_temp	<=	"00000000";			blu_out_temp	<=	"00000000";	END CASE;END IF;END PROCESS;PROCESS(clk)BEGINIF clk'event AND clk='1' THEN	CASE reverse IS		WHEN '0' =>			red_out	<=	red_out_temp;			gre_out	<=	gre_out_temp;			blu_out	<=	blu_out_temp;		WHEN OTHERS =>			red_out	<=	"11111111" - red_out_temp;			gre_out	<=	"11111111" - gre_out_temp;			blu_out	<=	"11111111" - blu_out_temp;	END CASE;END IF;END PROCESS;END rtl;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?