From 3ad4d2b83232c70b38df50a33942bfd5011b0ee7 Mon Sep 17 00:00:00 2001 From: hadeshyp Date: Tue, 8 May 2007 09:32:25 +0000 Subject: [PATCH] added parity to trb_net_med_13bit_slow.vhd, Jan --- trb_net_med_13bit_slow.vhd | 99 +++++++++++++++++++++++--------------- trb_net_std.vhd | 16 +++++- 2 files changed, 75 insertions(+), 40 deletions(-) diff --git a/trb_net_med_13bit_slow.vhd b/trb_net_med_13bit_slow.vhd index 71fc7d6..9da30ec 100755 --- a/trb_net_med_13bit_slow.vhd +++ b/trb_net_med_13bit_slow.vhd @@ -6,13 +6,13 @@ --parity bit is not used for parity but as an indicator for the first packet --of a transmission - library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.ALL; +use work.trb_net_std.all; entity trb_net_med_13bit_slow is generic( @@ -71,7 +71,9 @@ end trb_net_med_13bit_slow; architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is signal INT2MED_state, next_INT2MED_state : std_logic_vector (3 downto 0); - signal MED2INT_state, next_MED2INT_state: std_logic_vector(3 downto 0); + + type MED2INT_STATE_t is (IDLE, RECV2, RECV3, RECV4, RECV5); + signal MED2INT_state, next_MED2INT_state: MED2INT_STATE_t; signal DAT_MED2INT, next_DAT_MED2INT :std_logic_vector(51 downto 0); signal buf_INT_DATA_IN, next_buf_INT_DATA_IN :std_logic_vector(55 downto 0); @@ -81,7 +83,7 @@ architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is signal next_INT_DATAREADY_OUT, buf_INT_DATAREADY_OUT: std_logic; signal next_buf_INT_READ_OUT, buf_INT_READ_OUT: std_logic; - signal buf_MED_TRANSMISSION_CLK_OUT,next_MED_TRANSMISSION_CLK_OUT: std_logic; + signal buf_MED_TRANSMISSION_CLK_OUT: std_logic; signal buf_MED_CARRIER_OUT, next_MED_CARRIER_OUT: STD_LOGIC; signal buf_MED_PARITY_OUT, next_MED_PARITY_OUT: STD_LOGIC; signal my_error,next_my_error : std_logic_vector(2 downto 0); @@ -89,7 +91,7 @@ architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is signal next_media_not_connected : std_logic; signal transmission_clk_Counter : std_logic_vector(4 downto 0); signal next_transmission_clk_Counter : std_logic_vector(4 downto 0); - signal TRANSMISSION_CLK, next_TRANSMISSION_CLK: std_logic; + signal next_TRANSMISSION_CLK: std_logic; signal buf_CTRL, next_STAT, buf_STAT : std_logic_vector(31 downto 0); signal next_RECV_STAT, RECV_STAT : std_logic_vector(8 downto 0); @@ -100,7 +102,7 @@ architecture trb_net_med_13bit_slow_arch of trb_net_med_13bit_slow is signal packets_in_compl_counter, next_packets_in_compl_counter: std_logic_vector(3 downto 0); signal packets_out_counter, next_packets_out_counter: std_logic_vector(3 downto 0); - signal last_MED_TRANSMISSION_CLK_IN, next_last_MED_TRANSMISSION_CLK_IN : std_logic; + signal last_MED_TRANSMISSION_CLK_IN : std_logic; signal reg_MED_DATA_IN : std_logic_vector(12 downto 0); signal reg_MED_TRANSMISSION_CLK_IN, reg_MED_CARRIER_IN : std_logic; signal reg_MED_PARITY_IN : std_logic; @@ -130,7 +132,7 @@ fatal_error <= '0'; gen_STAT_WORD: process(MED2INT_state,INT2MED_state,buf_INT_DATAREADY_OUT,RECV_STAT,buf_STAT) begin next_STAT <= (others => '0'); - if MED2INT_state = 0 then + if MED2INT_state = IDLE then next_STAT(0) <= '0'; else next_STAT(0) <= '1'; @@ -141,7 +143,7 @@ gen_STAT_WORD: process(MED2INT_state,INT2MED_state,buf_INT_DATAREADY_OUT,RECV_ST next_STAT(1) <= '1'; end if; next_STAT(11 downto 8) <= INT2MED_state; - next_STAT(15 downto 12) <= MED2INT_state; + --next_STAT(15 downto 12) <= MED2INT_state; next_STAT(16) <= media_not_connected; next_STAT(31 downto 24) <= packets_in_counter; --next_STAT(27 downto 24) <= packets_in_compl_counter; @@ -172,7 +174,7 @@ CTRL_reg: process (CLK,RESET) buf_CTRL <= (others => '0'); elsif rising_edge(CLK) then buf_CTRL <= CTRL; - buf_CTRL(31 downto 24) <= packets_in_counter; + --buf_CTRL(31 downto 24) <= packets_in_counter; --buf_CTRL(27 downto 24) <= packets_in_compl_counter; else buf_CTRL <= buf_CTRL; @@ -285,6 +287,7 @@ INT2MED_fsm: process(buf_INT_DATA_IN,INT2MED_state, INT_DATAREADY_IN, INT_DATA_IN, buf_INT_READ_OUT, next_TRANSMISSION_CLK, buf_MED_TRANSMISSION_CLK_OUT, buf_MED_DATA_OUT, buf_MED_CARRIER_OUT, buf_MED_PARITY_OUT, buf_CTRL) + variable tmp: std_logic_vector(12 downto 0); begin next_INT2MED_state <= "0000"; next_buf_MED_DATA_OUT <= buf_MED_DATA_OUT; @@ -311,7 +314,7 @@ begin if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then next_buf_MED_DATA_OUT(12 downto 0) <= buf_INT_DATA_IN(12 downto 0); next_MED_CARRIER_OUT <= '1'; - next_MED_PARITY_OUT <= '1'; + next_MED_PARITY_OUT <= xor_all(buf_INT_DATA_IN(12 downto 0)); next_INT2MED_state <= "0010"; else next_INT2MED_state <= "0001"; @@ -319,7 +322,7 @@ begin when "0010" => if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then next_buf_MED_DATA_OUT(12 downto 0) <= buf_INT_DATA_IN(25 downto 13); - next_MED_PARITY_OUT <= '0'; + next_MED_PARITY_OUT <= xor_all(buf_INT_DATA_IN(25 downto 13)); next_INT2MED_state <= "0100"; else next_INT2MED_state <= "0010"; @@ -327,6 +330,7 @@ begin when "0100" => if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then next_buf_MED_DATA_OUT(12 downto 0) <= buf_INT_DATA_IN(38 downto 26); + next_MED_PARITY_OUT <= xor_all(buf_INT_DATA_IN(38 downto 26)); next_INT2MED_state <= "0110"; else next_INT2MED_state <= "0100"; @@ -334,15 +338,20 @@ begin when "0110" => if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then next_buf_MED_DATA_OUT(12 downto 0) <= buf_INT_DATA_IN(51 downto 39); + next_MED_PARITY_OUT <= xor_all(buf_INT_DATA_IN(51 downto 39)); next_INT2MED_state <= "1000"; else next_INT2MED_state <= "0110"; end if; when "1000" => if next_TRANSMISSION_CLK = '0' and buf_MED_TRANSMISSION_CLK_OUT = '1' then - next_buf_MED_DATA_OUT(3 downto 0) <= buf_INT_DATA_IN(55 downto 52); - next_buf_MED_DATA_OUT(11 downto 4) <= buf_CTRL(31 downto 24); - next_buf_MED_DATA_OUT(12) <= buf_CTRL(0); + + tmp(3 downto 0) := buf_INT_DATA_IN(55 downto 52); + tmp(11 downto 4) := buf_CTRL(31 downto 24); + tmp(12) := buf_CTRL(0); + + next_buf_MED_DATA_OUT <= tmp; + next_MED_PARITY_OUT <= xor_all(tmp); next_INT2MED_state <= "1110"; else next_INT2MED_state <= "1000"; @@ -408,69 +417,81 @@ INT2MED_fsm_reg: process(CLK,RESET) -------------------------------- MED2INT_fsm: process(reg_MED_PARITY_IN,MED2INT_state,CLK,reg_MED_DATA_IN,DAT_MED2INT, - reg_MED_TRANSMISSION_CLK_IN,reg_MED_CARRIER_IN,INT_READ_IN, RECV_STAT, - media_not_connected,buf_INT_DATAREADY_OUT, buf_INT_DATA_OUT, last_MED_TRANSMISSION_CLK_IN) + reg_MED_TRANSMISSION_CLK_IN,reg_MED_CARRIER_IN,INT_READ_IN, RECV_STAT, + media_not_connected,buf_INT_DATAREADY_OUT, buf_INT_DATA_OUT, last_MED_TRANSMISSION_CLK_IN + ) begin next_DAT_MED2INT <= DAT_MED2INT; next_INT_DATA_OUT <= buf_INT_DATA_OUT; next_INT_DATAREADY_OUT <= buf_INT_DATAREADY_OUT; - next_MED2INT_state <= "0000"; + next_MED2INT_state <= IDLE; next_RECV_STAT <= RECV_STAT; next_packets_in_counter <= packets_in_counter; next_packets_in_compl_counter <= packets_in_compl_counter; case MED2INT_state is - when "0000" => - if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' - and reg_MED_CARRIER_IN = '1' and reg_MED_PARITY_IN = '1' then - next_MED2INT_state <= "0001"; + when IDLE => + if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then + next_MED2INT_state <= RECV2; next_DAT_MED2INT(12 downto 0) <= reg_MED_DATA_IN(12 downto 0); - next_packets_in_counter <= packets_in_counter + 1; end if; - when "0001" => + when RECV2 => if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then - next_MED2INT_state <= "0010"; + next_MED2INT_state <= RECV3; next_DAT_MED2INT(25 downto 13) <= reg_MED_DATA_IN(12 downto 0); - next_packets_in_counter <= packets_in_counter + 1; else - next_MED2INT_state <= "0001"; + next_MED2INT_state <= RECV2; end if; - when "0010" => + when RECV3 => if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then - next_MED2INT_state <= "0011"; + next_MED2INT_state <= RECV4; next_DAT_MED2INT(38 downto 26) <= reg_MED_DATA_IN(12 downto 0); - next_packets_in_counter <= packets_in_counter + 1; else - next_MED2INT_state <= "0010"; + next_MED2INT_state <= RECV3; end if; - when "0011" => + when RECV4 => if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then - next_MED2INT_state <= "0100"; + next_MED2INT_state <= RECV5; next_DAT_MED2INT(51 downto 39) <= reg_MED_DATA_IN(12 downto 0); - next_packets_in_counter <= packets_in_counter + 1; else - next_MED2INT_state <= "0011"; + next_MED2INT_state <= RECV4; end if; - when "0100" => + when RECV5 => if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '1' then next_INT_DATA_OUT(51 downto 0) <= DAT_MED2INT(51 downto 0); next_INT_DATA_OUT(55 downto 52) <= reg_MED_DATA_IN(3 downto 0); next_RECV_STAT <= reg_MED_DATA_IN(12 downto 4); next_INT_DATAREADY_OUT <= '1'; - next_MED2INT_state <= "0000"; + next_MED2INT_state <= IDLE; next_packets_in_counter <= packets_in_counter + 1; else - next_MED2INT_state <= "0100"; + next_MED2INT_state <= RECV5; end if; when others => - next_MED2INT_state <= "0000"; + next_MED2INT_state <= IDLE; end case; + + --clear dataready when read if buf_INT_DATAREADY_OUT = '1' and INT_READ_IN = '1' then next_INT_DATAREADY_OUT <= '0'; next_INT_DATA_OUT <= (others => '0'); end if; + + --check parity + if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' then + if(xor_all(reg_MED_DATA_IN(12 downto 0)) /= reg_MED_PARITY_IN) then + next_MED2INT_state <= IDLE; + end if; + end if; + + --reset on Carrier low +-- if reg_MED_TRANSMISSION_CLK_IN = '1' and last_MED_TRANSMISSION_CLK_IN = '0' and reg_MED_CARRIER_IN = '0' then +-- next_MED2INT_state <= IDLE; +-- end if; + + --reset on not connected if media_not_connected = '1' then - next_MED2INT_state <= "0000"; + next_MED2INT_state <= IDLE; end if; end process; @@ -478,7 +499,7 @@ MED2INT_fsm: process(reg_MED_PARITY_IN,MED2INT_state,CLK,reg_MED_DATA_IN,DAT_MED MED2INT_fsm_reg: process(CLK,RESET) begin if RESET='1' then - MED2INT_state <= "0000"; + MED2INT_state <= IDLE; buf_INT_DATAREADY_OUT <= '0'; DAT_MED2INT <= (others => '0'); buf_INT_DATA_OUT <= (others => '0'); diff --git a/trb_net_std.vhd b/trb_net_std.vhd index 3f11882..9c8817a 100644 --- a/trb_net_std.vhd +++ b/trb_net_std.vhd @@ -12,6 +12,9 @@ package trb_net_std is return std_logic; function all_zero (arg : std_logic_vector) return std_logic; + function xor_all (arg : std_logic_vector) + return std_logic; + subtype TYPE_POSITION is integer range 50 downto 48; constant TYPE_DAT : std_logic_vector(2 downto 0) := "000"; @@ -52,7 +55,7 @@ package trb_net_std is INT_READ_OUT: STD_LOGIC; INT_ERROR_IN: STD_LOGIC_VECTOR (2 downto 0); -- Status bits end record; - + end package trb_net_std; @@ -90,6 +93,17 @@ package body trb_net_std is end loop; -- i return tmp; end function all_zero; + + function xor_all (arg : std_logic_vector) + return std_logic is + variable tmp : std_logic := '0'; + begin + tmp := '0'; + for i in arg'range loop + tmp := tmp xor arg(i); + end loop; -- i + return tmp; + end function xor_all; end package body trb_net_std; -- 2.43.0