h_moving_blocks.tdf
来自「基于fpga的屏幕测试程序」· TDF 代码 · 共 212 行
TDF
212 行
-- h_moving_block.tdf
-- Yuning.Zhang, 2005-07-14
--
include "fran_pg.inc";
include "lpm_rom.inc";
include "lpm_compare";
include "lpm_counter.inc";
include "lpm_add_sub.inc";
SUBDESIGN h_moving_blocks
(
clk : INPUT ;
vout_pulse : INPUT ;
act_vcounter[10..0] : INPUT ;
act_hcounter[10..0] : INPUT ;
v_position[7..0] : INPUT ; --first bit denotes direction,verticle position,
velocity[4..0] : INPUT ; --First bit denotes direction;
blocksize[4..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
);
vload1, vload2,
hload1, hload2
: lpm_compare WITH (
LPM_WIDTH = 11,
ONE_INPUT_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "UNSIGNED",
LPM_PIPELINE = 2
);
h_position : lpm_add_sub WITH (
LPM_WIDTH = 11,
LPM_DIRECTION = "ADD",
ONE_INPUT_IS_CONSTANT = "NO",
LPM_PIPELINE = 0
);
hsta_r,hend_r,vsta_u,vend_u
: lpm_add_sub WITH (
LPM_WIDTH = 11,
LPM_DIRECTION = "ADD",
ONE_INPUT_IS_CONSTANT = "NO",
LPM_PIPELINE = 0
);
hsta_l,hend_l,vsta_d,vend_d
: lpm_add_sub WITH (
LPM_WIDTH = 11,
LPM_DIRECTION = "SUB",
ONE_INPUT_IS_CONSTANT = "NO",
LPM_PIPELINE = 0
);
hloadblock,vloadblock : SRFF;
hsta[10..0],hend[10..0] : NODE;
vsta[10..0],vend[10..0] : NODE;
h_enable,v_enable : NODE;
h_position_buffer[10..0] : DFFE;
BEGIN
%
CASE blocksize[4..0] IS
WHEN 31 =>
hsta_table.address[] = 102;
hend_table.address[] = 102;
vsta_table.address[] = 102;
vend_table.address[] = 102;
WHEN OTHERS =>
hsta_table.address[] = (0,0,blocksize[4..0]);
hend_table.address[] = (0,0,blocksize[4..0]);
vsta_table.address[] = (0,0,blocksize[4..0]);
vend_table.address[] = (0,0,blocksize[4..0]);
END CASE;
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;
h_position.dataa[] = (0,0,0,0,0,0,0,velocity[3..0]);
h_position.datab[] = h_position_buffer[10..0].q;
h_position_buffer[].clk = clk;
h_position_buffer[].ena = vout_pulse;
h_position_buffer[].d = h_position.result[];
----------------------------------------------------
CASE v_position[7] IS
WHEN 0 =>
vsta[] = vsta_u.result[];
vend[] = vend_u.result[];
WHEN 1 =>
vsta[] = vsta_d.result[];
vend[] = vend_d.result[];
END CASE;
CASE velocity[4] IS
WHEN 0 =>
hsta[] = hsta_r.result[];
hend[] = hend_r.result[];
WHEN 1 =>
hsta[] = hsta_l.result[];
hend[] = hend_l.result[];
END CASE;
hsta_r.dataa[] = hsta_table.q[10..0];
hend_r.dataa[] = hend_table.q[10..0];
vsta_u.dataa[] = vsta_table.q[10..0];
vend_u.dataa[] = vend_table.q[10..0];
hsta_r.datab[] = h_position_buffer[10..0].q;
hend_r.datab[] = h_position_buffer[10..0].q;
vsta_u.datab[] = (0,0,v_position[6..0],0,0);
vend_u.datab[] = (0,0,v_position[6..0],0,0);
hsta_l.dataa[] = hsta_table.q[10..0];
hend_l.dataa[] = hend_table.q[10..0];
vsta_d.dataa[] = vsta_table.q[10..0];
vend_d.dataa[] = vend_table.q[10..0];
hsta_l.datab[] = h_position_buffer[10..0].q;
hend_l.datab[] = h_position_buffer[10..0].q;
vsta_d.datab[] = (0,0,v_position[6..0],0,0);
vend_d.datab[] = (0,0,v_position[6..0],0,0);
--------------------------------------------------------
vload1.dataa[10..0] = act_vcounter[10..0];
vload1.datab[10..0] = vsta[10..0];
vload1.clock = clk;
vload2.dataa[10..0] = act_vcounter[10..0];
vload2.datab[10..0] = vend[10..0];
vload2.clock = clk;
--------------------------------------------------------
hload1.dataa[10..0] = act_hcounter[10..0];
hload1.datab[] = hsta[];
hload1.clock = clk;
hload2.dataa[10..0] = act_hcounter[10..0];
hload2.datab[] = hend[];
hload2.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 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 + -
显示快捷键?