dsata.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 : Device---- 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 device 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 Dsata 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; -- 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 Dsata : ENTITY IS TRUE;END Dsata; ---------------------------------------------------------------------------------- ARCHITECTURE DECLARATION--------------------------------------------------------------------------------ARCHITECTURE vhdl_behavioral of Dsata IS ATTRIBUTE VITAL_LEVEL0 of vhdl_behavioral : ARCHITECTURE IS TRUE; CONSTANT PartID : STRING := "Dsata";-- 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 phy_init IS (DR_RESET, DR_COMINIT, DR_AwaitCOMWAKE, DR_AwaitNoCOMWAKE, DR_Calibrate, DR_COMWAKE, DR_SendAlign, DR_Ready, DR_Partial, DR_Slumber, DR_ReduceSpeed, DR_Error); TYPE link_state_type IS ( L1_L_IDLE, LS1_L_NoCommErr, LS2_L_NoComm, LS3_L_SendAlign, LS4_L_RESET, LT2_DL_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 ( DT_DeviceIdle, TP_SOF, DT_ChkTyp, DT_RegHDFIS, DT_DMASETUPHFIS, DT_rcvBIST, DT_DATAOFIS, DT_RegDHFIS, DT_DHFIS_TransStatus, DT_PIOSTUPFIS, DT_PIOSTUPFIS_TransStatus, DT_DATAIFIS); TYPE TP_result_type IS ( GOOD, NO_FIS, NO_RESP, ERR); 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 := 64; 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 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); ld <= '1'; WAIT UNTIL clk='1'; ld <= '0'; END SendALIGN; PROCEDURE encode (rd : INOUT std_logic; byte : IN std_logic_vector(7 DOWNTO 0); SIGNAL code : OUT std_logic_vector(9 DOWNTO 0)) IS VARIABLE temp : std_logic_vector(9 DOWNTO 0); VARIABLE x,y : INTEGER; VARIABLE rd6 : std_logic; BEGIN x := to_nat(byte(4 DOWNTO 0)); y := to_nat(byte(7 DOWNTO 5)); -- 5B/6B CASE x IS WHEN 0 | 1 | 2 | 4 | 8 | 15 | 16 | 23 | 24 | 27 | 29 | 30 | 31 => rd6 := NOT rd; WHEN others => rd6 := rd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -