📄 hsata.vhd
字号:
---------------------------------------------------------------------------------------------------------------------------------------------------------- Copyright (C) 2004 Free Model Foundry; http://www.FreeModelFoundry.com/---- This program is free software; you can redistribute it and/or modify-- it under the terms of the GNU General Public License version 2 as-- published by the Free Software Foundation.--------------------------------------------------------------------------------- Company : HDL Design House, Serbia and Montenegro-- Project : SATA -- Module : Host---- Date : 26.3.2004-- Ver. : 1.0---- Author : Nebojsa Makljenovic-- Email : n-makljenovic@hdl-dh.com-- Phone : +381 11 344 23 59---- Customer :--------------------------------------------------------------------------------- Functional description of the module:-- SATA host VITAL model------------------------------------------------------------------------------------------------------------------------------------------------------------ LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.VITAL_timing.ALL; USE IEEE.VITAL_primitives.ALL; USE STD.textio.ALL;LIBRARY FMF; USE FMF.gen_utils.ALL; USE FMF.conversions.ALL; ---------------------------------------------------------------------------------- ENTITY DECLARATION--------------------------------------------------------------------------------ENTITY Hsata IS GENERIC ( -- tipd delays: interconnect path delays tipd_RXp : VitalDelayType01 := VitalZeroDelay01; tipd_RXn : VitalDelayType01 := VitalZeroDelay01; -- generic control parameters InstancePath : STRING := DefaultInstancePath; TimingChecksOn : BOOLEAN := DefaultTimingChecks; MsgOn : BOOLEAN := DefaultMsgOn; XOn : BOOLEAN := DefaultXon; -- command file to be loaded command_file_name : STRING := "hsata.cmd"; -- For FMF SDF technology file usage TimingModel : STRING := DefaultTimingModel ); PORT ( RESET : IN std_logic := 'L'; RXp : IN std_logic := 'L'; RXn : IN std_logic := 'L'; TXp : OUT std_logic := 'L'; TXn : OUT std_logic := 'L' ); ATTRIBUTE VITAL_LEVEL0 of Hsata : ENTITY IS TRUE;END Hsata; ---------------------------------------------------------------------------------- ARCHITECTURE DECLARATION--------------------------------------------------------------------------------ARCHITECTURE vhdl_behavioral of Hsata IS ATTRIBUTE VITAL_LEVEL0 of vhdl_behavioral : ARCHITECTURE IS TRUE; CONSTANT PartID : STRING := "Hsata";-- ipd SIGNAL RXp_ipd : std_ulogic := 'U'; SIGNAL RXn_ipd : std_ulogic := 'U'; SIGNAL RXp_nwv : std_ulogic := 'U'; SIGNAL RXn_nwv : std_ulogic := 'U'; BEGIN ---------------------------------------------------------------------------- -- Wire Delays ---------------------------------------------------------------------------- WireDelay : BLOCK BEGIN w_1 : VitalWireDelay (RXp_ipd, RXp, tipd_RXp); w_2 : VitalWireDelay (RXn_ipd, RXn, tipd_RXn); END BLOCK; -- sig_nwv <= To_UX01(sig_ipd); RXp_nwv <= To_UX01(RXp_ipd); RXn_nwv <= To_UX01(RXn_ipd); ---------------------------------------------------------------------------- -- Main Behavior Block ---------------------------------------------------------------------------- Behavior: BLOCK PORT ( RESET : IN std_logic := 'L'; RXp : IN std_logic := 'L'; RXn : IN std_logic := 'L'; TXp : OUT std_logic := 'L'; TXn : OUT std_logic := 'L' ); PORT MAP ( RESET => RESET, RXp => RXp_nwv, RXn => RXn_nwv, TXp => TXp, TXn => TXn ); TYPE table_line IS ARRAY(7 DOWNTO 0) OF std_ulogic_vector(9 DOWNTO 0); TYPE table IS ARRAY(31 DOWNTO 0) OF table_line; TYPE phy_init IS (HR_RESET, HR_AwaitCOMINIT, HR_AwaitNoCOMINIT, HR_Calibrate, HR_COMWAKE, HR_AwaitCOMWAKE, HR_AwaitNoCOMWAKE, HR_AwaitAlign, HR_SendAlign, HR_Ready, HR_Partial, HR_Slumber, HR_AdjustSpeed); TYPE link_state_type IS ( L1_L_IDLE, LS1_L_NoCommErr, LS2_L_NoComm, LS3_L_SendAlign, LS4_L_RESET, LT1_HL_SendChkRdy, LT3_L_SendSOF, LT4_L_SendData, LT5_L_RcvrHold, LT6_L_SendHold, LT7_L_SendCRC, LT8_L_SendEOF, LT9_L_Wait, LR1_L_RcvChkRdy, LR2_L_RcvWaitFifo, LR3_L_RcvData, LR4_L_Hold, LR5_L_SendHold, LR6_L_RcvEOF, LR7_L_GoodCRC, LR8_L_GoodEnd, LR9_L_BadEnd); TYPE TP_state_type IS ( HT_HostIdle, TP_SOF, HT_ChkTyp, HT_RegFIS, HT_PS_FIS, HT_PIOOTrans1, HT_PIOOTrans2, HT_PIOEND, HT_PIOITrans1, HT_PIOITrans2, HT_CmdFIS, HT_CmdFIS_TransStatus); TYPE TP_result_type IS ( GOOD, NO_FIS, NO_RESP, ERR); TYPE write_arg_type IS RECORD -- op : NATURAL; op : string(1 to 5); Data0 : NATURAL; Data1 : NATURAL; Data2 : NATURAL; Remark : string(1 to 40); END RECORD; TYPE inst_store IS ARRAY(0 to 4095) OF write_arg_type; TYPE code_word_pair IS ARRAY(0 TO 1) OF std_logic_vector(9 DOWNTO 0); TYPE rx_buffer_type IS ARRAY (0 TO 3) OF std_logic_vector(9 DOWNTO 0); TYPE crc_table_type IS ARRAY (0 TO 255) OF std_logic_vector(31 DOWNTO 0); CONSTANT FIFO_SIZE : INTEGER := 16; TYPE rx_fifo_buffer_type IS ARRAY(0 TO FIFO_SIZE - 1) OF std_logic_vector(37 DOWNTO 0); TYPE tx_fifo_buffer_type IS ARRAY(0 TO FIFO_SIZE - 1) OF std_logic_vector(31 DOWNTO 0); CONSTANT K283 : std_logic_vector(7 DOWNTO 0) := B"011_11100"; CONSTANT K285 : std_logic_vector(7 DOWNTO 0) := B"101_11100"; CONSTANT D102 : std_logic_vector(7 DOWNTO 0) := B"010_01010"; CONSTANT D105 : std_logic_vector(7 DOWNTO 0) := B"101_01010"; CONSTANT D211 : std_logic_vector(7 DOWNTO 0) := B"001_10101"; CONSTANT D212 : std_logic_vector(7 DOWNTO 0) := B"010_10101"; CONSTANT D213 : std_logic_vector(7 DOWNTO 0) := B"011_10101"; CONSTANT D214 : std_logic_vector(7 DOWNTO 0) := B"100_10101"; CONSTANT D215 : std_logic_vector(7 DOWNTO 0) := B"101_10101"; CONSTANT D216 : std_logic_vector(7 DOWNTO 0) := B"110_10101"; CONSTANT D217 : std_logic_vector(7 DOWNTO 0) := B"111_10101"; CONSTANT D221 : std_logic_vector(7 DOWNTO 0) := B"001_10110"; CONSTANT D222 : std_logic_vector(7 DOWNTO 0) := B"010_10110"; CONSTANT D230 : std_logic_vector(7 DOWNTO 0) := B"000_10111"; CONSTANT D231 : std_logic_vector(7 DOWNTO 0) := B"001_10111"; CONSTANT D232 : std_logic_vector(7 DOWNTO 0) := B"010_10111"; CONSTANT D242 : std_logic_vector(7 DOWNTO 0) := B"010_11000"; CONSTANT D254 : std_logic_vector(7 DOWNTO 0) := B"100_11001"; CONSTANT D273 : std_logic_vector(7 DOWNTO 0) := B"011_11011"; CONSTANT cK283 : code_word_pair := ("1100111100", "0011000011"); CONSTANT cK285 : code_word_pair := ("0101111100", "1010000011"); CONSTANT cD102 : code_word_pair := ("1010101010", "1010101010"); CONSTANT cD273 : code_word_pair := ("1100011011", "0011100100"); CONSTANT ALIGN_RDpos : std_logic_vector(39 DOWNTO 0) := "1100011011101010101010101010101010000011"; CONSTANT ALIGN_RDneg : std_logic_vector(39 DOWNTO 0) := "0011100100101010101010101010100101111100"; -- CONSTANT RXPERIOD : Time := 666.43 ps; CONSTANT RXPERIOD : Time := 668 ps; CONSTANT TXPERIOD : Time := 666.43 ps;-- CONSTANT TXPERIOD : Time := 667 ps; CONSTANT MIN_COMRESET_SPACE : Time := 175 ns; CONSTANT MAX_COMRESET_SPACE : Time := 525 ns; CONSTANT MIN_COMINIT_SPACE : Time := 175 ns; CONSTANT MAX_COMINIT_SPACE : Time := 525 ns; CONSTANT MIN_COMWAKE_SPACE : Time := 55 ns; CONSTANT MAX_COMWAKE_SPACE : Time := 175 ns; CONSTANT FISt_reg_h2d : std_logic_vector(7 DOWNTO 0) := X"27"; CONSTANT FISt_reg_d2h : std_logic_vector(7 DOWNTO 0) := X"34"; CONSTANT FISt_set_dev_bit : std_logic_vector(7 DOWNTO 0) := X"A1"; CONSTANT FISt_dma_activ : std_logic_vector(7 DOWNTO 0) := X"39"; CONSTANT FISt_dma_setup : std_logic_vector(7 DOWNTO 0) := X"41"; CONSTANT FISt_bist_activ : std_logic_vector(7 DOWNTO 0) := X"58"; CONSTANT FISt_pio_setup : std_logic_vector(7 DOWNTO 0) := X"5F"; CONSTANT FISt_data : std_logic_vector(7 DOWNTO 0) := X"46"; CONSTANT FIS_SOF : std_logic_vector(1 DOWNTO 0) := "01"; CONSTANT FIS_EOF : std_logic_vector(1 DOWNTO 0) := "11"; CONSTANT FIS_PAYLOAD : std_logic_vector(1 DOWNTO 0) := "10"; CONSTANT POLYNOMIAL : std_logic_vector(31 DOWNTO 0) := X"04c11db7"; CONSTANT PHYDATAWIDTH : INTEGER := 40; SIGNAL crc_table : crc_table_type; PROCEDURE SendALIGN (SIGNAL tx_empty : IN std_logic; SIGNAL clk : IN std_logic; SIGNAL ld : OUT std_logic; SIGNAL reg : OUT std_logic_vector(9 DOWNTO 0)) IS BEGIN IF tx_empty = '0' THEN WAIT UNTIL tx_empty = '1'; END IF; WAIT UNTIL clk='1'; -- negative rd assumed reg <= cK285(0);-- ld <= '1', '0' AFTER 1 ps; ld <= '1'; WAIT UNTIL clk='1'; ld <= '0'; WAIT UNTIL tx_empty = '1'; WAIT UNTIL clk='1'; reg <= cD102(1); ld <= '1'; WAIT UNTIL clk='1'; ld <= '0'; WAIT UNTIL tx_empty = '1'; WAIT UNTIL clk='1'; reg <= cD102(0); ld <= '1'; WAIT UNTIL clk='1'; ld <= '0'; WAIT UNTIL tx_empty = '1'; WAIT UNTIL clk='1'; reg <= cD273(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -