📄 vgactr.vhd
字号:
LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_signed.all;ENTITY vgactr IS PORT ( clkin : IN STD_LOGIC; IIN : IN STD_LOGIC_VECTOR(13 DOWNTO 0); QIN : IN STD_LOGIC_VECTOR(13 DOWNTO 0); SUP : OUT STD_LOGIC; AVGUP : OUT STD_LOGIC; AVGDOWN : OUT STD_LOGIC --test : OUT STD_LOGIC--_VECTOR(27 DOWNTO 0) );END vgactr;ARCHITECTURE rtl OF vgactr IS SIGNAL downSPen : STD_LOGIC; SIGNAL itemp : STD_LOGIC_VECTOR (13 DOWNTO 0) := (OTHERS => '0'); SIGNAL qtemp : STD_LOGIC_VECTOR (13 DOWNTO 0) := (OTHERS => '0'); SIGNAL squ1 : STD_LOGIC_VECTOR (27 DOWNTO 0) := (OTHERS => '0'); SIGNAL squ2 : STD_LOGIC_VECTOR (27 DOWNTO 0) := (OTHERS => '0'); SIGNAL squ1temp : STD_LOGIC_VECTOR (27 DOWNTO 0) := (OTHERS => '0'); SIGNAL squ2temp : STD_LOGIC_VECTOR (27 DOWNTO 0) := (OTHERS => '0'); SIGNAL ssum : STD_LOGIC_VECTOR (27 DOWNTO 0) := (OTHERS => '0'); SIGNAL totalp : STD_LOGIC_VECTOR (39 DOWNTO 0) := (OTHERS => '0'); SIGNAL pavg : STD_LOGIC_VECTOR (27 DOWNTO 0) := (OTHERS => '0'); SIGNAL suptmp : STD_LOGIC; SIGNAL avguptmp : STD_LOGIC; SIGNAL avgdowntmp: STD_LOGIC; SIGNAL keep : STD_LOGIC; SIGNAL count : STD_LOGIC_VECTOR (24 DOWNTO 0) := (OTHERS => '0');--24--8 SIGNAL num : INTEGER := 0; COMPONENT lpm_mult GENERIC ( lpm_widtha : NATURAL; lpm_widthb : NATURAL; lpm_widthp : NATURAL; lpm_widths : NATURAL; lpm_type : STRING; lpm_representation : STRING; lpm_hint : STRING ); PORT ( dataa : IN STD_LOGIC_VECTOR (lpm_widtha-1 DOWNTO 0); datab : IN STD_LOGIC_VECTOR (lpm_widthb-1 DOWNTO 0); result : OUT STD_LOGIC_VECTOR (lpm_widthp-1 DOWNTO 0) ); END COMPONENT; COMPONENT lpm_add_sub GENERIC ( lpm_width : NATURAL; lpm_direction : STRING; lpm_type : STRING; lpm_hint : STRING ); PORT ( dataa : IN STD_LOGIC_VECTOR (lpm_width-1 DOWNTO 0); datab : IN STD_LOGIC_VECTOR (lpm_width-1 DOWNTO 0); result : OUT STD_LOGIC_VECTOR (lpm_width-1 DOWNTO 0) ); END COMPONENT;BEGIN PROCESS(clkin) VARIABLE num : INTEGER := 0; BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (num = 3) THEN num := 0; downSPen <= '1'; ELSE num := num + 1; downSPen <= '0'; END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (downSPen = '1') THEN itemp <= (NOT IIN(13)) & IIN(12 DOWNTO 0); END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (downSPen = '1') THEN qtemp <= (NOT QIN(13)) & QIN(12 DOWNTO 0); END IF; END IF; END PROCESS; --test <= downSPen; I_square : lpm_mult -- component working out I^2 GENERIC MAP ( lpm_widtha => 14, lpm_widthb => 14, lpm_widthp => 28, lpm_widths => 1, lpm_type => "LPM_MULT", lpm_representation => "SIGNED", lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5" ) PORT MAP ( dataa => itemp, datab => itemp, result => squ1 ); PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN squ1temp <= squ1; END IF; END PROCESS; Q_square : lpm_mult -- component working out Q^2 GENERIC MAP ( lpm_widtha => 14, lpm_widthb => 14, lpm_widthp => 28, lpm_widths => 1, lpm_type => "LPM_MULT", lpm_representation => "SIGNED", lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5" ) PORT MAP ( dataa => qtemp, datab => qtemp, result => squ2 ); PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN squ2temp <= squ2; END IF; END PROCESS; square_sum : lpm_add_sub GENERIC MAP ( lpm_width => 28, lpm_direction => "ADD", lpm_type => "LPM_ADD_SUB", lpm_hint => "ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO" ) PORT MAP ( dataa => squ1temp, datab => squ2temp, result => ssum ); PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (num < 4096) THEN num <= num + 1; totalp <= totalp + ssum; ELSE num <= 0; totalp <= (OTHERS => '0'); END IF; END IF; END PROCESS; pavg <= totalp(39 DOWNTO 12); PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (ssum > 44100000) THEN--124264000--44100000 suptmp <= '1'; ELSE suptmp <= '0'; END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (num = 4095 AND pavg > 15680000) THEN--15680000--17556526 avguptmp <= '1'; ELSE avguptmp <= '0'; END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (num = 4095 AND pavg < 10) THEN avgdowntmp <= '1'; ELSE avgdowntmp <= '0'; END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (count = 33554431) THEN --33554431--511 keep <= '0'; ELSIF (avguptmp = '1' OR avgdowntmp = '1' OR suptmp = '1') THEN keep <= '1'; END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (count = 33554431) THEN --33554431--511 AVGUP <= '0'; ELSIF (avguptmp = '1') THEN AVGUP <= '1'; END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (count = 33554431) THEN --33554431 AVGDOWN <= '0'; ELSIF (avgdowntmp = '1') THEN AVGDOWN <= '1'; END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (count = 33554431) THEN --33554431 SUP <= '0'; ELSIF (suptmp = '1') THEN SUP <= '1'; END IF; END IF; END PROCESS; PROCESS(clkin) BEGIN IF (clkin'EVENT AND clkin = '1') THEN IF (keep = '1') THEN count <= count + 1; END IF; END IF; END PROCESS;end rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -