📄 hsata.vhd
字号:
END IF; -- four-bit sub-block n_ones := 0; FOR i IN 0 TO 3 LOOP IF code(6+i) = '1' THEN n_ones := n_ones + 1; END IF; END LOOP; IF (n_ones > 2) OR code(9 DOWNTO 6) = "1100" THEN rd4 := '1'; ELSIF (n_ones < 2) OR code(9 DOWNTO 6) = "0011" THEN rd4 := '0'; ELSE rd4 := rd6; END IF; RETURN rd4; END new_rd; PROCEDURE lsfr (SIGNAL state : INOUT std_logic_vector(15 DOWNTO 0); VARIABLE rnd_data : OUT std_logic_vector(31 DOWNTO 0)) IS VARIABLE new_bit : std_logic; VARIABLE lsfr_reg : std_logic_vector(15 DOWNTO 0); BEGIN lsfr_reg := state; FOR i IN 0 TO 31 LOOP rnd_data(i) := lsfr_reg(15); lsfr_reg := (lsfr_reg(15) XOR lsfr_reg(14)) & lsfr_reg(13) & (lsfr_reg(15) XOR lsfr_reg(12)) & lsfr_reg(11 DOWNTO 4) & (lsfr_reg(15) XOR lsfr_reg(3)) & lsfr_reg(2 DOWNTO 0) & lsfr_reg(15); END LOOP; state <= lsfr_reg; END lsfr; PROCEDURE get_crc (VARIABLE crc_accum : INOUT std_logic_vector(31 DOWNTO 0); VARIABLE code : IN std_logic_vector(31 DOWNTO 0)) IS VARIABLE i : INTEGER; BEGIN i := to_nat (crc_accum(31 DOWNTO 24) XOR code(31 DOWNTO 24)); crc_accum := (crc_accum(23 DOWNTO 0) & "00000000") XOR crc_table(i); i := to_nat (crc_accum(31 DOWNTO 24) XOR code(23 DOWNTO 16)); crc_accum := (crc_accum(23 DOWNTO 0) & "00000000") XOR crc_table(i); i := to_nat (crc_accum(31 DOWNTO 24) XOR code(15 DOWNTO 8)); crc_accum := (crc_accum(23 DOWNTO 0) & "00000000") XOR crc_table(i); i := to_nat (crc_accum(31 DOWNTO 24) XOR code(7 DOWNTO 0)); crc_accum := (crc_accum(23 DOWNTO 0) & "00000000") XOR crc_table(i); END get_crc; -- PHYSICAL PLANT INTERFACE SIGNAL DATAIN : std_logic_vector(PHYDATAWIDTH-1 DOWNTO 0); SIGNAL SLUMBER : std_logic:= '0'; SIGNAL PARTIAL : std_logic:= '0'; SIGNAL NEARAFELB : std_logic:= '0'; SIGNAL FARAFELB : std_logic:= '0'; SIGNAL SPDSEL : std_logic:= '0'; SIGNAL SYSTEMCLOCK : std_logic:= '1'; SIGNAL COMMA : std_logic:= '0'; SIGNAL DATAOUT : std_logic_vector(PHYDATAWIDTH-1 DOWNTO 0); SIGNAL RXCLOCK : std_logic:= '0'; SIGNAL COMINIT : std_logic:= '0'; SIGNAL COMWAKE : std_logic:= '0'; SIGNAL PHYRDY : std_logic := '0'; SIGNAL PHYRESET : std_logic := '0'; -- TRANSMITTER SIGNAL TX_int : std_logic := 'Z'; SIGNAL TX_shift_reg : std_logic_vector(9 DOWNTO 0) := "0000000000"; SIGNAL TX_reg : std_logic_vector(9 DOWNTO 0) := "0000000000"; SIGNAL TX_shift_rdy : std_logic; SIGNAL TX_shift_reg_empty : std_logic := '1'; SIGNAL TX_ld : std_logic := '0'; -- RECEIVER SIGNAL RX_int : std_logic := 'Z'; SIGNAL rx_idle : std_logic := 'Z'; -- SIGNAL RX_shift_reg : std_logic_vector(9 DOWNTO 0) := "0000000000"; SIGNAL RX_data_rdy : std_logic; SIGNAL cominit_space_ok : std_logic := '0'; SIGNAL comwake_space_ok : std_logic := '0'; SIGNAL align : std_logic := '0'; -- ALIGN pattern detected SIGNAL align_ctrl : std_logic := '0'; -- ALIGN pattern detected SIGNAL nonalign : std_logic := '0'; -- NONALIGN pattern detected SIGNAL non_align_cnt : INTEGER; -- RX clock generator SIGNAL RXclk_timeout : std_logic := '0'; SIGNAL RXclk : std_logic := '0'; SIGNAL RXclk_edge : std_logic := '0'; -- TX clock generator SIGNAL TXclk : std_ulogic := '1'; -- PHY control SIGNAL init_state : phy_init := HR_RESET; SIGNAL resume : std_logic := '0'; SIGNAL speed : INTEGER := 1; SIGNAL transmit_comwake : std_logic := '0'; SIGNAL transmit_comreset : std_logic := '0'; SIGNAL transmit_align : std_logic := '0'; SIGNAL transmit_comwake_end : std_logic := '0'; SIGNAL transmit_comreset_end : std_logic := '0'; SIGNAL transmit_D102 : std_logic := '0'; SIGNAL transmit_D102_end : std_logic := '0'; SIGNAL transmit_align_end : std_logic := '0'; SIGNAL transmit_link_data : std_logic := '0'; SIGNAL calibration_end : std_logic := '0'; SIGNAL power_on : std_logic := '1'; SIGNAL await_align_timeout : std_logic := '0'; -- LINK LAYER-- SIGNAL RX_rd : std_logic := '0'; -- receiver running disparity -- SIGNAL TX_rd : std_logic := '0'; -- transmitter running disparity -- Control SIGNAL link_state, next_link_state : link_state_type; -- primitives SIGNAL CONTp : std_logic := '0'; SIGNAL DMATp : std_logic := '0'; SIGNAL EOFp : std_logic := '0'; SIGNAL HOLDp : std_logic := '0'; SIGNAL HOLDAp : std_logic := '0'; SIGNAL PMACKp : std_logic := '0'; SIGNAL PMNAKp : std_logic := '0'; SIGNAL PMREQ_Pp : std_logic := '0'; SIGNAL PMREQ_Sp : std_logic := '0'; SIGNAL R_ERRp : std_logic := '0'; SIGNAL R_IPp : std_logic := '0'; SIGNAL R_OKp : std_logic := '0'; SIGNAL R_RDYp : std_logic := '0'; SIGNAL SOFp : std_logic := '0'; SIGNAL SYNCp : std_logic := '0'; SIGNAL WTRMp : std_logic := '0'; SIGNAL X_RDYp : std_logic := '0'; SIGNAL lsfr_state_scramble : std_logic_vector(15 DOWNTO 0) := "1111111111111111"; SIGNAL lsfr_state_descramble : std_logic_vector(15 DOWNTO 0) := "1111111111111111"; SIGNAL lsfr_state_cont : std_logic_vector(15 DOWNTO 0) := "1111111111111111"; SIGNAL crc_check : std_logic := '0'; SIGNAL link_data : std_logic_vector(31 DOWNTO 0); SIGNAL link_err : std_logic_vector(3 DOWNTO 0); SIGNAL link_ctrl : std_logic_vector(3 DOWNTO 0); SIGNAL link_crc : std_logic_vector(31 DOWNTO 0); SIGNAL link_FIS_data : std_logic_vector(31 DOWNTO 0); SIGNAL link_FIS_state : std_logic_vector(1 DOWNTO 0); SIGNAL rcv_fifo_read : std_logic := '0'; SIGNAL rcv_fifo_write : std_logic := '0'; SIGNAL tr_fifo_read : std_logic := '0'; SIGNAL tr_fifo_write : std_logic := '0'; SIGNAL RX_fifo_empty : std_logic := '1'; SIGNAL RX_fifo_full : std_logic := '0'; SIGNAL TX_fifo_empty : std_logic := '1'; SIGNAL TX_fifo_full : std_logic := '0'; SIGNAL RX_rd_ptr : INTEGER := 0; SIGNAL RX_wr_ptr : INTEGER := 0; SIGNAL TX_rd_ptr : INTEGER := 0; SIGNAL TX_wr_ptr : INTEGER := 0; SIGNAL RX_fifo : rx_fifo_buffer_type; SIGNAL TX_fifo : tx_fifo_buffer_type; -- TRANSPORT LAYER SIGNAL TP_state : TP_state_type; SIGNAL next_TP_state : TP_state_type; SIGNAL TP_transmission_status : std_logic := '0'; SIGNAL TP_frame_end : std_logic := '0'; SIGNAL TP_Frame_Rdy : std_logic := '0'; SIGNAL TP_no_data : std_logic := '0'; SIGNAL TP_Fifo_Space_Avail : std_logic := '1'; SIGNAL TP_result : TP_result_type; SIGNAL TP_dataout : std_logic_vector(31 DOWNTO 0); SIGNAL TP_datain : std_logic_vector(37 DOWNTO 0); SIGNAL TP_FIS_end : std_logic := '0'; SIGNAL TP_FIS_OK : std_logic := '0'; SIGNAL TP_cmd_req : std_logic := '0';-- Register block SHARED VARIABLE RdDataPortReg : std_logic_vector(15 DOWNTO 0) := (others => '0'); SHARED VARIABLE WrDataPortReg : std_logic_vector(15 DOWNTO 0) := (others => '0'); SHARED VARIABLE ErrorReg : std_logic_vector(7 DOWNTO 0) := (others => '0'); SHARED VARIABLE FeaturesReg : std_logic_vector(15 DOWNTO 0) := (others => '0'); SHARED VARIABLE SectorCountReg : std_logic_vector(15 DOWNTO 0) := (others => '0'); SHARED VARIABLE SectorNumberReg : std_logic_vector(15 DOWNTO 0) := (others => '0'); SHARED VARIABLE CylinderLowReg : std_logic_vector(15 DOWNTO 0) := (others => '0'); SHARED VARIABLE CylinderHighReg : std_logic_vector(15 DOWNTO 0) := (others => '0'); SHARED VARIABLE DeviceHeadReg : std_logic_vector(7 DOWNTO 0) := (others => '0'); SHARED VARIABLE StatusReg : std_logic_vector(7 DOWNTO 0) := (others => '0'); SHARED VARIABLE CommandReg : std_logic_vector(7 DOWNTO 0) := (others => '0'); SHARED VARIABLE AlternateStatusReg : std_logic_vector(15 DOWNTO 0) := (others => '0'); SHARED VARIABLE DeviceControlReg : std_logic_vector(7 DOWNTO 0) := (others => '0'); SIGNAL Ibit : std_logic := '0'; SIGNAL Cbit : std_logic := '0'; SIGNAL inst : inst_store; SIGNAL instr_cnt : INTEGER := 0; BEGIN CRC_INIT : PROCESS VARIABLE crc_accum : std_logic_vector(31 DOWNTO 0); BEGIN FOR i IN 0 TO 255 LOOP crc_accum := (others => '0'); crc_accum(31 DOWNTO 24) := to_slv(i,8); FOR j IN 0 TO 7 LOOP IF crc_accum(31) = '1' THEN crc_accum := crc_accum(30 DOWNTO 0) & '0'; crc_accum := crc_accum XOR POLYNOMIAL; ELSE crc_accum := crc_accum(30 DOWNTO 0) & '0'; END IF; END LOOP; crc_table(i) <= crc_accum; END LOOP; WAIT; END PROCESS CRC_INIT; ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- -- Physical plant -- ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- PHYRESET <= RESET; ---------------------------------------------------------------------------- -- Recived data -- ---------------------------------------------------------------------------- RX_int <= (RXp AND NOT RXn) AFTER 1 ps; rx_idle <= NOT (RXp XOR RXn); -- line is idle if both lines have same value ---------------------------------------------------------------------------- -- Clock extractor -- ---------------------------------------------------------------------------- RX_CLK_timeout : PROCESS(RXclk, rx_idle) VARIABLE TmpPer : Time := 0 ps; BEGIN IF (RXclk'EVENT AND (rx_idle = '0')) THEN RXclk_timeout <= '0', '1' AFTER RXPERIOD/2; END IF; IF rising_edge(rx_idle) THEN RXclk_timeout <= '0'; END IF; END PROCESS RX_CLK_timeout; RX_CLK : PROCESS(RX_int, RXclk_timeout, rx_idle) VARIABLE TmpPer : Time := 0 ps; VARIABLE Last_clk_edge : Time := 0 ps; BEGIN TmpPer := NOW - Last_clk_edge; IF falling_edge(rx_idle) OR ((RX_int'EVENT AND TmpPer > RXPERIOD/4) AND (rx_idle = '0')) OR rising_edge(RXclk_timeout) THEN RXclk <= not(RXclk); Last_clk_edge := NOW; RXclk_edge <= '1', '0' AFTER 1 ps; END IF; END PROCESS RX_CLK; ---------------------------------------------------------------------------- -- Space duration check -- ---------------------------------------------------------------------------- SPACE_CHECK : PROCESS(rx_idle) VARIABLE burst_start : Time := 0 ps; VARIABLE space_start : Time := 0 ps; VARIABLE tmp_time : Time := 0 ps;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -