movingblocks.tdf

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

TDF
248
字号
-- moving_block.tdf
-- Yuning.Zhang, 2005-07-18
-- 


include "fran_pg.inc";
include "lpm_rom.inc";
include "lpm_compare";
--include "lpm_counter.inc";
include "lpm_add_sub.inc";

SUBDESIGN movingblocks
(
	clk			    	: INPUT ;
	vout_pulse          : INPUT ;
	act_vcounter[10..0]	: INPUT ;
	act_hcounter[10..0] : INPUT ;

    h_position[11..0]   : INPUT ;  --First bit denotes direction;
	v_position[11..0]   : INPUT ;    
	hvel[5..0]          : INPUT ;  --First bit denotes direction;
	vvel[5..0]          : INPUT ;   
	
	blocksize[6..0]	    : INPUT ;
	red_in[9..0]        : INPUT ;
	green_in[9..0]      : INPUT ;
	blue_in[9..0]       : INPUT ;     

	red_out[9..0]       : OUTPUT;
	green_out[9..0]     : OUTPUT;
	blue_out[9..0]      : OUTPUT;
)

VARIABLE
									
	hsta_table : LPM_ROM WITH (
				               LPM_WIDTH = 11,
				               LPM_WIDTHAD = 7,
				               LPM_ADDRESS_CONTROL = "REGISTERED",
			                   LPM_OUTDATA = "REGISTERED",
				               LPM_FILE = HSTA_TABLE_NAME
				               );
	hend_table : LPM_ROM WITH (
				               LPM_WIDTH = 11,
				               LPM_WIDTHAD = 7,
				               LPM_ADDRESS_CONTROL = "REGISTERED",
				               LPM_OUTDATA = "REGISTERED",
				               LPM_FILE = HEND_TABLE_NAME
				              );
	vsta_table : LPM_ROM WITH (
				               LPM_WIDTH = 11,
			                   LPM_WIDTHAD = 7,
				               LPM_ADDRESS_CONTROL = "REGISTERED",
				               LPM_OUTDATA = "REGISTERED",
				               LPM_FILE = VSTA_TABLE_NAME
				               );
	vend_table : LPM_ROM WITH (
				               LPM_WIDTH = 11,
				               LPM_WIDTHAD = 7,
				               LPM_ADDRESS_CONTROL = "REGISTERED",
				               LPM_OUTDATA = "REGISTERED",
				               LPM_FILE = VEND_TABLE_NAME
				               );
				
	hsta_add_position,hend_add_position,
	vsta_add_position,vend_add_position,
	h_moving,v_moving,
	hsta_add,hend_add,vsta_add,vend_add
	           : lpm_add_sub WITH (
				                    LPM_WIDTH = 11,
				                    LPM_DIRECTION = "ADD",
				                    ONE_INPUT_IS_CONSTANT = "NO",
				                    LPM_PIPELINE = 0
				                    );
	
	hsta_sub_position,hend_sub_position,
	vsta_sub_position,vend_sub_position,
	hsta_sub,hend_sub,vsta_sub,vend_sub
	           : lpm_add_sub WITH (
				                    LPM_WIDTH = 11,
				                    LPM_DIRECTION = "SUB",
				                    ONE_INPUT_IS_CONSTANT = "NO",
				                    LPM_PIPELINE = 0
				                    );
									
    vload1, vload2,
    hload1, hload2
     			: lpm_compare WITH (
				                    LPM_WIDTH = 11,
									ONE_INPUT_IS_CONSTANT = "NO",
									LPM_REPRESENTATION = "UNSIGNED",
									LPM_PIPELINE = 2
									);
				

	hloadblock,vloadblock	  : SRFF;
    h_enable,v_enable         : NODE;
	h_moving_buffer[10..0]    : DFFE;
	v_moving_buffer[10..0]    : DFFE;
	
BEGIN

	hsta_table.address[] = blocksize[];
	hend_table.address[] = blocksize[];
	vsta_table.address[] = blocksize[];
	vend_table.address[] = blocksize[];		
	hsta_table.inclock  = clk;
	hend_table.inclock  = clk;
	vsta_table.inclock  = clk;
	vend_table.inclock  = clk;
	hsta_table.outclock = clk;
	hend_table.outclock = clk;
	vsta_table.outclock = clk;
	vend_table.outclock = clk;
	
	------------------------------------------------------------------------------
	--Effection of Position ------------------------------------------------------
	------------------------------------------------------------------------------
	hsta_add_position.dataa[]=hsta_table.q[];
	hsta_sub_position.dataa[]=hsta_table.q[];
    hend_add_position.dataa[]=hend_table.q[];
    hend_sub_position.dataa[]=hend_table.q[];
	vsta_add_position.dataa[]=vsta_table.q[];
	vsta_sub_position.dataa[]=vsta_table.q[];
	vend_add_position.dataa[]=vend_table.q[];	
	vend_sub_position.dataa[]=vend_table.q[];	
	
	hsta_add_position.datab[]=h_position[10..0];
	hsta_sub_position.datab[]=h_position[10..0];
    hend_add_position.datab[]=h_position[10..0];
    hend_sub_position.datab[]=h_position[10..0];
	vsta_add_position.datab[]=v_position[10..0];
	vsta_sub_position.datab[]=v_position[10..0];
	vend_add_position.datab[]=v_position[10..0];
	vend_sub_position.datab[]=v_position[10..0];	
	
	CASE h_position[11] IS
	WHEN 0 =>
	     hsta_add.dataa[] = hsta_add_position.result[];
	     hsta_sub.dataa[] = hsta_add_position.result[];
	     hend_add.dataa[] = hend_add_position.result[];
	     hend_sub.dataa[] = hend_add_position.result[];
	WHEN 1 =>
	     hsta_add.dataa[] = hsta_sub_position.result[];
	     hsta_sub.dataa[] = hsta_sub_position.result[];
	     hend_add.dataa[] = hend_sub_position.result[];
	     hend_sub.dataa[] = hend_sub_position.result[];
	END CASE;
		
	CASE v_position[11] IS
	WHEN 0 =>
	     vsta_add.dataa[] = vsta_add_position.result[];
	     vsta_sub.dataa[] = vsta_add_position.result[];
	     vend_add.dataa[] = vend_add_position.result[];
	     vend_sub.dataa[] = vend_add_position.result[];
	WHEN 1 =>
	     vsta_add.dataa[] = vsta_sub_position.result[];
	     vsta_sub.dataa[] = vsta_sub_position.result[];
	     vend_add.dataa[] = vend_sub_position.result[];
	     vend_sub.dataa[] = vend_sub_position.result[];
	END CASE;
	
	------------------------------------------------------------------------------
	--EFFECT OF MOVING
	------------------------------------------------------------------------------
	hsta_add.datab[] = h_moving_buffer[].q;
	hsta_sub.datab[] = h_moving_buffer[].q;
	hend_add.datab[] = h_moving_buffer[].q;
	hend_sub.datab[] = h_moving_buffer[].q;

	vsta_add.datab[] = v_moving_buffer[].q;
	vsta_sub.datab[] = v_moving_buffer[].q;
	vend_add.datab[] = v_moving_buffer[].q;
	vend_sub.datab[] = v_moving_buffer[].q;
	
	h_moving.dataa[] = h_moving_buffer[].q;	
    h_moving.datab[] = (0,0,0,0,0,0,hvel[4..0]);
    h_moving_buffer[].d = h_moving.result[];    
    h_moving_buffer[].clk=clk;
    h_moving_buffer[].ena=vout_pulse;

    v_moving.dataa[]= v_moving_buffer[].q;	
    v_moving.datab[]=(0,0,0,0,0,0,vvel[4..0]);
    v_moving_buffer[].d = v_moving.result[];
    v_moving_buffer[].clk=clk;
    v_moving_buffer[].ena=vout_pulse;

    CASE hvel[5] IS
    WHEN 0 =>
         hload1.datab[] = (0,hsta_add.result[9..0]) ; 
         hload2.datab[] = (0,hend_add.result[9..0]) ;
    WHEN 1 =>
         hload1.datab[] = (0,hsta_sub.result[9..0]) ; 
         hload2.datab[] = (0,hend_sub.result[9..0]) ;        
    END CASE;
	     
	CASE vvel[5] IS
    WHEN 0 =>
         vload1.datab[] = (0,0,vsta_add.result[8..0]) ; 
         vload2.datab[] = (0,0,vend_add.result[8..0]) ;
    WHEN 1 =>
         vload1.datab[] = (0,0,vsta_sub.result[8..0]) ; 
         vload2.datab[] = (0,0,vend_sub.result[8..0]) ;      
    END CASE;

	
	------------------------------------------------------------------------------
	--
	------------------------------------------------------------------------------
	
	hload1.dataa[10..0] = act_hcounter[10..0];
    hload1.clock = clk;

    hload2.dataa[10..0] = act_hcounter[10..0];
    hload2.clock = clk;
	
	vload1.dataa[10..0] = act_vcounter[10..0];
    vload1.clock = clk;

    vload2.dataa[10..0] = act_vcounter[10..0];
    vload2.clock = clk;
		
    hloadblock.clk = clk;
    hloadblock.S   = hload1.aeb;
    hloadblock.R   = hload2.aeb;

    vloadblock.clk = clk;
    vloadblock.S   = vload1.aeb;
    vloadblock.R   = vload2.aeb;
    
    CASE blocksize[] IS
    WHEN 0 => 
       h_enable = GND;
       v_enable = GND;
    WHEN 101 =>
       h_enable = GND;
       v_enable = GND;
    WHEN OTHERS =>
       h_enable = hloadblock.q;
       v_enable = vloadblock.q;        
    END CASE;   

    red_out[]  = red_in[] AND h_enable AND v_enable;
    green_out[]= green_in[] AND h_enable AND v_enable;
    blue_out[] = blue_in[] AND h_enable AND v_enable;

END;

⌨️ 快捷键说明

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