📄 hmovingbars.tdf
字号:
-- hmovingbars.tdf
-- Based on Zhang Yuning's original work
-- Reworked by Chai Lin
-- 2006-08-27
include "fran_pg.inc";
include "lpm_compare";
include "lpm_counter.inc";
include "lpm_add_sub.inc";
SUBDESIGN hmovingbars
( HAC[10..0] : INPUT ;
clk : INPUT ;
vout_pulse : INPUT ;
act_hcounter[10..0] : INPUT ;
blocksize[6..0] : INPUT ;
h_sta[11..0] : INPUT ;
h_end[11..0] : INPUT ;
velocity[5..0] : INPUT ; --First bit denotes direction;
henable : OUTPUT;
)
VARIABLE
add_moving:
lpm_add_sub WITH (
LPM_WIDTH = 11,
LPM_DIRECTION = "ADD",
ONE_INPUT_IS_CONSTANT = "NO",
LPM_PIPELINE = 0
);
sub_moving:
lpm_add_sub WITH (
LPM_WIDTH = 11,
LPM_DIRECTION = "SUB",
ONE_INPUT_IS_CONSTANT = "NO",
LPM_PIPELINE = 0
);
sub_moving_initial_12b
: lpm_add_sub WITH (
LPM_WIDTH = 12,
LPM_DIRECTION = "SUB",
ONE_INPUT_IS_CONSTANT = "YES",
LPM_PIPELINE = 0
);
add_compare,
sub_compare,
load1,
load2
: lpm_compare WITH (
LPM_WIDTH = 11,
ONE_INPUT_IS_CONSTANT = "NO",
LPM_REPRESENTATION = "UNSIGNED",
LPM_PIPELINE = 2
);
sta_add,
end_add
: lpm_add_sub WITH (
LPM_WIDTH = 12,
LPM_DIRECTION = "ADD",
ONE_INPUT_IS_CONSTANT = "NO",
LPM_PIPELINE = 0
);
sta_add_sub_12b,
end_add_sub_12b
: lpm_add_sub WITH (
LPM_WIDTH = 12,
LPM_DIRECTION = "SUB",
ONE_INPUT_IS_CONSTANT = "YES",
LPM_PIPELINE = 0
);
sta_add_compare,
end_add_compare
: lpm_compare WITH (
LPM_WIDTH = 12,
ONE_INPUT_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "UNSIGNED",
LPM_PIPELINE = 0
);
sta_end_compare
: lpm_compare WITH (
LPM_WIDTH = 11,
ONE_INPUT_IS_CONSTANT = "NO",
LPM_REPRESENTATION = "UNSIGNED",
LPM_PIPELINE = 1
);
add_moving_buffer[10..0] : DFFE;
sub_moving_buffer[10..0] : DFFE;
h_ena_dff : DFF;
moving_buffer[10..0] : NODE;
sta_moving_buffer[10..0] : NODE;
end_moving_buffer[10..0] : NODE;
h_enable : NODE;
h_ena : NODE;
BEGIN
------------------------------------------------------------------------------
--EFFECT OF MOVING------------------------------------------------------------
------------------------------------------------------------------------------
add_moving.dataa[] = add_moving_buffer[].q;
add_moving.datab[] = (0,0,0,0,0,0,velocity[4..0]);
CASE add_compare.ageb IS
WHEN 0 =>
add_moving_buffer[].d = add_moving.result[];
WHEN 1 =>
add_moving_buffer[].d = add_moving.result[]-HAC[] ;
END CASE;
add_moving_buffer[].clk = clk;
add_moving_buffer[].ena = vout_pulse;
add_compare.dataa[] = add_moving.result[] ;
add_compare.datab[] = HAC[] ;
add_compare.clock = clk ;
sub_moving.dataa[] = sub_moving_buffer[].q;
sub_moving.datab[] = (0,0,0,0,0,0,velocity[4..0]);
sub_moving_initial_12b.dataa[] = (0,HAC[]) + (0,sub_moving.result[]);
sub_moving_initial_12b.datab[] = 2048;
CASE sub_compare.ageb IS
WHEN 0 =>
sub_moving_buffer[].d = sub_moving.result[];
WHEN 1 =>
sub_moving_buffer[].d = sub_moving_initial_12b.result[10..0] ;
END CASE;
sub_moving_buffer[].clk = clk;
sub_moving_buffer[].ena = vout_pulse;
sub_compare.dataa[] = sub_moving.result[] ;
sub_compare.datab[] = HAC[] ;
sub_compare.clock = clk ;
------------------------------------------------------------------------------
CASE velocity[5] IS
WHEN 0 =>
moving_buffer[] = add_moving_buffer[].q;
WHEN 1 =>
moving_buffer[] = sub_moving_buffer[].q;
END CASE;
------------------------------------------------------------------------------
sta_add.dataa[] = h_sta[];
sta_add.datab[] = (0,moving_buffer[]);
end_add.dataa[] = h_end[];
end_add.datab[] = (0,moving_buffer[]);
sta_add_sub_12b.dataa[] = sta_add.result[];
sta_add_sub_12b.datab[] = (0,HAC[]) ;
end_add_sub_12b.dataa[] = end_add.result[];
end_add_sub_12b.datab[] = (0,HAC[]) ;
------------------------------------------------------------------------------
sta_add_compare.dataa[] = sta_add.result[];
sta_add_compare.datab[] = (0,HAC[]);
CASE sta_add_compare.ageb IS
WHEN 1 =>
sta_moving_buffer[]= sta_add_sub_12b.result[10..0];
WHEN 0 =>
sta_moving_buffer[]= sta_add.result[10..0];
END CASE;
end_add_compare.dataa[] = end_add.result[];
end_add_compare.datab[] = (0,HAC[]);
CASE end_add_compare.ageb IS
WHEN 1 =>
end_moving_buffer[]= end_add_sub_12b.result[10..0];
WHEN 0 =>
end_moving_buffer[]= end_add.result[10..0];
END CASE;
---------------------------------------------------------------------------
sta_end_compare.dataa[] = sta_moving_buffer[];
sta_end_compare.datab[] = end_moving_buffer[];
sta_end_compare.clock =clk;
load1.dataa[] = act_hcounter[];
load1.datab[] = sta_moving_buffer[];
load1.clock = clk ;
load2.dataa[] = act_hcounter[];
load2.datab[] = end_moving_buffer[];
load2.clock = clk ;
CASE sta_end_compare.alb IS
WHEN 1 =>
h_enable = load1.ageb AND load2.alb;
WHEN 0 =>
h_enable = load1.ageb OR load2.alb;
END CASE;
CASE blocksize[] IS
WHEN 0 =>
h_ena=GND;
WHEN 101=>
h_ena=GND;
WHEN OTHERS =>
h_ena=h_enable;
END CASE;
h_ena_dff.clk = clk;
h_ena_dff.d = h_ena;
henable=h_ena_dff.q;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -