求大神帮写个testbench

2019-03-25 07:12发布

----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 2016/09/28 15:27:13
-- Design Name:
-- Module Name: hv_ctrl - 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;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.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 leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity hv_ctrl is
  Port (   
          sys_clk           : in  std_logic;
          reset             : in  std_logic;                       
            
          make_data         : in std_logic;
          MData_Off         : in std_logic;    -- use to stop x-ray from DMS, active high.            
          hv_reset_com      : in std_logic;-----------------------------------  
          contactor_on_com  : in std_logic;-----------------------------------
          Starter_com_pulse : in std_logic;-----------------------------------  
          starter_on_com    : in std_logic;-----------------------------------  
          x_prep_com        : in std_logic;-----------------------------------
          hv_on_com         : in std_logic;-----------------------------------
          fi_off_com        : in std_logic;-----------------------------------            
          Fi_standby_mode   : in std_logic;---------cmd from slipring---------
          starter_off_mode  : in std_logic;-----------------------------------
          kv_ref_pulse      : in std_logic;-----------------------------------            
          hv_on_pulse       : in std_logic;-----------------------------------
          fila_com_pulse    : in std_logic;-----------------------------------
          fila_host_data    : in std_logic_vector(11 downto 0);--------------         
          ETime_ref_pulse   : in std_logic;----------------------------------- expo time setting pulse  
          expo_time_ref     : in std_logic_vector(15 downto 0);-------------- expo time
          hss_h_speed_com   : in std_logic;----------------------------------- 0:high/1:low
          hss_speed_pulse   : in std_logic;-----------------------------------
          fil_fs_choice     : in std_logic;-----------------------------------
          NLTest_com        : in std_logic;-----------------------------------
          hss_h_speed_out   : out std_logic;----------------------------------- to HVG HW, 0:high/1:low
         
          opto_intensity    : in std_logic;
--          RX_READY_in       : in std_logic;
          opto_intensity_out: out std_logic;
         
          contactor_on_flag : out std_logic;---------------------------------- contactor on feedback from HVG
          contactor_status  : in std_logic;-----------------------------------
          starter_status    : in std_logic;----------------------------------- active high
          hv_on_status      : in std_logic;-----------------------------------
          hv_fault          : in std_logic;---status from HVG HW interface----
          hv_jb1_status     : in std_logic;-----------------------------------
          hv_jb2_status     : in std_logic;-----------------------------------
          hv_err_data       : in std_logic_vector(7 downto 0);--------------- DFD
          HVcrc_ack         : in std_logic;----------------------------------- this one is active low
          fila_fd_data      : in std_logic_vector(12 downto 0);--------------
          HV_fil_sel_stat   : in std_logic;-----------------------------------
         hv_hss_h_speed_stat: in std_logic;----------------------------------- 0 low/1 high
          hverr_reg_choice  : out std_logic_vector(2 downto 0);-------------- DFA
          hv_starter_on     : out std_logic;----------------------------------
          hv_ret_out        : out std_logic;-----cmd to HVG HW interface------ reset
          hv_on_out         : out std_logic;----------------------------------
          fi_off_out        : out std_logic;----------------------------------
         
          Host_Abort_CMD    : in std_logic;  
          tube_temp1        : in std_logic; --Tube_TS ,high is normal(switch close)
          tube_flowswitch   : in std_logic; --Tube_FS ,high is normal(switch close)
            
          Gsend_fault       : in std_logic;
          KVsend_fault      : in std_logic;
          door_open_status  : in std_logic;--from RCB_Module slipring, 1 door open/0 door close
          HV_fault_out      : out std_logic;
          door_status       : out std_logic;
          pre_scan_flag     : in  std_logic;
          E_stop_mode       : out std_logic_vector(2 downto 0);
          exp_time_fd       : out std_logic_vector(15 downto 0); -- exposure time fdbk
         
          HV_ready          : out std_logic;-------- status to rcb_top -------------
          hv_on_status_syn  : out std_logic;----------------------------------------
          hv_fault_syn      : out std_logic;----------------------------------------
         
    hv_state4_byte3             : out std_logic_vector(7 downto 0); --  fdbk
    hv_state4_byte2             : out std_logic_vector(7 downto 0); --  fdbk
    hv_state4_byte1             : out std_logic_vector(7 downto 0); --  fdbk
    hv_state4_byte0             : out std_logic_vector(7 downto 0); --  fdbk
    hv_state3_byte3             : out std_logic_vector(7 downto 0); --  fdbk
    hv_state3_byte2             : out std_logic_vector(7 downto 0); --  fdbk
    hv_state3_byte1             : out std_logic_vector(7 downto 0); --  fdbk
    hv_state3_byte0             : out std_logic_vector(7 downto 0); --  fdbk
    hv_state232_byte1           : out std_logic_vector(7 downto 0); -- rs232 fdbk
    hv_state232_byte0           : out std_logic_vector(7 downto 0); -- rs232 cmd
   
    hv_falut1                   : out std_logic_vector(7 downto 0); -- rs232 fault fdbk from HVG1
    hv_falut2                   : out std_logic_vector(7 downto 0); -- rs232 fault fdbk from HVG2
          fi_pro_pulse      : out std_logic; -- filament protect EN  
          clk_1ms_pulse     : out std_logic;
          TP                : out STD_LOGIC_VECTOR (23 downto 0)
          );
end hv_ctrl;
architecture Behavioral of hv_ctrl is
constant  RESET_ACTIVE     : std_logic := '0';
constant    Boost_time       :  std_logic_vector(7 downto 0) :="11010010"; --21 Seconds
constant    Brake_time       : std_logic_VECTOR(7 downto 0) :="10010110"; --15 Seconds
constant    Shut_time        : std_logic_VECTOR(11 downto 0) :="001011101110"; --75 Seconds
--constant standby_ref      :   std_logic_vector(11 downto 0) := "100000000000";--3.0A
signal contactor_status_in   : std_logic;
signal starter_status_in     : std_logic;
signal starter_status_input,starter_status_input1,starter_delay1ms,starter_delay2ms: std_logic;
signal hv_on_status_in       : std_logic;
signal hv_fault_in           : std_logic;
signal hv_jb1_status_in      : std_logic;
signal hv_jb2_status_in      : std_logic;
signal tube_temp1_in         : std_logic;
signal tube_flowswitch_in    : std_logic;
signal READY                 : std_logic_VECTOR(14 downto 0);
--signal READY                 : std_logic_VECTOR(11 downto 0);
signal hv_reg_reset          : std_logic;
signal exposure_limit_time   : std_logic;
--signal exposure_time         : std_logic;
signal HV_preset_timer       : std_logic_vector(15 downto 0);
signal exp_time_feed         : std_logic_vector(15 downto 0);
signal starter_status_fd     : std_logic_vector(1 downto 0);
signal hvwork_mode_fd        : std_logic_vector(1 downto 0);
signal hverr_data_in         : std_logic_vector(7 downto 0);
signal HVcrc_ack_in          : std_logic;
signal count_100s            : std_logic_vector(9 downto 0);
signal count_100ms           : std_logic_vector(9 downto 0);
signal delay20ms             : std_logic_vector(4 downto 0);
signal clk1ms_timer          : std_logic_VECTOR(15 downto 0);
signal clk1ms_pulse          : std_logic;
signal clk10ms_timer         : std_logic_VECTOR(3 downto 0);
signal clk10ms_pulse         : std_logic;
signal clk100ms_timer        : std_logic_VECTOR(6 downto 0);
signal clk100ms_pulse        : std_logic;
signal count_3ms             : std_logic_vector(2 downto 0);
signal Rwave_timer           : std_logic_VECTOR(9 downto 0);
signal door_status_in        : std_logic;   
signal mareg_e               : std_logic;
signal kvreg_e               : std_logic;
signal starter_e,starter_e_del1,starter_e_del2,starter_e_del3: std_logic;
signal inv_tmp               : std_logic;
signal uncommanded_exp       : std_logic;
signal nltest_status         : std_logic;
signal vma_status            : std_logic;
signal hv_test_mode          : std_logic;
signal h_speed_warning       : std_logic;
signal hss_h_speed_sig       : std_logic;
signal starter_off_flag      : std_logic;
signal starter_self_off      : std_logic;
signal starter_off_cnt       : std_logic_vector(11 downto 0);
type ShutStatus is (idle,shut_time_on);
signal shut_state : ShutStatus;
signal a_ov                  : std_logic;
signal c_ov                  : std_logic;
signal a_oi                  : std_logic;
signal c_oi                  : std_logic;
signal fi_oi                 : std_logic;
signal arc                   : std_logic;
signal gm_on_status          : std_logic;
signal tube_return_err       : std_logic;
signal starter_dc_rail       : std_logic;
signal starter_i_fed         : std_logic;
signal ipm_dec        : std_logic;
signal grid_inf_status       : std_logic;
signal grid_ref_e            : std_logic;
signal grid_stb_e            : std_logic;
signal grid_frq_e            : std_logic;
signal xray_ot_e            : std_logic;
signal invert_error          : std_logic;
signal precharge_fail        : std_logic;
signal invert_over_c         : std_logic;
signal c_high_arc            : std_logic;
signal FIL_SC              : std_logic;
signal a_high_arc            : std_logic;
signal GM_SC              : std_logic;
signal scb_fm_ver            : std_logic_vector(7 downto 0);
signal scb_hw_ver            : std_logic_vector(2 downto 0);
signal hv_type               : std_logic_vector(2 downto 0);
signal hss_fm_ver            : std_logic_vector(9 downto 0);
signal max_exp_timer:std_logic_VECTOR(13 downto 0);
signal max_exp_over:std_logic;  --100 seconds
signal HVon_load_over:std_logic;
signal timer_over:std_logic_VECTOR(1 downto 0);
signal make_data_d1,make_data_d2:std_logic;
signal mdata_off_d1,mdata_off_d2:std_logic;
signal hv_on_out_status,hv_on_out_status_d1,hv_on_out_status_d2:std_logic;
signal generate_ret:std_logic;
signal READY_logic,READY_logic_delay,READY_logic_delay1ms,READY_logic_delay2ms,READY_logic_delay3ms:std_logic;
signal HV_fault_temp,HV_fault_delay1ms,HV_fault_delay2ms,HV_fault_delay3ms,HV_fault_delay4ms:std_logic;
signal HV_fault_status:std_logic;
signal HV_status_manual,HV_status_manual_del0ms,HV_status_manual_del1ms,HV_status_manual_del2ms:std_logic;
signal hv_hss_h_speed_com1,hv_hss_h_speed_com2,hv_hss_h_speed_com3:std_logic;
signal starter_on        : std_logic;
signal boosting          : std_logic;
signal braking           : std_logic;
signal brake_flag        : std_logic;
signal counter_20_40min  : std_logic_vector(15 downto 0);
signal counter       : std_logic_vector(7 downto 0);
signal opto_intensity_in : std_logic;
--signal RX_READY_in_syn   : std_logic;
signal fila_error_count  : std_logic_vector(6 downto 0);
signal fila_error_flag   : std_logic;
signal byte8_temp    : std_logic_vector(4 downto 0);
signal fsm_cnt      : std_logic_vector(7 downto 0);
signal hv_fault_syn_temp : std_logic;
type StatorProtection is (idle,wait_high_ready,wait_low_ready,wait_brake_ready,boost_status,brake_status);
signal prt_status_stator : StatorProtection;
type Filastatus is (idle,count_100ms_status,protect,protect1);
signal prt_status : Filastatus;
type HVregstatus is (idle_initial,read_hv_version0,version1_addr,read_hv_version1,version2_addr,read_hv_version2,
                    idle,read_reg0,out_addr1,read_reg1,out_addr2,read_reg2,out_addr3,read_reg3,out_addr4,read_reg4);
