Untitled
unknown
plain_text
7 months ago
17 kB
6
Indexable
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.common_pack.all;
entity cmdProc is
port (
clk : in std_logic;
reset : in std_logic;
rxnow : in std_logic;
rxData : in std_logic_vector (7 downto 0);
txData : out std_logic_vector (7 downto 0);
rxdone : out std_logic;
ovErr : in std_logic;
framErr : in std_logic;
txnow : out std_logic;
txdone : in std_logic;
start : out std_logic;
numWords_bcd : out BCD_ARRAY_TYPE(2 downto 0);
byte_hex_list : inout CHAR_ARRAY_TYPE(13 downto 0);
dataReady : in std_logic;
byte : in std_logic_vector(7 downto 0);
maxIndex : in BCD_ARRAY_TYPE(2 downto 0);
dataResults : in CHAR_ARRAY_TYPE(0 to RESULT_BYTE_NUM-1);
seqDone : in std_logic
);
end cmdProc;
architecture arch of cmdProc is
function hexConvert(nibble: std_logic_vector(3 downto 0)) return std_logic_vector is
begin
case nibble is
when "0000" => return "00110000"; -- '0'
when "0001" => return "00110001"; -- '1'
when "0010" => return "00110010"; -- '2'
when "0011" => return "00110011"; -- '3'
when "0100" => return "00110100"; -- '4'
when "0101" => return "00110101"; -- '5'
when "0110" => return "00110110"; -- '6'
when "0111" => return "00110111"; -- '7'
when "1000" => return "00111000"; -- '8'
when "1001" => return "00111001"; -- '9'
when "1010" => return "00111010"; -- 'A'
when "1011" => return "00111011"; -- 'B'
when "1100" => return "00111100"; -- 'C'
when "1101" => return "00111101"; -- 'D'
when "1110" => return "00111110"; -- 'E'
when others => return "00111111"; -- 'F'
end case;
end function;
type state_type is (IDLE, SEND, cmdA_proc, cmdP_proc, cmdL_proc, byteFirstHalf,
byteSecondHalf, printSpaceCMDA, pPeakSecondHalf, printSpaceCMDP,
cmdP_print1, cmdP_print2, cmdP_print3, l1nibble2, l1nibbleSpace,
l2nibble1, l2nibble2, l2nibbleSpace, l3nibble1, l3nibble2, l3nibbleSpace,
l4nibble1, l4nibble2, l4nibbleSpace, l5nibble1, l5nibble2, l5nibbleSpace,
l6nibble1, l6nibble2, l6nibbleSpace, l7nibble1, l7nibble2, START_TRANSMIT, TRANSMIT_DATA);
signal curState, nextState : state_type;
signal numWords_reg : BCD_ARRAY_TYPE(2 downto 0) := (others => (others => '0'));
signal counter : integer range 0 to 2 := 2;
signal next_txData : std_logic_vector(7 downto 0);
signal next_txnow : std_logic;
signal next_start : std_logic;
signal next_rxdone : std_logic;
signal next_counter : integer range 0 to 2;
signal next_numWords_bcd : BCD_ARRAY_TYPE(2 downto 0) := (others => (others => '0'));
signal next_rxData_reg : std_logic_vector(7 downto 0);
signal rxData_reg : std_logic_vector(7 downto 0) := (others => '0');
signal sig_proof : std_logic := '0';
begin
process(clk, reset)
begin
if reset = '1' then
curState <= IDLE;
-- rxData_reg <= (others => '0');
-- txData <= (others => '0');
-- txnow <= '0';
-- start <= '0';
-- rxdone <= '0';
-- counter <= 2;
numWords_bcd <= (others => (others => '0'));
elsif rising_edge(clk) then
curState <= nextState;
-- rxData_reg <= next_rxData_reg;
-- txData <= next_txData;
-- txnow <= next_txnow;
-- start <= next_start;
-- rxdone <= next_rxdone;
-- counter <= next_counter;
-- numWords_bcd <= next_numWords_bcd;
end if;
end process;
process (seqDone, dataReady, txdone, byte, rxData, rxnow, curState)
begin
txnow <= '0';
next_start <= '0';
rxdone <= '0';
counter <= counter;
next_numWords_bcd <= numWords_reg;
case curState is
when IDLE =>
if rxNow = '1' then -- Rx signals that data is ready
nextState <= START_TRANSMIT;
else
nextState <= IDLE;
end if;
-- START_TRANSMIT is necessary to assert txNow and rxDone for 1 cycle
-- It also gives 1 cycle for the Tx to deassert (take low) the txDone
-- signal so that it can be monitored in TRANSMIT_DATA for completion
-- of transmission of current word
when START_TRANSMIT =>
txNow <= '1';
rxDone <= '1';
nextState <= TRANSMIT_DATA;
when TRANSMIT_DATA =>
if txDone = '1' then -- wait for Tx to signal that transmission is complete
nextState <= IDLE;
else
nextState <= TRANSMIT_DATA;
end if;
-- when IDLE =>
-- if (rxNow = '1' and txdone = '1') then
-- next_txData <= rxData;
-- next_rxdone <= '1';
-- next_txnow <= '1';
-- if rxData = "01100001" or rxData = "01000001" then -- CMD ANNN or aNNN
-- nextState <= cmdA_proc;
-- elsif (seqDone = '1') and (rxData = "01010000" or rxData = "01110000") then -- CMD P or p
-- nextState <= cmdP_proc;
-- elsif (seqDone = '1') and (rxData = "01001100" or rxData = "01101100") then -- CMD L or l
-- nextState <= cmdL_proc;
-- else
-- nextState <= IDLE;
-- end if;
-- else
-- nextState <= IDLE;
-- end if;
when cmdA_proc =>
if counter = 0 then
next_start <= '1';
nextState <= byteFirstHalf;
elsif rxNow = '1' and txdone = '1' then
next_txData <= rxData;
next_rxdone <= '1';
if rxData(7 downto 4) = "0011" then
next_numWords_bcd(counter) <= rxData(3 downto 0); -- CHECK IF Numwords_bcd is latch free
if counter > 0 then
next_counter <= counter - 1;
end if;
nextState <= cmdA_proc;
else
nextState <= IDLE; -- Invalid start command
end if;
else
nextState <= cmdA_proc;
end if;
when byteFirstHalf =>
if (dataReady = '1' and txDone = '1' and seqDone = '0') then
next_txData <= hexConvert(byte(7 downto 4));
next_txNow <= '1';
nextState <= byteSecondHalf;
else
nextState <= byteFirstHalf;
end if;
when byteSecondHalf =>
if (dataReady = '1' and txDone = '1' and seqDone = '0') then
next_txData <= hexConvert(byte(3 downto 0));
next_txNow <= '1';
nextState <= printSpaceCMDA;
else
nextState <= byteSecondHalf;
end if;
when printSpaceCMDA =>
if seqDone = '1' then
nextState <= IDLE;
elsif (dataReady = '1' and txDone = '1' and seqDone = '0') then
next_txData <= "00100000";
next_txNow <= '1';
nextState <= byteFirstHalf;
else
nextState <= printSpaceCMDA;
end if;
when cmdP_proc =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(0)(7 downto 4));
next_txNow <= '1';
nextState <= pPeakSecondHalf;
else
nextState <= cmdP_proc;
end if;
when pPeakSecondHalf =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(3)(3 downto 0));
next_txNow <= '1';
nextState <= printSpaceCMDP;
else
nextState <= pPeakSecondHalf;
end if;
when printSpaceCMDP =>
if txDone = '1' then
next_txData <= "00100000";
next_txNow <= '1';
nextState <= cmdP_print1;
else
nextState <= printSpaceCMDP;
end if;
when cmdP_print1 =>
if txdone = '1' then
next_txData <= hexConvert(maxIndex(2));
next_txnow <= '1';
nextState <= cmdP_print2;
else
nextState <= cmdP_print1;
end if;
when cmdP_print2 =>
if txdone = '1' then
next_txData <= hexConvert(maxIndex(1));
next_txnow <= '1';
nextState <= cmdP_print3;
else
nextState <= cmdP_print2;
end if;
when cmdP_print3 =>
if txDone = '1' then
next_txData <= hexConvert(maxIndex(0));
next_txnow <= '1';
nextState <= IDLE;
else
nextState <= cmdP_print3;
end if;
when cmdL_proc =>
if txDone = '1' and seqDone = '1' then
next_txData <= hexConvert(dataResults(0)(7 downto 4));
nextState <= l1nibble2;
else
nextState <= cmdL_proc;
end if;
when l1nibble2 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(0)(3 downto 0));
next_txNow <= '1';
nextState <= l1nibbleSpace;
else
nextState <= l1nibble2;
end if;
when l1nibbleSpace =>
if txDone = '1' then
next_txData <= "00100000";
next_txNow <= '1';
nextState <= l2nibble1;
else
nextState <= l1nibbleSpace;
end if;
when l2nibble1 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(1)(7 downto 4));
next_txNow <= '1';
nextState <= l2nibble2;
else
nextState <= l2nibble1;
end if;
when l2nibble2 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(1)(3 downto 0));
next_txNow <= '1';
nextState <= l2nibbleSpace;
else
nextState <= l2nibble2;
end if;
when l2nibbleSpace =>
if txDone = '1' then
next_txData <= "00100000";
next_txNow <= '1';
nextState <= l3nibble1;
else
nextState <= l2nibbleSpace;
end if;
when l3nibble1 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(2)(7 downto 4));
next_txNow <= '1';
nextState <= l3nibble2;
else
nextState <= l3nibble1;
end if;
when l3nibble2 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(2)(3 downto 0));
next_txNow <= '1';
nextState <= l3nibbleSpace;
else
nextState <= l3nibble2;
end if;
when l3nibbleSpace =>
if txDone = '1' then
next_txData <= "00100000";
next_txNow <= '1';
nextState <= l4nibble1;
else
nextState <= l3nibbleSpace;
end if;
when l4nibble1 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(3)(7 downto 4));
next_txNow <= '1';
nextState <= l4nibble2;
else
nextState <= l4nibble1;
end if;
when l4nibble2 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(3)(3 downto 0));
next_txNow <= '1';
nextState <= l4nibbleSpace;
else
nextState <= l4nibble2;
end if;
when l4nibbleSpace =>
if txDone = '1' then
next_txData <= "00100000";
next_txNow <= '1';
nextState <= l5nibble1;
else
nextState <= l4nibbleSpace;
end if;
when l5nibble1 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(4)(7 downto 4));
next_txNow <= '1';
nextState <= l5nibble2;
else
nextState <= l5nibble1;
end if;
when l5nibble2 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(4)(3 downto 0));
next_txNow <= '1';
nextState <= l5nibbleSpace;
else
nextState <= l5nibble2;
end if;
when l5nibbleSpace =>
if txDone = '1' then
next_txData <= "00100000";
next_txNow <= '1';
nextState <= l6nibble1;
else
nextState <= l5nibbleSpace;
end if;
when l6nibble1 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(5)(7 downto 4));
next_txNow <= '1';
nextState <= l6nibble2;
else
nextState <= l6nibble1;
end if;
when l6nibble2 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(5)(3 downto 0));
next_txNow <= '1';
nextState <= l6nibbleSpace;
else
nextState <= l6nibble2;
end if;
when l6nibbleSpace =>
if txDone = '1' then
next_txData <= "00100000";
next_txNow <= '1';
nextState <= l7nibble1;
else
nextState <= l6nibbleSpace;
end if;
when l7nibble1 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(6)(7 downto 4));
next_txNow <= '1';
nextState <= l7nibble2;
else
nextState <= l7nibble1;
end if;
when l7nibble2 =>
if txDone = '1' then
next_txData <= hexConvert(dataResults(6)(3 downto 0));
next_txNow <= '1';
nextState <= IDLE;
else
nextState <= l7nibble2;
end if;
when others =>
nextState <= IDLE;
end case;
end process;
txData <= rxData when sig_proof = '1' else
(others => '0');
end arch;
Editor is loading...
Leave a Comment