- Rasterizer
This commit is contained in:
@@ -195,18 +195,22 @@
|
|||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x0" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x0" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">x0[15:0]</obj_property>
|
<obj_property name="ElementShortName">x0[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">x0[15:0]</obj_property>
|
<obj_property name="ObjectShortName">x0[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x1" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x1" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">x1[15:0]</obj_property>
|
<obj_property name="ElementShortName">x1[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">x1[15:0]</obj_property>
|
<obj_property name="ObjectShortName">x1[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i0" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i0" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">i0[15:0]</obj_property>
|
<obj_property name="ElementShortName">i0[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">i0[15:0]</obj_property>
|
<obj_property name="ObjectShortName">i0[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i1" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i1" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">i1[15:0]</obj_property>
|
<obj_property name="ElementShortName">i1[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">i1[15:0]</obj_property>
|
<obj_property name="ObjectShortName">i1[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/load_dx" type="logic" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/load_dx" type="logic" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">load_dx</obj_property>
|
<obj_property name="ElementShortName">load_dx</obj_property>
|
||||||
@@ -235,26 +239,32 @@
|
|||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">i[15:0]</obj_property>
|
<obj_property name="ElementShortName">i[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">i[15:0]</obj_property>
|
<obj_property name="ObjectShortName">i[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">x[15:0]</obj_property>
|
<obj_property name="ElementShortName">x[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">x[15:0]</obj_property>
|
<obj_property name="ObjectShortName">x[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/ch" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/ch" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">ch[1:0]</obj_property>
|
<obj_property name="ElementShortName">ch[1:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">ch[1:0]</obj_property>
|
<obj_property name="ObjectShortName">ch[1:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/neg_dx" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/neg_dx" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">neg_dx[15:0]</obj_property>
|
<obj_property name="ElementShortName">neg_dx[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">neg_dx[15:0]</obj_property>
|
<obj_property name="ObjectShortName">neg_dx[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x1_int" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x1_int" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">x1_int[15:0]</obj_property>
|
<obj_property name="ElementShortName">x1_int[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">x1_int[15:0]</obj_property>
|
<obj_property name="ObjectShortName">x1_int[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/di" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/di" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">di[3:0]</obj_property>
|
<obj_property name="ElementShortName">di[3:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">di[3:0]</obj_property>
|
<obj_property name="ObjectShortName">di[3:0]</obj_property>
|
||||||
|
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/si" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/si" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">si[3:0]</obj_property>
|
<obj_property name="ElementShortName">si[3:0]</obj_property>
|
||||||
@@ -263,34 +273,42 @@
|
|||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/d_sub_1" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/d_sub_1" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">d_sub_1[15:0]</obj_property>
|
<obj_property name="ElementShortName">d_sub_1[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">d_sub_1[15:0]</obj_property>
|
<obj_property name="ObjectShortName">d_sub_1[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/d_sub_2" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/d_sub_2" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">d_sub_2[15:0]</obj_property>
|
<obj_property name="ElementShortName">d_sub_2[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">d_sub_2[15:0]</obj_property>
|
<obj_property name="ObjectShortName">d_sub_2[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/d_sub" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/d_sub" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">d_sub[15:0]</obj_property>
|
<obj_property name="ElementShortName">d_sub[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">d_sub[15:0]</obj_property>
|
<obj_property name="ObjectShortName">d_sub[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/d_sub_abs" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/d_sub_abs" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">d_sub_abs[15:0]</obj_property>
|
<obj_property name="ElementShortName">d_sub_abs[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">d_sub_abs[15:0]</obj_property>
|
<obj_property name="ObjectShortName">d_sub_abs[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/err" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/err" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">err[3:0]</obj_property>
|
<obj_property name="ElementShortName">err[3:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">err[3:0]</obj_property>
|
<obj_property name="ObjectShortName">err[3:0]</obj_property>
|
||||||
|
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/err_next" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/err_next" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">err_next[15:0]</obj_property>
|
<obj_property name="ElementShortName">err_next[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">err_next[15:0]</obj_property>
|
<obj_property name="ObjectShortName">err_next[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/err_add_1" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/err_add_1" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">err_add_1[15:0]</obj_property>
|
<obj_property name="ElementShortName">err_add_1[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">err_add_1[15:0]</obj_property>
|
<obj_property name="ObjectShortName">err_add_1[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/err_add_2" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/err_add_2" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">err_add_2[15:0]</obj_property>
|
<obj_property name="ElementShortName">err_add_2[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">err_add_2[15:0]</obj_property>
|
<obj_property name="ObjectShortName">err_add_2[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">SIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/looping" type="logic" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/looping" type="logic" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">looping</obj_property>
|
<obj_property name="ElementShortName">looping</obj_property>
|
||||||
@@ -307,18 +325,22 @@
|
|||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i_int" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i_int" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">i_int[3:0]</obj_property>
|
<obj_property name="ElementShortName">i_int[3:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">i_int[3:0]</obj_property>
|
<obj_property name="ObjectShortName">i_int[3:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i_next" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i_next" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">i_next[15:0]</obj_property>
|
<obj_property name="ElementShortName">i_next[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">i_next[15:0]</obj_property>
|
<obj_property name="ObjectShortName">i_next[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i_add" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/i_add" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">i_add[15:0]</obj_property>
|
<obj_property name="ElementShortName">i_add[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">i_add[15:0]</obj_property>
|
<obj_property name="ObjectShortName">i_add[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x_int" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/x_int" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">x_int[15:0]</obj_property>
|
<obj_property name="ElementShortName">x_int[15:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">x_int[15:0]</obj_property>
|
<obj_property name="ObjectShortName">x_int[15:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/step_done_next" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/step_done_next" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">step_done_next[3:0]</obj_property>
|
<obj_property name="ElementShortName">step_done_next[3:0]</obj_property>
|
||||||
@@ -331,6 +353,7 @@
|
|||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/channel" type="array" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/channel" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">channel[1:0]</obj_property>
|
<obj_property name="ElementShortName">channel[1:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">channel[1:0]</obj_property>
|
<obj_property name="ObjectShortName">channel[1:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/next_step" type="logic" db_ref_id="1">
|
<wvobject fp_name="/rasterizer_l_tb/DUT/bresenham_dp_1/next_step" type="logic" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">next_step</obj_property>
|
<obj_property name="ElementShortName">next_step</obj_property>
|
||||||
|
|||||||
@@ -35,12 +35,14 @@ entity bresenham_dp is
|
|||||||
generic (
|
generic (
|
||||||
channels : integer := 5;
|
channels : integer := 5;
|
||||||
channels_ln2 : integer := 3;
|
channels_ln2 : integer := 3;
|
||||||
preinc_x : boolean := true);
|
preinc_x : boolean := true;
|
||||||
|
width : integer := 16);
|
||||||
port(
|
port(
|
||||||
clk : in STD_LOGIC;
|
clk : in STD_LOGIC;
|
||||||
|
pause : in std_logic;
|
||||||
|
|
||||||
x0, x1 : in unsigned(15 downto 0);
|
x0, x1 : in unsigned(width-1 downto 0);
|
||||||
i0, i1 : in unsigned(15 downto 0);
|
i0, i1 : in unsigned(width-1 downto 0);
|
||||||
|
|
||||||
load_dx : in std_logic;
|
load_dx : in std_logic;
|
||||||
load_di : in std_logic;
|
load_di : in std_logic;
|
||||||
@@ -49,34 +51,34 @@ entity bresenham_dp is
|
|||||||
i_valid : out std_logic;
|
i_valid : out std_logic;
|
||||||
done : out std_logic;
|
done : out std_logic;
|
||||||
|
|
||||||
i : out unsigned(15 downto 0);
|
i : out unsigned(width-1 downto 0);
|
||||||
x : out unsigned(15 downto 0);
|
x : out unsigned(width-1 downto 0);
|
||||||
ch : out unsigned(channels_ln2-1 downto 0));
|
ch : out unsigned(channels_ln2-1 downto 0));
|
||||||
end bresenham_dp;
|
end bresenham_dp;
|
||||||
|
|
||||||
architecture Behavioral of bresenham_dp is
|
architecture Behavioral of bresenham_dp is
|
||||||
|
|
||||||
signal neg_dx : signed(15 downto 0) := to_signed(0, 16);
|
signal neg_dx : signed(width-1 downto 0) := to_signed(0, width);
|
||||||
signal x1_int : unsigned(15 downto 0) := to_unsigned(0, 16);
|
signal x1_int : unsigned(width-1 downto 0) := to_unsigned(0, width);
|
||||||
type di_a is array(channels-1 downto 0) of signed(15 downto 0);
|
type di_a is array(channels-1 downto 0) of signed(width-1 downto 0);
|
||||||
signal di : di_a := (others => to_signed(0, 16));
|
signal di : di_a := (others => to_signed(0, width));
|
||||||
signal si : std_logic_vector(channels-1 downto 0) := (others => '0');
|
signal si : std_logic_vector(channels-1 downto 0) := (others => '0');
|
||||||
|
|
||||||
signal d_sub_1, d_sub_2 : unsigned(15 downto 0) := to_unsigned(0, 16);
|
signal d_sub_1, d_sub_2 : unsigned(width-1 downto 0) := to_unsigned(0, width);
|
||||||
signal d_sub, d_sub_abs : signed(15 downto 0) := to_signed(0, 16);
|
signal d_sub, d_sub_abs : signed(width-1 downto 0) := to_signed(0, width);
|
||||||
|
|
||||||
type err_a is array(channels-1 downto 0) of signed(15 downto 0);
|
type err_a is array(channels-1 downto 0) of signed(width-1 downto 0);
|
||||||
signal err : err_a := (others => to_signed(0, 16));
|
signal err : err_a := (others => to_signed(0, width));
|
||||||
signal err_next : signed(15 downto 0) := to_signed(0, 16);
|
signal err_next : signed(width-1 downto 0) := to_signed(0, width);
|
||||||
signal err_add_1, err_add_2 : signed(15 downto 0) := to_signed(0, 16);
|
signal err_add_1, err_add_2 : signed(width-1 downto 0) := to_signed(0, width);
|
||||||
signal looping : std_logic := '0';
|
signal looping : std_logic := '0';
|
||||||
signal err_gt_negdx, err_ge_di : std_logic := '0';
|
signal err_gt_negdx, err_ge_di : std_logic := '0';
|
||||||
|
|
||||||
type i_a is array(channels-1 downto 0) of unsigned(15 downto 0);
|
type i_a is array(channels-1 downto 0) of unsigned(width-1 downto 0);
|
||||||
signal i_int : i_a := (others => to_unsigned(0, 16));
|
signal i_int : i_a := (others => to_unsigned(0, width));
|
||||||
signal i_next, i_add : unsigned(15 downto 0) := to_unsigned(0, 16);
|
signal i_next, i_add : unsigned(width-1 downto 0) := to_unsigned(0, width);
|
||||||
|
|
||||||
signal x_int : unsigned(15 downto 0) := to_unsigned(0, 16);
|
signal x_int : unsigned(width-1 downto 0) := to_unsigned(0, width);
|
||||||
|
|
||||||
signal step_done_next, step_done : std_logic_vector(channels-1 downto 0) := (others => '0');
|
signal step_done_next, step_done : std_logic_vector(channels-1 downto 0) := (others => '0');
|
||||||
|
|
||||||
@@ -90,7 +92,7 @@ architecture Behavioral of bresenham_dp is
|
|||||||
begin
|
begin
|
||||||
x_reg : process(clk)
|
x_reg : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
if load_dx = '1' then
|
if load_dx = '1' then
|
||||||
neg_dx <= d_sub;
|
neg_dx <= d_sub;
|
||||||
x1_int <= x1;
|
x1_int <= x1;
|
||||||
@@ -100,7 +102,7 @@ begin
|
|||||||
|
|
||||||
di_reg : process(clk)
|
di_reg : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
if load_di = '1' then
|
if load_di = '1' then
|
||||||
di <= di(channels-2 downto 0) & d_sub_abs;
|
di <= di(channels-2 downto 0) & d_sub_abs;
|
||||||
else
|
else
|
||||||
@@ -111,7 +113,7 @@ begin
|
|||||||
|
|
||||||
si_reg : process(clk)
|
si_reg : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
if load_di = '1' then
|
if load_di = '1' then
|
||||||
si <= si(channels-2 downto 0) & d_sub(d_sub'left);
|
si <= si(channels-2 downto 0) & d_sub(d_sub'left);
|
||||||
else
|
else
|
||||||
@@ -133,7 +135,7 @@ begin
|
|||||||
|
|
||||||
err_reg : process(clk)
|
err_reg : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
err <= err(channels-2 downto 0) & err_next;
|
err <= err(channels-2 downto 0) & err_next;
|
||||||
end if;
|
end if;
|
||||||
end process err_reg;
|
end process err_reg;
|
||||||
@@ -144,7 +146,7 @@ begin
|
|||||||
err_add_2 <= di(channels-1) when init = '1' else
|
err_add_2 <= di(channels-1) when init = '1' else
|
||||||
err(channels-1);
|
err(channels-1);
|
||||||
|
|
||||||
err_next <= err(channels-1) when step_done(to_integer(channel)) = '1' else
|
err_next <= err(channels-1) when step_done(to_integer(channel)) = '1' and init = '0' else
|
||||||
err_add_1 + err_add_2;
|
err_add_1 + err_add_2;
|
||||||
|
|
||||||
err_gt_negdx <= '1' when (err(channels-1) & "0") > neg_dx else
|
err_gt_negdx <= '1' when (err(channels-1) & "0") > neg_dx else
|
||||||
@@ -157,7 +159,7 @@ begin
|
|||||||
|
|
||||||
i_reg : process(clk)
|
i_reg : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
if load_di = '1' or init = '0' then
|
if load_di = '1' or init = '0' then
|
||||||
i_int <= i_int(channels-2 downto 0) & i_next;
|
i_int <= i_int(channels-2 downto 0) & i_next;
|
||||||
end if;
|
end if;
|
||||||
@@ -173,7 +175,7 @@ begin
|
|||||||
|
|
||||||
step_done_reg : process(clk)
|
step_done_reg : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
step_done <= step_done_next;
|
step_done <= step_done_next;
|
||||||
next_step <= next_step_next;
|
next_step <= next_step_next;
|
||||||
end if;
|
end if;
|
||||||
@@ -190,7 +192,7 @@ begin
|
|||||||
|
|
||||||
channel_ctr : process(clk)
|
channel_ctr : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
if init = '1' then
|
if init = '1' then
|
||||||
channel <= to_unsigned(0, channels_ln2);
|
channel <= to_unsigned(0, channels_ln2);
|
||||||
else
|
else
|
||||||
@@ -201,14 +203,14 @@ begin
|
|||||||
|
|
||||||
init_dly_reg : process(clk)
|
init_dly_reg : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
init_dly <= init;
|
init_dly <= init;
|
||||||
end if;
|
end if;
|
||||||
end process init_dly_reg;
|
end process init_dly_reg;
|
||||||
|
|
||||||
x_ctr : process(clk)
|
x_ctr : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
done <= '0';
|
done <= '0';
|
||||||
if load_di = '1' then
|
if load_di = '1' then
|
||||||
x_int <= x0;
|
x_int <= x0;
|
||||||
|
|||||||
333
src/rasterizer.vhd
Normal file
333
src/rasterizer.vhd
Normal file
@@ -0,0 +1,333 @@
|
|||||||
|
----------------------------------------------------------------------------------
|
||||||
|
-- Company:
|
||||||
|
-- Engineer:
|
||||||
|
--
|
||||||
|
-- Create Date: 03/22/2013 05:49:49 PM
|
||||||
|
-- Design Name:
|
||||||
|
-- Module Name: rasterizer - Behavioral
|
||||||
|
-- Project Name:
|
||||||
|
-- Target Devices:
|
||||||
|
-- Tool Versions:
|
||||||
|
-- Description:
|
||||||
|
--
|
||||||
|
-- Dependencies:
|
||||||
|
--
|
||||||
|
-- Revision:
|
||||||
|
-- Revision 0.01 - File Created
|
||||||
|
-- Additional Comments:
|
||||||
|
--
|
||||||
|
----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
library IEEE;
|
||||||
|
use IEEE.STD_LOGIC_1164.ALL;
|
||||||
|
|
||||||
|
-- Uncomment the following library declaration if using
|
||||||
|
-- arithmetic functions with Signed or Unsigned values
|
||||||
|
use IEEE.NUMERIC_STD.ALL;
|
||||||
|
|
||||||
|
-- Uncomment the following library declaration if instantiating
|
||||||
|
-- any Xilinx primitives in this code.
|
||||||
|
--library UNISIM;
|
||||||
|
--use UNISIM.VComponents.all;
|
||||||
|
|
||||||
|
entity rasterizer is
|
||||||
|
generic (
|
||||||
|
dontcare : std_logic := '-';
|
||||||
|
width : integer := 12);
|
||||||
|
port (
|
||||||
|
clk : in std_logic;
|
||||||
|
pause : in std_logic;
|
||||||
|
|
||||||
|
x0, y0 : in unsigned(width-1 downto 0);
|
||||||
|
x1, y1 : in unsigned(width-1 downto 0);
|
||||||
|
x2, y2 : in unsigned(width-1 downto 0);
|
||||||
|
|
||||||
|
a0, a1, a2 : in unsigned(width-1 downto 0);
|
||||||
|
b0, b1, b2 : in unsigned(width-1 downto 0);
|
||||||
|
c0, c1, c2 : in unsigned(width-1 downto 0);
|
||||||
|
z0, z1, z2 : in unsigned(width-1 downto 0);
|
||||||
|
in_valid : in std_logic;
|
||||||
|
in_ready : out std_logic);
|
||||||
|
end rasterizer;
|
||||||
|
|
||||||
|
architecture mixed of rasterizer is
|
||||||
|
signal x0_reg, y0_reg, x1_reg, y1_reg, x2_reg, y2_reg : unsigned(width-1 downto 0);
|
||||||
|
signal a0_reg, a1_reg, a2_reg, b0_reg, b1_reg, b2_reg : unsigned(width-1 downto 0);
|
||||||
|
signal c0_reg, c1_reg, c2_reg, z0_reg, z1_reg, z2_reg : unsigned(width-1 downto 0);
|
||||||
|
signal inregs_full : std_logic := '0';
|
||||||
|
|
||||||
|
signal t_in_valid, t_in_ack : std_logic := '0';
|
||||||
|
|
||||||
|
signal t_pause : std_logic;
|
||||||
|
|
||||||
|
-- Gather output of t rasterizer
|
||||||
|
signal g_y_valid : std_logic := '0';
|
||||||
|
signal g_xl_valid, g_al_valid, g_bl_valid, g_cl_valid, g_zl_valid : std_logic := '0';
|
||||||
|
signal g_xr_valid, g_ar_valid, g_br_valid, g_cr_valid, g_zr_valid : std_logic := '0';
|
||||||
|
signal g_y : unsigned(width-1 downto 0);
|
||||||
|
signal g_xl, g_al, g_bl, g_cl, g_zl : unsigned(width-1 downto 0);
|
||||||
|
signal g_xr, g_ar, g_br, g_cr, g_zr : unsigned(width-1 downto 0);
|
||||||
|
signal g_all_valid, g_move : std_logic := '0';
|
||||||
|
|
||||||
|
-- Inputs for l rasterizer
|
||||||
|
signal l_y, l_x0, l_x1, l_a0, l_a1, l_b0, l_b1, l_c0, l_c1, l_z0, l_z1 : unsigned(width-1 downto 0);
|
||||||
|
signal lregs_full : std_logic := '0';
|
||||||
|
|
||||||
|
signal l_in_valid, l_in_ack : std_logic := '0';
|
||||||
|
|
||||||
|
signal l_pause : std_logic;
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
inregs : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if inregs_full = '0' and in_valid = '1' then
|
||||||
|
inregs_full <= '1';
|
||||||
|
y0_reg <= y0;
|
||||||
|
y1_reg <= y1;
|
||||||
|
y2_reg <= y2;
|
||||||
|
x0_reg <= x0;
|
||||||
|
x1_reg <= x1;
|
||||||
|
x2_reg <= x2;
|
||||||
|
a0_reg <= a0;
|
||||||
|
a1_reg <= a1;
|
||||||
|
a2_reg <= a2;
|
||||||
|
b0_reg <= b0;
|
||||||
|
b1_reg <= b1;
|
||||||
|
b2_reg <= b2;
|
||||||
|
c0_reg <= c0;
|
||||||
|
c1_reg <= c1;
|
||||||
|
c2_reg <= c2;
|
||||||
|
z0_reg <= z0;
|
||||||
|
z1_reg <= z1;
|
||||||
|
z2_reg <= z2;
|
||||||
|
elsif inregs_full = '1' and t_in_ack = '1' then
|
||||||
|
inregs_full <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process inregs;
|
||||||
|
|
||||||
|
in_ready <= not inregs_full;
|
||||||
|
t_in_valid <= inregs_full;
|
||||||
|
|
||||||
|
rasterizer_t_1: entity work.rasterizer_t
|
||||||
|
generic map (
|
||||||
|
dontcare => dontcare,
|
||||||
|
width => width)
|
||||||
|
port map (
|
||||||
|
clk => clk,
|
||||||
|
pause => t_pause,
|
||||||
|
x0 => x0_reg,
|
||||||
|
y0 => y0_reg,
|
||||||
|
x1 => x1_reg,
|
||||||
|
y1 => y1_reg,
|
||||||
|
x2 => x2_reg,
|
||||||
|
y2 => y2_reg,
|
||||||
|
a0 => a0_reg,
|
||||||
|
a1 => a1_reg,
|
||||||
|
a2 => a2_reg,
|
||||||
|
b0 => b0_reg,
|
||||||
|
b1 => b1_reg,
|
||||||
|
b2 => b2_reg,
|
||||||
|
c0 => c0_reg,
|
||||||
|
c1 => c1_reg,
|
||||||
|
c2 => c2_reg,
|
||||||
|
z0 => z0_reg,
|
||||||
|
z1 => z1_reg,
|
||||||
|
z2 => z2_reg,
|
||||||
|
in_valid => t_in_valid,
|
||||||
|
in_ack => t_in_ack,
|
||||||
|
y => y,
|
||||||
|
xl => xl,
|
||||||
|
al => al,
|
||||||
|
bl => bl,
|
||||||
|
cl => cl,
|
||||||
|
zl => zl,
|
||||||
|
xr => xr,
|
||||||
|
ar => ar,
|
||||||
|
br => br,
|
||||||
|
cr => cr,
|
||||||
|
zr => zr,
|
||||||
|
y_valid => y_valid,
|
||||||
|
xl_valid => xl_valid,
|
||||||
|
al_valid => al_valid,
|
||||||
|
bl_valid => bl_valid,
|
||||||
|
cl_valid => cl_valid,
|
||||||
|
zl_valid => zl_valid,
|
||||||
|
xr_valid => xr_valid,
|
||||||
|
ar_valid => ar_valid,
|
||||||
|
br_valid => br_valid,
|
||||||
|
cr_valid => cr_valid,
|
||||||
|
zr_valid => zr_valid);
|
||||||
|
|
||||||
|
g_y_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if y_valid = '1' then
|
||||||
|
g_y_valid <= '1';
|
||||||
|
g_y <= y;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_y_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_y_reg;
|
||||||
|
|
||||||
|
g_xl_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if xl_valid = '1' then
|
||||||
|
g_xl_valid <= '1';
|
||||||
|
g_xl <= xl;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_xl_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_xl_reg;
|
||||||
|
|
||||||
|
g_al_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if al_valid = '1' then
|
||||||
|
g_al_valid <= '1';
|
||||||
|
g_al <= al;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_al_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_al_reg;
|
||||||
|
|
||||||
|
g_bl_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if bl_valid = '1' then
|
||||||
|
g_bl_valid <= '1';
|
||||||
|
g_bl <= bl;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_bl_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_bl_reg;
|
||||||
|
|
||||||
|
g_cl_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if cl_valid = '1' then
|
||||||
|
g_cl_valid <= '1';
|
||||||
|
g_cl <= cl;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_cl_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_cl_reg;
|
||||||
|
|
||||||
|
g_zl_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if zl_valid = '1' then
|
||||||
|
g_zl_valid <= '1';
|
||||||
|
g_zl <= zl;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_zl_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_zl_reg;
|
||||||
|
|
||||||
|
g_xr_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if xr_valid = '1' then
|
||||||
|
g_xr_valid <= '1';
|
||||||
|
g_xr <= xr;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_xr_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_xr_reg;
|
||||||
|
|
||||||
|
g_ar_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if ar_valid = '1' then
|
||||||
|
g_ar_valid <= '1';
|
||||||
|
g_ar <= ar;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_ar_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_ar_reg;
|
||||||
|
|
||||||
|
g_br_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if br_valid = '1' then
|
||||||
|
g_br_valid <= '1';
|
||||||
|
g_br <= br;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_br_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_br_reg;
|
||||||
|
|
||||||
|
g_cr_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if cr_valid = '1' then
|
||||||
|
g_cr_valid <= '1';
|
||||||
|
g_cr <= cl;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_cr_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_cr_reg;
|
||||||
|
|
||||||
|
g_zr_reg : process(clk)
|
||||||
|
begin
|
||||||
|
if rising_edge(clk) then
|
||||||
|
if zr_valid = '1' then
|
||||||
|
g_zr_valid <= '1';
|
||||||
|
g_zr <= zr;
|
||||||
|
elsif g_move = '1' then
|
||||||
|
g_zr_valid <= '0';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end process g_zr_reg;
|
||||||
|
|
||||||
|
t_pause <= (g_y_valid and y_valid) or (g_xl_valid and xl_valid) or (g_al_valid and al_valid) or
|
||||||
|
(g_bl_valid and bl_valid) or (g_cl_valid and cl_valid) or (g_zl_valid and tl_valid);
|
||||||
|
|
||||||
|
g_all_valid <= g_y_valid and g_xl_valid and g_al_valid and g_bl_valid and g_cl_valid and g_zl_valid and
|
||||||
|
g_xr_valid and g_ar_valid and g_br_valid and g_cr_valid and g_zr_valid;
|
||||||
|
|
||||||
|
rasterizer_l_1: entity work.rasterizer_l
|
||||||
|
generic map (
|
||||||
|
dontcare => dontcare,
|
||||||
|
width => width)
|
||||||
|
port map (
|
||||||
|
clk => clk,
|
||||||
|
pause => t_pause,
|
||||||
|
x0 => l_x0,
|
||||||
|
x1 => l_x1,
|
||||||
|
a0 => l_a0,
|
||||||
|
a1 => l_a1,
|
||||||
|
b0 => l_b0,
|
||||||
|
b1 => l_b1,
|
||||||
|
c0 => l_c0,
|
||||||
|
c1 => l_c1,
|
||||||
|
z0 => l_z0,
|
||||||
|
z1 => l_z1,
|
||||||
|
in_valid => l_in_valid,
|
||||||
|
in_ack => l_in_ack,
|
||||||
|
x => x,
|
||||||
|
a => a,
|
||||||
|
b => b,
|
||||||
|
c => c,
|
||||||
|
z => z,
|
||||||
|
x_valid => x_valid,
|
||||||
|
a_valid => a_valid,
|
||||||
|
b_valid => b_valid,
|
||||||
|
c_valid => c_valid,
|
||||||
|
z_valid => z_valid);
|
||||||
|
|
||||||
|
end mixed;
|
||||||
@@ -33,25 +33,27 @@ use IEEE.NUMERIC_STD.ALL;
|
|||||||
|
|
||||||
entity rasterizer_l is
|
entity rasterizer_l is
|
||||||
generic (
|
generic (
|
||||||
dontcare : std_logic := '-');
|
dontcare : std_logic := '-';
|
||||||
|
width : integer := 12);
|
||||||
port (
|
port (
|
||||||
clk : in std_logic;
|
clk : in std_logic;
|
||||||
|
pause : in std_logic;
|
||||||
|
|
||||||
x0, x1 : in unsigned(15 downto 0);
|
x0, x1 : in unsigned(width-1 downto 0);
|
||||||
a0, a1 : in unsigned(15 downto 0);
|
a0, a1 : in unsigned(width-1 downto 0);
|
||||||
b0, b1 : in unsigned(15 downto 0);
|
b0, b1 : in unsigned(width-1 downto 0);
|
||||||
c0, c1 : in unsigned(15 downto 0);
|
c0, c1 : in unsigned(width-1 downto 0);
|
||||||
z0, z1 : in unsigned(15 downto 0);
|
z0, z1 : in unsigned(width-1 downto 0);
|
||||||
in_valid : in std_logic;
|
in_valid : in std_logic;
|
||||||
in_ack : out std_logic;
|
in_ack : out std_logic;
|
||||||
|
|
||||||
x, a, b,c, z : out unsigned(15 downto 0);
|
x, a, b,c, z : out unsigned(width-1 downto 0);
|
||||||
x_valid, a_valid, b_valid, c_valid, z_valid : out std_logic);
|
x_valid, a_valid, b_valid, c_valid, z_valid : out std_logic);
|
||||||
end rasterizer_l;
|
end rasterizer_l;
|
||||||
|
|
||||||
architecture mixed of rasterizer_l is
|
architecture mixed of rasterizer_l is
|
||||||
signal bh_x: unsigned(15 downto 0);
|
signal bh_x: unsigned(width-1 downto 0);
|
||||||
signal bh_i, bh_i0, bh_i1 : unsigned(15 downto 0);
|
signal bh_i, bh_i0, bh_i1 : unsigned(width-1 downto 0);
|
||||||
signal bh_load_dx, bh_load_di, bh_init, bh_valid, bh_next_x, bh_done, bh_out_en : std_logic;
|
signal bh_load_dx, bh_load_di, bh_init, bh_valid, bh_next_x, bh_done, bh_out_en : std_logic;
|
||||||
signal bh_ch, load_ch : unsigned(1 downto 0);
|
signal bh_ch, load_ch : unsigned(1 downto 0);
|
||||||
|
|
||||||
@@ -72,6 +74,7 @@ begin
|
|||||||
dontcare => dontcare)
|
dontcare => dontcare)
|
||||||
port map (
|
port map (
|
||||||
clk => clk,
|
clk => clk,
|
||||||
|
pause => pause,
|
||||||
in_valid => in_valid,
|
in_valid => in_valid,
|
||||||
bh_done => bh_done,
|
bh_done => bh_done,
|
||||||
bh_load_dx => bh_load_dx,
|
bh_load_dx => bh_load_dx,
|
||||||
@@ -87,9 +90,11 @@ begin
|
|||||||
generic map (
|
generic map (
|
||||||
channels => 4,
|
channels => 4,
|
||||||
channels_ln2 => 2,
|
channels_ln2 => 2,
|
||||||
preinc_x => false)
|
preinc_x => false,
|
||||||
|
width => width)
|
||||||
port map (
|
port map (
|
||||||
clk => clk,
|
clk => clk,
|
||||||
|
pause => pause,
|
||||||
x0 => x0,
|
x0 => x0,
|
||||||
x1 => x1,
|
x1 => x1,
|
||||||
i0 => bh_i0,
|
i0 => bh_i0,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ entity rasterizer_l_fsm is
|
|||||||
dontcare : std_logic := '-');
|
dontcare : std_logic := '-');
|
||||||
port (
|
port (
|
||||||
clk : in std_logic;
|
clk : in std_logic;
|
||||||
|
pause : in std_logic;
|
||||||
|
|
||||||
in_valid : in std_logic;
|
in_valid : in std_logic;
|
||||||
bh_done : in std_logic;
|
bh_done : in std_logic;
|
||||||
@@ -59,7 +60,7 @@ begin
|
|||||||
|
|
||||||
fsm : process(clk)
|
fsm : process(clk)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk) then
|
if rising_edge(clk) and pause = '0' then
|
||||||
bh_load_dx <= '0';
|
bh_load_dx <= '0';
|
||||||
bh_load_di <= '0';
|
bh_load_di <= '0';
|
||||||
bh_init <= '0';
|
bh_init <= '0';
|
||||||
|
|||||||
303
src/rasterizer_t.vhd
Normal file
303
src/rasterizer_t.vhd
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
----------------------------------------------------------------------------------
|
||||||
|
-- Company:
|
||||||
|
-- Engineer:
|
||||||
|
--
|
||||||
|
-- Create Date: 03/22/2013 05:49:49 PM
|
||||||
|
-- Design Name:
|
||||||
|
-- Module Name: rasterizer_t - Behavioral
|
||||||
|
-- Project Name:
|
||||||
|
-- Target Devices:
|
||||||
|
-- Tool Versions:
|
||||||
|
-- Description:
|
||||||
|
--
|
||||||
|
-- Dependencies:
|
||||||
|
--
|
||||||
|
-- Revision:
|
||||||
|
-- Revision 0.01 - File Created
|
||||||
|
-- Additional Comments:
|
||||||
|
--
|
||||||
|
----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
library IEEE;
|
||||||
|
use IEEE.STD_LOGIC_1164.ALL;
|
||||||
|
|
||||||
|
-- Uncomment the following library declaration if using
|
||||||
|
-- arithmetic functions with Signed or Unsigned values
|
||||||
|
use IEEE.NUMERIC_STD.ALL;
|
||||||
|
|
||||||
|
-- Uncomment the following library declaration if instantiating
|
||||||
|
-- any Xilinx primitives in this code.
|
||||||
|
--library UNISIM;
|
||||||
|
--use UNISIM.VComponents.all;
|
||||||
|
|
||||||
|
entity rasterizer_t is
|
||||||
|
generic (
|
||||||
|
dontcare : std_logic := '-';
|
||||||
|
width : integer := 12);
|
||||||
|
port (
|
||||||
|
clk : in std_logic;
|
||||||
|
pause : in std_logic;
|
||||||
|
|
||||||
|
x0, y0 : in unsigned(width-1 downto 0);
|
||||||
|
x1, y1 : in unsigned(width-1 downto 0);
|
||||||
|
x2, y2 : in unsigned(width-1 downto 0);
|
||||||
|
|
||||||
|
a0, a1, a2 : in unsigned(width-1 downto 0);
|
||||||
|
b0, b1, b2 : in unsigned(width-1 downto 0);
|
||||||
|
c0, c1, c2 : in unsigned(width-1 downto 0);
|
||||||
|
z0, z1, z2 : in unsigned(width-1 downto 0);
|
||||||
|
in_valid : in std_logic;
|
||||||
|
in_ack : out std_logic;
|
||||||
|
|
||||||
|
y : out unsigned(width-1 downto 0);
|
||||||
|
xl, al, bl, cl, zl : out unsigned(width-1 downto 0);
|
||||||
|
xr, ar, br, cr, zr : out unsigned(width-1 downto 0);
|
||||||
|
y_valid : out std_logic;
|
||||||
|
xl_valid, al_valid, bl_valid, cl_valid, zl_valid : out std_logic;
|
||||||
|
xr_valid, ar_valid, br_valid, cr_valid, zr_valid : out std_logic);
|
||||||
|
end rasterizer_t;
|
||||||
|
|
||||||
|
architecture mixed of rasterizer_t is
|
||||||
|
signal l_sel0, l_sel1, r_sel0, r_sel1 : unsigned(1 downto 0) := to_unsigned(0, 2);
|
||||||
|
signal load_ch : unsigned(2 downto 0) := to_unsigned(0, 3);
|
||||||
|
signal outl_end, outr_end : std_logic;
|
||||||
|
signal bhl_out_en, bhr_out_en : std_logic;
|
||||||
|
|
||||||
|
signal x0l, a0l, b0l, c0l, z0l : unsigned(width-1 downto 0);
|
||||||
|
signal x1l, a1l, b1l, c1l, z1l : unsigned(width-1 downto 0);
|
||||||
|
signal x0r, a0r, b0r, c0r, z0r : unsigned(width-1 downto 0);
|
||||||
|
signal x1r, a1r, b1r, c1r, z1r : unsigned(width-1 downto 0);
|
||||||
|
|
||||||
|
signal bhl_y0, bhl_y1, bhr_y0, bhr_y1 : unsigned(width-1 downto 0);
|
||||||
|
signal bhl_i0, bhl_i1, bhr_i0, bhr_i1 : unsigned(width-1 downto 0);
|
||||||
|
|
||||||
|
signal bhl_i, bhl_y, bhr_i, bhr_y : unsigned(width-1 downto 0);
|
||||||
|
signal bhl_load_dy, bhl_load_di, bhl_init, bhl_next_y, bhl_i_valid, bhl_done : std_logic;
|
||||||
|
signal bhr_load_dy, bhr_load_di, bhr_init, bhr_next_y, bhr_i_valid, bhr_done : std_logic;
|
||||||
|
signal bhl_ch, bhr_ch : unsigned(2 downto 0);
|
||||||
|
begin
|
||||||
|
|
||||||
|
rasterizer_t_fsm_1: entity work.rasterizer_t_fsm
|
||||||
|
generic map (
|
||||||
|
dontcare => dontcare)
|
||||||
|
port map (
|
||||||
|
clk => clk,
|
||||||
|
pause => pause,
|
||||||
|
in_valid => in_valid,
|
||||||
|
in_ack => in_ack,
|
||||||
|
l_sel0 => l_sel0,
|
||||||
|
l_sel1 => l_sel1,
|
||||||
|
r_sel0 => r_sel0,
|
||||||
|
r_sel1 => r_sel1,
|
||||||
|
load_ch => load_ch,
|
||||||
|
outl_end => outl_end,
|
||||||
|
outr_end => outr_end,
|
||||||
|
bhl_out_en => bhl_out_en,
|
||||||
|
bhr_out_en => bhr_out_en,
|
||||||
|
bhl_load_dy => bhl_load_dy,
|
||||||
|
bhl_load_di => bhl_load_di,
|
||||||
|
bhl_init => bhl_init,
|
||||||
|
bhl_next_y => bhl_next_y,
|
||||||
|
bhl_i_valid => bhl_i_valid,
|
||||||
|
bhl_done => bhl_done,
|
||||||
|
bhr_load_dy => bhr_load_dy,
|
||||||
|
bhr_load_di => bhr_load_di,
|
||||||
|
bhr_init => bhr_init,
|
||||||
|
bhr_next_y => bhr_next_y,
|
||||||
|
bhr_i_valid => bhr_i_valid,
|
||||||
|
bhr_done => bhr_done);
|
||||||
|
|
||||||
|
bhl_y0 <= y0 when l_sel0 = 0 else
|
||||||
|
y1;-- when l_sel0 = 1 else (others => dontcare);
|
||||||
|
|
||||||
|
bhl_y1 <= y1 when l_sel1 = 1 else
|
||||||
|
y2;-- when l_sel1 = 2 else (others => dontcare);
|
||||||
|
|
||||||
|
bhr_y0 <= y0 when r_sel0 = 0 else
|
||||||
|
y1;-- when r_sel0 = 1 else (others => dontcare);
|
||||||
|
|
||||||
|
bhr_y1 <= y1 when r_sel1 = 1 else
|
||||||
|
y2;-- when r_sel1 = 2 else (others => dontcare);
|
||||||
|
|
||||||
|
x0l <= x0 when l_sel0 = 0 else
|
||||||
|
x1;
|
||||||
|
a0l <= a0 when l_sel0 = 0 else
|
||||||
|
a1;
|
||||||
|
b0l <= b0 when l_sel0 = 0 else
|
||||||
|
b1;
|
||||||
|
c0l <= c0 when l_sel0 = 0 else
|
||||||
|
c1;
|
||||||
|
z0l <= z0 when l_sel0 = 0 else
|
||||||
|
z1;
|
||||||
|
bhl_i0 <= x0l when load_ch = 0 else
|
||||||
|
a0l when load_ch = 1 else
|
||||||
|
b0l when load_ch = 2 else
|
||||||
|
c0l when load_ch = 3 else
|
||||||
|
z0l;-- when load_ch = 4 else (others => dontcare);
|
||||||
|
|
||||||
|
x1l <= x1 when l_sel1 = 1 else
|
||||||
|
x2;
|
||||||
|
a1l <= a1 when l_sel1 = 1 else
|
||||||
|
a2;
|
||||||
|
b1l <= b1 when l_sel1 = 1 else
|
||||||
|
b2;
|
||||||
|
c1l <= c1 when l_sel1 = 1 else
|
||||||
|
c2;
|
||||||
|
z1l <= z1 when l_sel1 = 1 else
|
||||||
|
z2;
|
||||||
|
bhl_i1 <= x1l when load_ch = 0 else
|
||||||
|
a1l when load_ch = 1 else
|
||||||
|
b1l when load_ch = 2 else
|
||||||
|
c1l when load_ch = 3 else
|
||||||
|
z1l;-- when load_ch = 4 else (others => dontcare);
|
||||||
|
|
||||||
|
x0r <= x0 when r_sel0 = 0 else
|
||||||
|
x1;
|
||||||
|
a0r <= a0 when r_sel0 = 0 else
|
||||||
|
a1;
|
||||||
|
b0r <= b0 when r_sel0 = 0 else
|
||||||
|
b1;
|
||||||
|
c0r <= c0 when r_sel0 = 0 else
|
||||||
|
c1;
|
||||||
|
z0r <= z0 when r_sel0 = 0 else
|
||||||
|
z1;
|
||||||
|
bhr_i0 <= x0r when load_ch = 0 else
|
||||||
|
a0r when load_ch = 1 else
|
||||||
|
b0r when load_ch = 2 else
|
||||||
|
c0r when load_ch = 3 else
|
||||||
|
z0r;-- when load_ch = 4 else (others => dontcare);
|
||||||
|
|
||||||
|
x1r <= x1 when r_sel1 = 1 else
|
||||||
|
x2;
|
||||||
|
a1r <= a1 when r_sel1 = 1 else
|
||||||
|
a2;
|
||||||
|
b1r <= b1 when r_sel1 = 1 else
|
||||||
|
b2;
|
||||||
|
c1r <= c1 when r_sel1 = 1 else
|
||||||
|
c2;
|
||||||
|
z1r <= z1 when r_sel1 = 1 else
|
||||||
|
z2;
|
||||||
|
bhr_i1 <= x1r when load_ch = 0 else
|
||||||
|
a1r when load_ch = 1 else
|
||||||
|
b1r when load_ch = 2 else
|
||||||
|
c1r when load_ch = 3 else
|
||||||
|
z1r;-- when load_ch = 4 else (others => dontcare);
|
||||||
|
|
||||||
|
bresenham_dp_l: entity work.bresenham_dp
|
||||||
|
generic map (
|
||||||
|
channels => 5,
|
||||||
|
channels_ln2 => 3,
|
||||||
|
preinc_x => false,
|
||||||
|
width => width)
|
||||||
|
port map (
|
||||||
|
clk => clk,
|
||||||
|
pause => pause,
|
||||||
|
x0 => bhl_y0,
|
||||||
|
x1 => bhl_y1,
|
||||||
|
i0 => bhl_i0,
|
||||||
|
i1 => bhl_i1,
|
||||||
|
load_dx => bhl_load_dy,
|
||||||
|
load_di => bhl_load_di,
|
||||||
|
init => bhl_init,
|
||||||
|
next_x => bhl_next_y,
|
||||||
|
i_valid => bhl_i_valid,
|
||||||
|
done => bhl_done,
|
||||||
|
i => bhl_i,
|
||||||
|
x => bhl_y,
|
||||||
|
ch => bhl_ch);
|
||||||
|
|
||||||
|
bresenham_dp_r: entity work.bresenham_dp
|
||||||
|
generic map (
|
||||||
|
channels => 5,
|
||||||
|
channels_ln2 => 3,
|
||||||
|
preinc_x => false,
|
||||||
|
width => width)
|
||||||
|
port map (
|
||||||
|
clk => clk,
|
||||||
|
pause => pause,
|
||||||
|
x0 => bhr_y0,
|
||||||
|
x1 => bhr_y1,
|
||||||
|
i0 => bhr_i0,
|
||||||
|
i1 => bhr_i1,
|
||||||
|
load_dx => bhr_load_dy,
|
||||||
|
load_di => bhr_load_di,
|
||||||
|
init => bhr_init,
|
||||||
|
next_x => bhr_next_y,
|
||||||
|
i_valid => bhr_i_valid,
|
||||||
|
done => bhr_done,
|
||||||
|
i => bhr_i,
|
||||||
|
x => bhr_y,
|
||||||
|
ch => bhr_ch);
|
||||||
|
|
||||||
|
y <= y1 when l_sel1 = 1 and outl_end = '1' else
|
||||||
|
y2 when l_sel1 = 2 and outl_end = '1' else
|
||||||
|
bhl_y;
|
||||||
|
|
||||||
|
xl <= x1 when l_sel1 = 1 and outl_end = '1' else
|
||||||
|
x2 when l_sel1 = 2 and outl_end = '1' else
|
||||||
|
bhl_i;
|
||||||
|
al <= a1 when l_sel1 = 1 and outl_end = '1' else
|
||||||
|
a2 when l_sel1 = 2 and outl_end = '1' else
|
||||||
|
bhl_i;
|
||||||
|
bl <= b1 when l_sel1 = 1 and outl_end = '1' else
|
||||||
|
b2 when l_sel1 = 2 and outl_end = '1' else
|
||||||
|
bhl_i;
|
||||||
|
cl <= c1 when l_sel1 = 1 and outl_end = '1' else
|
||||||
|
c2 when l_sel1 = 2 and outl_end = '1' else
|
||||||
|
bhl_i;
|
||||||
|
zl <= z1 when l_sel1 = 1 and outl_end = '1' else
|
||||||
|
z2 when l_sel1 = 2 and outl_end = '1' else
|
||||||
|
bhl_i;
|
||||||
|
|
||||||
|
xr <= x1 when r_sel1 = 1 and outr_end = '1' else
|
||||||
|
x2 when r_sel1 = 2 and outr_end = '1' else
|
||||||
|
bhr_i;
|
||||||
|
ar <= a1 when r_sel1 = 1 and outr_end = '1' else
|
||||||
|
a2 when r_sel1 = 2 and outr_end = '1' else
|
||||||
|
bhr_i;
|
||||||
|
br <= b1 when r_sel1 = 1 and outr_end = '1' else
|
||||||
|
b2 when r_sel1 = 2 and outr_end = '1' else
|
||||||
|
bhr_i;
|
||||||
|
cr <= c1 when r_sel1 = 1 and outr_end = '1' else
|
||||||
|
c2 when r_sel1 = 2 and outr_end = '1' else
|
||||||
|
bhr_i;
|
||||||
|
zr <= z1 when r_sel1 = 1 and outr_end = '1' else
|
||||||
|
z2 when r_sel1 = 2 and outr_end = '1' else
|
||||||
|
bhr_i;
|
||||||
|
|
||||||
|
y_valid <= outl_end or (bhl_next_y and bhl_out_en);
|
||||||
|
|
||||||
|
xl_valid <= '1' when outl_end = '1' else
|
||||||
|
bhl_i_valid and bhl_out_en when bhl_ch = 0 else
|
||||||
|
'0';
|
||||||
|
al_valid <= '1' when outl_end = '1' else
|
||||||
|
bhl_i_valid and bhl_out_en when bhl_ch = 1 else
|
||||||
|
'0';
|
||||||
|
bl_valid <= '1' when outl_end = '1' else
|
||||||
|
bhl_i_valid and bhl_out_en when bhl_ch = 2 else
|
||||||
|
'0';
|
||||||
|
cl_valid <= '1' when outl_end = '1' else
|
||||||
|
bhl_i_valid and bhl_out_en when bhl_ch = 3 else
|
||||||
|
'0';
|
||||||
|
zl_valid <= '1' when outl_end = '1' else
|
||||||
|
bhl_i_valid and bhl_out_en when bhl_ch = 4 else
|
||||||
|
'0';
|
||||||
|
|
||||||
|
xr_valid <= '1' when outr_end = '1' else
|
||||||
|
bhr_i_valid and bhr_out_en when bhr_ch = 0 else
|
||||||
|
'0';
|
||||||
|
ar_valid <= '1' when outr_end = '1' else
|
||||||
|
bhr_i_valid and bhr_out_en when bhr_ch = 1 else
|
||||||
|
'0';
|
||||||
|
br_valid <= '1' when outr_end = '1' else
|
||||||
|
bhr_i_valid and bhr_out_en when bhr_ch = 2 else
|
||||||
|
'0';
|
||||||
|
cr_valid <= '1' when outr_end = '1' else
|
||||||
|
bhr_i_valid and bhr_out_en when bhr_ch = 3 else
|
||||||
|
'0';
|
||||||
|
zr_valid <= '1' when outr_end = '1' else
|
||||||
|
bhr_i_valid and bhr_out_en when bhr_ch = 4 else
|
||||||
|
'0';
|
||||||
|
|
||||||
|
end mixed;
|
||||||
58
src/rasterizer_t_fsm.vhd
Normal file
58
src/rasterizer_t_fsm.vhd
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
----------------------------------------------------------------------------------
|
||||||
|
-- Company:
|
||||||
|
-- Engineer:
|
||||||
|
--
|
||||||
|
-- Create Date: 03/22/2013 05:49:49 PM
|
||||||
|
-- Design Name:
|
||||||
|
-- Module Name: rasterizer_t_fsm - Behavioral
|
||||||
|
-- Project Name:
|
||||||
|
-- Target Devices:
|
||||||
|
-- Tool Versions:
|
||||||
|
-- Description:
|
||||||
|
--
|
||||||
|
-- Dependencies:
|
||||||
|
--
|
||||||
|
-- Revision:
|
||||||
|
-- Revision 0.01 - File Created
|
||||||
|
-- Additional Comments:
|
||||||
|
--
|
||||||
|
----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
library IEEE;
|
||||||
|
use IEEE.STD_LOGIC_1164.ALL;
|
||||||
|
|
||||||
|
-- Uncomment the following library declaration if using
|
||||||
|
-- arithmetic functions with Signed or Unsigned values
|
||||||
|
use IEEE.NUMERIC_STD.ALL;
|
||||||
|
|
||||||
|
-- Uncomment the following library declaration if instantiating
|
||||||
|
-- any Xilinx primitives in this code.
|
||||||
|
--library UNISIM;
|
||||||
|
--use UNISIM.VComponents.all;
|
||||||
|
|
||||||
|
entity rasterizer_t_fsm is
|
||||||
|
generic (
|
||||||
|
dontcare : std_logic := '-');
|
||||||
|
port (
|
||||||
|
clk : in std_logic;
|
||||||
|
pause : in std_logic;
|
||||||
|
|
||||||
|
in_valid : in std_logic;
|
||||||
|
in_ack : out std_logic;
|
||||||
|
|
||||||
|
l_sel0, l_sel1, r_sel0, r_sel1 : out unsigned(1 downto 0);
|
||||||
|
load_ch : out unsigned(2 downto 0);
|
||||||
|
outl_end, outr_end : out std_logic;
|
||||||
|
bhl_out_en, bhr_out_en : out std_logic;
|
||||||
|
|
||||||
|
bhl_load_dy, bhl_load_di, bhl_init : out std_logic;
|
||||||
|
bhl_next_y, bhl_i_valid, bhl_done : in std_logic;
|
||||||
|
bhr_load_dy, bhr_load_di, bhr_init : out std_logic;
|
||||||
|
bhr_next_y, bhr_i_valid, bhr_done : in std_logic);
|
||||||
|
end rasterizer_t_fsm;
|
||||||
|
|
||||||
|
architecture behavioral of rasterizer_t_fsm is
|
||||||
|
begin
|
||||||
|
|
||||||
|
end behavioral;
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
-- Author : Matthias Blankertz <matthias@matthias-tp>
|
-- Author : Matthias Blankertz <matthias@matthias-tp>
|
||||||
-- Company :
|
-- Company :
|
||||||
-- Created : 2013-03-26
|
-- Created : 2013-03-26
|
||||||
-- Last update: 2013-03-26
|
-- Last update: 2013-03-27
|
||||||
-- Platform :
|
-- Platform :
|
||||||
-- Standard : VHDL'93/02
|
-- Standard : VHDL'93/02
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
@@ -48,6 +48,8 @@ architecture testbench of rasterizer_l_tb is
|
|||||||
signal x, a, b, c, z : unsigned(15 downto 0);
|
signal x, a, b, c, z : unsigned(15 downto 0);
|
||||||
signal x_valid, a_valid, b_valid, c_valid, z_valid : std_logic;
|
signal x_valid, a_valid, b_valid, c_valid, z_valid : std_logic;
|
||||||
|
|
||||||
|
signal sim_done : boolean := false;
|
||||||
|
|
||||||
begin -- architecture testbench
|
begin -- architecture testbench
|
||||||
|
|
||||||
-- component instantiation
|
-- component instantiation
|
||||||
@@ -80,7 +82,8 @@ begin -- architecture testbench
|
|||||||
z_valid => z_valid);
|
z_valid => z_valid);
|
||||||
|
|
||||||
-- clock generation
|
-- clock generation
|
||||||
clk <= not clk after 10 ns;
|
clk <= not clk after 10 ns when not sim_done else
|
||||||
|
'0';
|
||||||
|
|
||||||
-- waveform generation
|
-- waveform generation
|
||||||
WaveGen_Proc: process
|
WaveGen_Proc: process
|
||||||
@@ -120,6 +123,13 @@ begin -- architecture testbench
|
|||||||
in_valid <= '1';
|
in_valid <= '1';
|
||||||
wait until rising_edge(clk);
|
wait until rising_edge(clk);
|
||||||
|
|
||||||
|
while in_ack = '0' loop
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
end loop;
|
||||||
|
in_valid <= '0';
|
||||||
|
wait until rising_edge(clk);
|
||||||
|
|
||||||
|
sim_done <= true;
|
||||||
|
|
||||||
wait;
|
wait;
|
||||||
end process WaveGen_Proc;
|
end process WaveGen_Proc;
|
||||||
|
|||||||
Reference in New Issue
Block a user