signal prt_status_hv : HVregstatus;
type HVReady is (idle,latch_err,clear_err);
signal prt_status_door: HVReady;
signal make_data_delay1ms,make_data_delay2ms :std_logic;
signal mdata_off_delay1ms,mdata_off_delay2ms :std_logic;
signal small_arc_count : std_logic_vector(7 downto 0);
signal sarc_100ms_count: std_logic_vector(7 downto 0);
type SArc_status is (idle,send_arc_count,delay_100ms);
signal prt_status_SArc: SArc_status;
signal clk5ms_timer         : std_logic_VECTOR(3 downto 0);
signal clk5ms_pulse         : std_logic;
signal fi_off_logic         : std_logic;
--attribute mark_debug: string;
--attribute mark_debug of hv_on_out_status       : signal is "true";
--attribute mark_debug of hv_fault_syn_temp      : signal is "true";
--attribute mark_debug of hv_on_status_in        : signal is "true";
--attribute mark_debug of HV_status_manual       : signal is "true";
--attribute mark_debug of nltest_status          : signal is "true";
--attribute mark_debug of hverr_reg_choice       : signal is "true";
--attribute mark_debug of fsm_cnt                : signal is "true";
--attribute mark_debug of hss_h_speed_sig        : signal is "true";

begin
TP(14 downto 0) <= READY;
TP(15) <= hv_on_out_status;
TP(16) <= hv_on_status_in;
TP(17) <= mdata_off_d2;
TP(23 downto 18) <= "000000";
hss_h_speed_out <= hss_h_speed_sig;
fi_off_out <= fi_off_logic;
door_status <= door_status_in;
hv_on_status_syn <= hv_on_status_in;
HV_ready<=READY_logic_delay;
hv_on_out<=hv_on_out_status;
hv_starter_on<=starter_on;
contactor_on_flag<=contactor_status_in;
HV_status_manual<=door_open_status and HV_status_manual_del1ms and HV_status_manual_del2ms;
HV_fault_temp<=arc or a_ov or c_ov or a_oi or c_oi or fi_oi or inv_tmp or starter_e_del3 or kvreg_e or mareg_e
               or uncommanded_exp or KVsend_fault or byte8_temp(0) or byte8_temp(1) -- uncomamanded expo/crc err/ref_oc/ref_ov
               or byte8_temp(4) or tube_return_err or (not hv_jb1_status_in) or (not hv_jb2_status_in) or hv_fault_in -- FI_fault/FCRW_status/DFA
      or (not tube_temp1_in)or (not tube_flowswitch_in) or max_exp_over or fila_error_flag; -- filament over current
   
HV_fault_status<=HV_fault_temp and HV_fault_delay1ms and HV_fault_delay2ms and HV_fault_delay3ms and HV_fault_delay4ms;               
READY<=x_prep_com & fi_off_logic & contactor_status_in & starter_status_in & hv_fault_in & hv_jb1_status_in &
       hv_jb2_status_in & tube_temp1_in & '1' & tube_flowswitch_in & hv_reg_reset & reset & door_open_status & starter_status_fd;
--       hv_jb2_status_in & tube_temp1_in & '1' & tube_flowswitch_in & hv_reg_reset & reset & door_open_status & "11";
-- READY <= "111101111101011";
READY_logic_delay<=READY_logic or READY_logic_delay1ms or READY_logic_delay2ms or READY_logic_delay3ms;
starter_status_input<=starter_status_in and starter_delay1ms and starter_delay2ms;
starter_status_input1<=starter_status_in or starter_delay1ms or starter_delay2ms; -- fdbk: starter off
starter_e_del3<=starter_e_del2 and starter_e_del1 and starter_e;
timer_over<=max_exp_over & HVon_load_over;
exp_time_fd<=exp_time_feed;
clk_1ms_pulse<=clk1ms_pulse;
opto_intensity_out<=opto_intensity_in;
---------rs232-------------
hv_state232_byte0<= fi_off_logic &hv_on_out_status&x_prep_com&hv_reset_com& NLTest_com & (not fil_fs_choice) &starter_on& contactor_on_com; --rs232 cmd
hv_state232_byte1<=hv_fault_in & (not hss_h_speed_sig) &hv_hss_h_speed_stat &contactor_status_in &hv_on_status_in &HV_fil_sel_stat &starter_status_fd; --rs232 fdbk
hv_falut1 <= mareg_e & kvreg_e & starter_e_del3 & inv_tmp & uncommanded_exp & tube_return_err & byte8_temp(4) & nltest_status;-- rs232 fault fdbk from HVG1
hv_falut2 <= a_ov & c_ov & a_oi & c_oi & fi_oi & arc & byte8_temp(0) & byte8_temp(1);-- rs232 fault fdbk from HVG2  
---------status frame------------
hv_state4_byte3<= "000000" & (not tube_temp1_in) & (not tube_flowswitch_in);
hv_state4_byte2<= fila_error_flag & h_speed_warning & byte8_temp(4) & byte8_temp(1) & byte8_temp(0) & tube_return_err & arc & hv_fault_syn_temp;
hv_state4_byte1<= fi_oi & uncommanded_exp & c_oi & door_status_in & a_oi & KVsend_fault & c_ov & a_ov;
hv_state4_byte0<= inv_tmp & starter_e_del3 & kvreg_e & (not hv_jb2_status_in) & (not hv_jb1_status_in) & hv_fault_in & mareg_e & max_exp_over;
hv_state3_byte3<='0'&'0'&'0'&'0'&'0'&'0'&'0'&hv_on_status_in;  -- 0x03,byte3
hv_state3_byte2<=hv_hss_h_speed_stat & HV_status_manual & '0'& tube_flowswitch_in & tube_temp1_in & hv_test_mode & nltest_status & Fi_standby_mode; -- 0x03,byte2
hv_state3_byte1<='0'&'0'& starter_off_flag & contactor_status_in & starter_status_input & HV_fil_sel_stat & starter_status_fd;  -- 0x03,byte1
hv_state3_byte0<= fi_off_logic & hv_on_out_status & x_prep_com & (not hss_h_speed_sig) & NLTest_com & (not fil_fs_choice) & starter_on & contactor_on_com; -- 0x03,byte0
   
----------sync-------------
process(sys_clk)
begin
   if sys_clk'event and sys_clk='1' then
   contactor_status_in   <=contactor_status;
            starter_status_in     <=starter_status;
            hv_on_status_in       <=hv_on_status;
            hv_fault_in           <=hv_fault;
            hv_jb1_status_in      <=hv_jb1_status;
            hv_jb2_status_in      <=hv_jb2_status;
            tube_temp1_in         <=tube_temp1;
            tube_flowswitch_in    <=tube_flowswitch;
            hverr_data_in         <=hv_err_data;
            opto_intensity_in     <=opto_intensity;
            make_data_d1          <=make_data_delay2ms;
            make_data_d2          <=make_data_d1;
            mdata_off_d1          <=MData_Off; -- modify bug:last view end,HV is still on 20170411
            mdata_off_d2          <=mdata_off_d1;
   HVcrc_ack_in          <=HVcrc_ack;
   end if;
end process;
------------------------------------------------------
---------------Read FD0--FD7 register-----------------
------------------------------------------------------
process(reset,sys_clk)
begin
   if reset = RESET_ACTIVE then
            count_3ms<="000";
            mareg_e          <='0';
            kvreg_e          <='0';
            starter_e        <='0';
            inv_tmp          <='0';
            uncommanded_exp  <='0';
            nltest_status    <='0';
            vma_status       <='0';
            hv_test_mode     <='0';
   
   a_ov             <='0';
            c_ov             <='0';
            a_oi             <='0';
            c_oi             <='0';
            fi_oi            <='0';
            arc              <='0';
            gm_on_status     <='0';
            tube_return_err  <='0';
   byte8_temp<=(others => '0');
   starter_dc_rail   <='0';
   starter_i_fed     <='0';
   ipm_dec       <='0';
   grid_inf_status   <='0';
   grid_ref_e          <='0';
   grid_stb_e    <='0';
   grid_frq_e    <='0';
   xray_ot_e         <='0';
   invert_error        <='0';
   precharge_fail   <='0';
   invert_over_c     <='0';  
   c_high_arc        <='0';
   FIL_SC        <='0';
   a_high_arc        <='0';
   GM_SC         <='0';
   
   scb_fm_ver <= (others => '0');
   scb_hw_ver <= (others => '0');
   hss_fm_ver <= (others => '0');
   hv_type <= (others => '0');
   hverr_reg_choice <= (others => '0');
         prt_status_hv <= idle_initial;
   elsif sys_clk'event and sys_clk ='1' then   
      case prt_status_hv is
      when idle_initial =>
     if clk1ms_pulse='1' then
      prt_status_hv <= read_hv_version0;
      hverr_reg_choice <= "111";
     else
      prt_status_hv <= idle_initial;
     end if;
     
    when read_hv_version0 =>
     if clk1ms_pulse='1' then
      if count_3ms="010" then  
       count_3ms <= (others => '0');      
       hss_fm_ver(7 downto 0) <= hverr_data_in;   
       prt_status_hv <= version1_addr;
      else
       count_3ms <= count_3ms + '1';
       prt_status_hv <= read_hv_version0;
      end if;
     end if;   
     
    when version1_addr =>
     hverr_reg_choice<="000";
     prt_status_hv<=read_hv_version1;
     
    when read_hv_version1 =>
     if clk1ms_pulse='1' then
      if count_3ms="010" then  
       count_3ms <= (others => '0');      
       hss_fm_ver(9 downto 8) <= hverr_data_in(7 downto 6);
       scb_hw_ver <= hverr_data_in(5 downto 3);
       hv_type <= hverr_data_in(2 downto 0);
       prt_status_hv <= version2_addr;
      else
       count_3ms <= count_3ms + '1';
       prt_status_hv <= read_hv_version1;
      end if;
     end if;
     
    when version2_addr =>
     hverr_reg_choice<="011";
     prt_status_hv <= read_hv_version2;
     
    when read_hv_version2 =>
     if clk1ms_pulse='1' then
      if count_3ms="010" then  
       count_3ms<=(others => '0');      
       scb_fm_ver <= hverr_data_in;
       prt_status_hv <= idle;
      else
       count_3ms <= count_3ms + '1';
       prt_status_hv <= read_hv_version2;
      end if;
     end if;
      
      when idle=>
      hverr_reg_choice<="001";
      count_3ms<="000";
      prt_status_hv<=read_reg0;
               when read_reg0=>
      if clk1ms_pulse='1' then
      if count_3ms="010" then  
                        count_3ms<=(others => '0');      
         mareg_e          <=hverr_data_in(0);
                        kvreg_e          <=hverr_data_in(1);
                        starter_e        <=hverr_data_in(2);
                        inv_tmp          <=hverr_data_in(3);
                        uncommanded_exp  <=hverr_data_in(4);
                        nltest_status    <= not hverr_data_in(5);
                        vma_status       <=hverr_data_in(6); -- reserved
                        hv_test_mode     <=hverr_data_in(7);      
                        prt_status_hv<=out_addr1;
      else
      count_3ms<=count_3ms + '1';
                        prt_status_hv<=read_reg0;
      end if;
      end if;      
            when out_addr1=>
      hverr_reg_choice<="010";
      count_3ms<="000";
      prt_status_hv<=read_reg1;
            when read_reg1=>
         if clk1ms_pulse='1' then
         if count_3ms="010" then  
                        count_3ms<=(others => '0');      
         a_ov             <=hverr_data_in(0);
                        c_ov             <=hverr_data_in(1);
                        a_oi             <=hverr_data_in(2);
                        c_oi             <=hverr_data_in(3);
                        fi_oi            <=hverr_data_in(4);
                        arc              <=hverr_data_in(5);
                        gm_on_status     <=hverr_data_in(6); --reserved
                        tube_return_err  <=hverr_data_in(7);      
                       prt_status_hv<=out_addr2;
         else
         count_3ms<=count_3ms + '1';
                        prt_status_hv<=read_reg1;
         end if;
         end if;
    when out_addr2=>
      hverr_reg_choice<="100";
      count_3ms<="000";
      prt_status_hv<=read_reg2;
            when read_reg2=>
         if clk1ms_pulse='1' then
         if count_3ms="010" then
       byte8_temp(0)<=hverr_data_in(3); -- ref_oc, mA over programming
       byte8_temp(1)<=hverr_data_in(4); -- ref_ov, kV over programming
          byte8_temp(2)<=hverr_data_in(5); -- reserved
          byte8_temp(3)<=hverr_data_in(6); -- reserved
                         byte8_temp(4)<=hverr_data_in(7); -- FI_fault, filament loop failure         
                         count_3ms<=(others => '0');
                        prt_status_hv<=out_addr3;
         else
         count_3ms<=count_3ms + '1';
                        prt_status_hv<=read_reg2;
         end if;
         end if;
      when out_addr3=>
     hverr_reg_choice<="101";
     prt_status_hv<=read_reg3;
     
    when read_reg3=>
     if clk1ms_pulse='1' then
      if count_3ms="010" then
       count_3ms<=(others => '0');
           a_high_arc <= hverr_data_in(0);
       GM_SC  <= hverr_data_in(1);
           c_high_arc <= hverr_data_in(2);
       FIL_SC  <= hverr_data_in(3);
       invert_over_c <= hverr_data_in(4);
       precharge_fail <= hverr_data_in(5);        
       invert_error <= hverr_data_in(6);  
       xray_ot_e <= hverr_data_in(7);  
       prt_status_hv<= out_addr4;                     
      else
       count_3ms<=count_3ms + '1';
       prt_status_hv<= read_reg3;
      end if;
     end if;
    when out_addr4=>
     hverr_reg_choice<="110";
     prt_status_hv<=read_reg4;
     
    when read_reg4=>
     if clk1ms_pulse='1' then
      if count_3ms="010" then
       count_3ms<=(others => '0');
       grid_frq_e <=hverr_data_in(0);
       grid_stb_e <=hverr_data_in(1);
       grid_ref_e <=hverr_data_in(2);
       grid_inf_status<=hverr_data_in(3);
       ipm_dec <=hverr_data_in(4);
       starter_i_fed <=hverr_data_in(5);
       starter_dc_rail <=hverr_data_in(6);      
       prt_status_hv<=idle_initial;                  
      else
       count_3ms<=count_3ms + '1';
       prt_status_hv<=read_reg4;
      end if;
     end if;
      
            when others =>
      count_3ms<=(others => '0');
      prt_status_hv<=idle;
               end case;   
         end if;
end process;  
------------------------------------------------------
---------------Starter status feedback----------------
------------------------------------------------------
process(reset,sys_clk)
begin
    if reset = RESET_ACTIVE then      
          starter_status_fd<="00";                     
    elsif sys_clk'event and sys_clk ='1' then   
    if braking = '1' then
    starter_status_fd<="01";
    elsif boosting = '1' then
    starter_status_fd<="10";
    elsif starter_status_input ='1' then -- starter on fdbk
    starter_status_fd<="11";
    else
    starter_status_fd<="00";
    end if;                 
       end if;
end process;   
------------------------------------------------------
---------detect HV shut time whether enough-----------
------------------------------------------------------
process(reset,sys_clk)
begin
    if reset = RESET_ACTIVE then      
          starter_off_flag <= '0';
          starter_off_cnt <=(others => '0');
          shut_state <= idle;
    elsif sys_clk'event and sys_clk ='1' then
        case shut_state is
            when idle =>
                    if (Starter_com_pulse='1' and starter_on_com ='0' and starter_on ='1') or starter_self_off = '1' then -- console cmd: starter off   
                        starter_off_flag <= '1';   
--                        starter_off_cnt <=starter_off_cnt + '1';
                        shut_state <= shut_time_on;
                    else
                        starter_off_cnt <=(others => '0');
                        starter_off_flag <= '0';   
                        shut_state <= idle;
                    end if;
                    
            when shut_time_on =>
                if clk100ms_pulse ='1' then
                    if starter_off_cnt = Shut_time then -- 75 secs
                            starter_off_flag <= '0';   
                            starter_off_cnt <=(others => '0');
                            shut_state <= idle;
                    else
                            starter_off_flag <= '1';   
                            starter_off_cnt <=starter_off_cnt + '1';
                            shut_state <= shut_time_on;
                    end if;
                else
                       starter_off_flag <= starter_off_flag;   
                    starter_off_cnt <= starter_off_cnt;
                       shut_state <= shut_time_on;
                end if;
               
            when others =>
                    starter_off_flag <= '0';   
                    starter_off_cnt <=(others => '0');
                    shut_state <= idle;
            end case;
       end if;
end process;   
-------------------------------------------------------
-----------HV work mode status feedback----------------
-------------------------------------------------------
process(reset,sys_clk)
begin
  if reset = RESET_ACTIVE then      
           hvwork_mode_fd<="00";                     
  elsif sys_clk'event and sys_clk ='1' then   
     if nltest_status = '1' then
     hvwork_mode_fd<="01";
     elsif vma_status = '1' then
     hvwork_mode_fd<="10";
     elsif hv_test_mode ='1' then
     hvwork_mode_fd<="11";
     else
     hvwork_mode_fd<="00";
     end if;                 
        end if;
end process;   
------------------------------------------------
-------detect hv_on_out rise/fall edge----------
------------------------------------------------
process(reset,sys_clk)
begin
  if reset = RESET_ACTIVE then      
           hv_on_out_status_d1<='0';
           hv_on_out_status_d2<='0';                  
  elsif sys_clk'event and sys_clk ='1' then   
     if hv_on_out_status = '0' then --hv_on to HVG HW interface
     hv_on_out_status_d1 <= '0';
     else
     hv_on_out_status_d1 <= '1';
     end if;
        hv_on_out_status_d2 <= hv_on_out_status_d1;            
        end if;
end process;   
-----------------------------------------------------
------generate HV generator reset pulse: 20ms--------
-----------------------------------------------------
process(reset,sys_clk)
  begin
   if reset = RESET_ACTIVE then
      hv_ret_out<='0';
            hv_reg_reset<='0';
            generate_ret<='0';
   elsif sys_clk'event and sys_clk ='1' then
            if hv_reset_com = '1' then -- slipring reset cmd pulse
               generate_ret<='1';
            elsif generate_ret='1' then
       if delay20ms ="10101" then
        hv_ret_out<='0';
                       generate_ret<='0';
        hv_reg_reset<='0';
     else
        hv_ret_out<='1'; -- reset to HVG HW interface
        hv_reg_reset<='1';
     end if;
             end if;
          end if;
end process;   
      
process(reset,sys_clk)
  begin
   if reset = RESET_ACTIVE then
      delay20ms <= "00000";            
   elsif sys_clk'event and sys_clk ='1' then
      if generate_ret='1' then
         if clk1ms_pulse='1' then
            if delay20ms ="10101" then
             delay20ms<="00000";   
         else
           delay20ms<=delay20ms + '1';        
         end if;
       end if;
               else
                delay20ms<="00000";      
      end if;
     end if;  
end process;  
--------------------------------------------------------------
-------------Filter READY_logic_delay signal------------------
--------------------------------------------------------------
process(reset,sys_clk)
  begin
   if reset = RESET_ACTIVE then
      READY_logic <= '0';               
   elsif sys_clk'event and sys_clk ='1' then
     if READY = "111101111101011" then
--              if READY = "101101111101" then
        READY_logic <= '1';
     else
              READY_logic <= '0';
           end if;      
     end if;  
end process;
process(reset,sys_clk)
  begin
   if reset = RESET_ACTIVE then      
                READY_logic_delay1ms <= '0';
                READY_logic_delay2ms <= '0';
                READY_logic_delay3ms <= '0';
                HV_fault_delay1ms       <= '0';
                HV_fault_delay2ms       <= '0';
                HV_fault_delay3ms       <= '0';
                HV_status_manual_del1ms <= '0';
                HV_status_manual_del2ms <= '0';
                hv_hss_h_speed_com1     <= '0';
                hv_hss_h_speed_com2     <= '0';
                hv_hss_h_speed_com3     <= '0';
                starter_delay1ms        <= '0';
                starter_delay2ms        <= '0';
                starter_e_del2          <= '0';
                starter_e_del1          <= '0';
                make_data_delay1ms      <= '0';
                make_data_delay2ms      <= '0';
   elsif sys_clk'event and sys_clk ='1' then
      if clk1ms_pulse='1' then
     READY_logic_delay1ms<=READY_logic;
     READY_logic_delay2ms<=READY_logic_delay1ms;
     READY_logic_delay3ms<=READY_logic_delay2ms;
                    HV_status_manual_del1ms<=door_open_status;
                    HV_status_manual_del2ms<=HV_status_manual_del1ms;
                    
                    HV_fault_delay1ms<=HV_fault_temp;
                    HV_fault_delay2ms<=HV_fault_delay1ms;
                    HV_fault_delay3ms<=HV_fault_delay2ms;
                    HV_fault_delay4ms<=HV_fault_delay3ms;
                    
     starter_delay1ms<=starter_status_in;
     starter_delay2ms<=starter_delay1ms;
      
     hv_hss_h_speed_com1 <= hss_h_speed_com;
     hv_hss_h_speed_com2 <= hv_hss_h_speed_com1;
     hv_hss_h_speed_com3 <= hv_hss_h_speed_com2;
     
     starter_e_del1<=starter_e;     
     starter_e_del2<=starter_e_del1;
     
     make_data_delay1ms<=make_data;
     make_data_delay2ms<=make_data_delay1ms;
     
     mdata_off_delay1ms <= mdata_off;
     mdata_off_delay2ms <= mdata_off_delay1ms;
    end if;
     end if;  
end process;
---------------------------------------------------------------
--------------maximal hv_on time is 100 seconds----------------
---------------------------------------------------------------
process(reset,sys_clk)
  begin
   if(reset=RESET_ACTIVE)then
      max_exp_timer<=(others => '0');
    max_exp_over<='0';
    exposure_limit_time<='0';
   elsif sys_clk'event and sys_clk ='1' then
      if ETime_ref_pulse='1' then -- got exposure time from console
       max_exp_timer<=(others => '0');
       max_exp_over<='0';
       exposure_limit_time<='0';   
            elsif (hv_on_out_status='1') and ( clk10ms_pulse='1') then
     if max_exp_timer = "10011100010000" then  --100s
        max_exp_timer<=max_exp_timer;
      max_exp_over<='1';
      exposure_limit_time<='1';
     else
      max_exp_timer<=max_exp_timer+'1';
      max_exp_over<='0';
      exposure_limit_time<='0';
     end if;
    end if;
     end if;
end process;
-----------------------------------------------------------
------hv_on signal disable when HVon load timer over-------
-----------------------------------------------------------
process(reset,sys_clk)
  begin
   if reset = RESET_ACTIVE then
      exp_time_feed<=(others => '0');
    HV_prese
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
haoshuai
1楼-- · 2019-03-26 06:13
 精彩回答 2  元偷偷看……
刘123
2楼-- · 2019-03-26 07:56
haoshuai 发表于 2018-8-3 13:48
这个就有点难了吧

简单的我也会写,这么长的  就不知道从哪下手了
刘123
3楼-- · 2019-03-26 11:50
haoshuai 发表于 2018-8-3 13:48
这个就有点难了吧

简单的我也会写,这么长的  就不知道从哪下手了
suoma
4楼-- · 2019-03-26 16:04
求大神帮写个testbench,我出?钱
刘123
5楼-- · 2019-03-26 19:03
suoma 发表于 2018-9-8 14:47
求大神帮写个testbench,我出?钱

哈哈,你咋怎么优秀呢

一周热门 更多>