OpenCores
URL https://opencores.org/ocsvn/rio/rio/trunk

Subversion Repositories rio

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /rio
    from Rev 33 to Rev 34
    Reverse comparison

Rev 33 → Rev 34

/branches/singleSymbol/rtl/vhdl/RioLogicalCommon.vhd
80,10 → 80,12
-- 1: src(15:0);transaction(3:0)
-- shifter: 16 (48 empty)
 
-------------------------------------------------------------------------------
-- RioLogicalCommonIngress.
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use work.rio_common.all;
 
-------------------------------------------------------------------------------
271,16 → 273,356
end architecture;
 
 
-------------------------------------------------------------------------------
-- RioLogicalCommonEgress.
-- Only 8-bit and 16-bit deviceId are supported. The first write must contain
-- the 16-bit header, the second write must contain the destination address and
-- the third must contain the source address.
-- CRC is calculated during the transfer and inserted at byte 81 and 82 and
-- appended to the packet when it ends.
-- slaveSelect_i - four bits indicating valid bytes in slaveData_i.
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.rio_common.all;
 
-------------------------------------------------------------------------------
-- Entity for RioLogicalCommonEgress.
-------------------------------------------------------------------------------
entity RioLogicalCommonEgress is
port(
clk : in std_logic;
areset_n : in std_logic;
 
writeFrameFull_i : in std_logic;
writeFrame_o : out std_logic;
writeFrameAbort_o : out std_logic;
writeContent_o : out std_logic;
writeContentData_o : out std_logic_vector(31 downto 0);
 
slaveCyc_i : in std_logic;
slaveStb_i : in std_logic;
slaveSel_i : in std_logic_vector(3 downto 0);
slaveDat_i : in std_logic_vector(31 downto 0);
slaveAck_o : out std_logic);
end entity;
 
 
-------------------------------------------------------------------------------
-- Architecture for RioLogicalCommonEgress.
-------------------------------------------------------------------------------
architecture RioLogicalCommonEgress of RioLogicalCommonEgress is
 
component Crc16CITT is
port(
d_i : in std_logic_vector(15 downto 0);
crc_i : in std_logic_vector(15 downto 0);
crc_o : out std_logic_vector(15 downto 0));
end component;
 
signal crc16Current, crc16Temp, crc16Next: std_logic_vector(15 downto 0);
 
begin
 
process(clk, areset_n)
begin
if (areset_n = '0') then
crc16Current <= x"0000";
writeContentData <= (others=>'0');
elsif (clk'event and clk = '1') then
writeContent_o <= '0';
writeFrame_o <= '0';
case state is
when IDLE =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
if (writeFrameFull_i = '0') then
state <= HEADER_GET;
packetPosition <= 0;
crc16Current <= x"ffff";
end if;
 
when GET_HEADER =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
if ((slaveCyc_i = '1') and (slaveStb_i = '1')) then
-- REMARK: Only support the header in one position?
if (slaveSelect_i = "1100") then
header <= slaveData_i(31 downto 16);
tt <= slaveData_i(21 downto 20);
elsif (slaveSelect_i = "0110") then
header <= slaveData_i(23 downto 8);
tt <= slaveData_i(13 downto 12);
elsif (slaveSelect_i = "0011") then
header <= slaveData_i(15 downto 0);
tt <= slaveData_i(5 downto 4);
else
-- Not supported.
end if;
slaveAck_o <= '1';
 
state <= HEADER_ACK;
else
state <= RESTART_FRAME;
end if;
 
when HEADER_ACK =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
slaveAck_o <= '0';
state <= DESTINATION_GET;
 
when DESTINATION_GET =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
if ((slaveCyc_i = '1') and (slaveStb_i = '1')) then
-- REMARK: Only support the destination in one position?
if (slaveSelect_i = "1000") and (tt = "00") then
dstAddr <= slaveData_i(31 downto 24);
elsif (slaveSelect_i = "0100") and (tt = "00") then
dstAddr <= slaveData_i(23 downto 16);
elsif (slaveSelect_i = "0010") and (tt = "00") then
dstAddr <= slaveData_i(15 downto 8);
elsif (slaveSelect_i = "0001") and (tt = "00") then
dstAddr <= slaveData_i(7 downto 0);
elsif (slaveSelect_i = "1100") and (tt = "01") then
writeContent_o <= '1';
writeContentData <= header & slaveData_i(31 downto 16);
packetPosition <= packetPosition + 1;
elsif (slaveSelect_i = "0110") and (tt = "01") then
writeContent_o <= '1';
writeContentData <= header & slaveData_i(24 downto 8);
packetPosition <= packetPosition + 1;
elsif (slaveSelect_i = "0011") and (tt = "01") then
writeContent_o <= '1';
writeContentData <= header & slaveData_i(15 downto 0);
packetPosition <= packetPosition + 1;
else
-- REMARK: Not supported.
end if;
slaveAck_o <= '1';
 
state <= DESTINATION_ACK;
else
state <= RESTART_FRAME;
end if;
when DESTINATION_ACK =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
slaveAck_o <= '0';
state <= SOURCE_GET;
 
when SOURCE_GET =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
if ((slaveCyc_i = '1') and (slaveStb_i = '1')) then
-- REMARK: Only support the source in one position?
if (slaveSelect_i = "1000") and (tt = "00") then
halfWordPending <= '0';
writeContent_o <= '1';
writeContentData <= header & dstAddr & slaveData_i(31 downto 24);
packetPosition <= packetPosition + 1;
elsif (slaveSelect_i = "0100") and (tt = "00") then
halfWordPending <= '0';
writeContent_o <= '1';
writeContentData <= header & dstAddr & slaveData_i(23 downto 16);
packetPosition <= packetPosition + 1;
elsif (slaveSelect_i = "0010") and (tt = "00") then
halfWordPending <= '0';
writeContent_o <= '1';
writeContentData <= header & dstAddr & slaveData_i(15 downto 8);
packetPosition <= packetPosition + 1;
elsif (slaveSelect_i = "0001") and (tt = "00") then
halfWordPending <= '0';
writeContent_o <= '1';
writeContentData <= header & dstAddr & slaveData_i(7 downto 0);
packetPosition <= packetPosition + 1;
elsif (slaveSelect_i = "1100") and (tt = "01") then
halfWordPending <= '1';
halfWord <= slaveData_i(31 downto 16);
elsif (slaveSelect_i = "0110") and (tt = "01") then
halfWordPending <= '1';
halfWord <= slaveData_i(24 downto 8);
elsif (slaveSelect_i = "0011") and (tt = "01") then
halfWordPending <= '1';
halfWord <= slaveData_i(15 downto 0);
else
-- REMARK: Not supported.
end if;
slaveAck_o <= '1';
 
state <= SOURCE_ACK;
else
state <= RESTART_FRAME;
end if;
when SOURCE_ACK =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
slaveAck_o <= '0';
 
if (tt = "00") then
crcCurrent <= crcNext;
end if;
state <= CONTENT_GET;
when CONTENT_GET =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
if ((slaveCyc_i = '1') and (slaveStb_i = '1')) then
-- REMARK: Only support full writes? Not possible with the last
-- access though.
if (slaveSelect_i = "1111") then
if (halfWordPending = '0') then
writeContent_o <= '1';
writeContentData <= slaveData_i;
packetPosition <= packetPosition + 1;
else
writeContent_o <= '1';
writeContentData <= halfWord & slaveData_i(31 downto 16);
packetPosition <= packetPosition + 1;
halfWord <= slaveData_i(15 downto 0);
end if;
elsif (slaveSelect_i = "1100") then
if (halfWordPending = '0') then
halfWordPending <= '1';
halfWord <= slaveData_i(31 downto 16);
else
writeContent_o <= '1';
writeContentData <= halfWord & slaveData_i(31 downto 16);
packetPosition <= packetPosition + 1;
halfWordPending <= '0';
end if;
elsif (slaveSelect_i = "0011") then
if (halfWordPending = '0') then
halfWordPending <= '1';
halfWord <= slaveData_i(15 downto 0);
else
writeContent_o <= '1';
writeContentData <= halfWord & slaveData_i(15 downto 0);
packetPosition <= packetPosition + 1;
halfWordPending <= '0';
end if;
end if;
slaveAck_o <= '1';
 
state <= CONTENT_ACK;
else
state <= CRC_APPEND;
end if;
 
when CONTENT_ACK =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
slaveAck_o <= '0';
crc16Current <= crc16Next;
 
if (packetPosition = 20) then
if (halfWordPending = '0') then
halfWordPending <= '1';
halfWord <= crc16Next;
else
-- REMARK: The current CRC has to be updated when this is written.
writeContent_o <= '1';
writeContentData <= halfWord & crc16Next;
packetPosition <= packetPosition + 1;
halfWordPending <= '0';
halfWord <= crc16Next;
end if;
end if;
state <= CONTENT_GET;
 
when CRC_APPEND =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
if (halfWordPending = '0') then
writeContent_o <= '1';
writeContentData <= crc16Current & x"0000";
packetPosition <= packetPosition + 1;
else
writeContent_o <= '1';
writeContentData <= halfWord & crc16Current;
packetPosition <= packetPosition + 1;
end if;
 
state <= SEND_FRAME;
 
when SEND_FRAME =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
writeFrame_o <= '1';
state <= WAIT_UPDATE;
 
when RESTART_FRAME =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
writeFrameAbort_o <= '1';
state <= WAIT_UPDATE;
 
when WAIT_UPDATE =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
state <= IDLE;
when others =>
---------------------------------------------------------------------
--
---------------------------------------------------------------------
end case;
end if;
end process;
 
-----------------------------------------------------------------------------
-- Packet CRC calculation.
-----------------------------------------------------------------------------
 
Crc16High: Crc16CITT
port map(
d_i=>writeContentData(31 downto 16), crc_i=>crc16Current, crc_o=>crc16Temp);
Crc16Low: Crc16CITT
port map(
d_i=>writeContentData(15 downto 0), crc_i=>crc16Temp, crc_o=>crc16Next);
 
 
end architecture;
 
 
 
 
 
-------------------------------------------------------------------------------
-- RioLogicalMaintenanceRequest
-- This logical layer module handles ingress maintenance requests.
-- Addresses: 0x80 (maint read request) and 0x81 (maint write request).
-------------------------------------------------------------------------------
library ieee;
use ieee.numeric_std.ALL;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
use work.rio_common.all;
 
-------------------------------------------------------------------------------
301,9 → 643,15
 
slaveCyc_i : in std_logic;
slaveStb_i : in std_logic;
slaveAddress_i : in std_logic_vector(7 downto 0);
slaveData_i : in std_logic_vector(31 downto 0);
slaveAck_o : out std_logic);
slaveAdr_i : in std_logic_vector(7 downto 0);
slaveDat_i : in std_logic_vector(31 downto 0);
slaveAck_o : out std_logic;
 
masterCyc_o : out std_logic;
masterStb_o : out std_logic;
masterSel_o : out std_logic_vector(3 downto 0);
masterDat_o : out std_logic_vector(31 downto 0);
masterAck_i : in std_logic);
end entity;
 
architecture RioLogicalMaintenanceRequest of RioLogicalMaintenanceRequest is
321,6 → 669,7
elsif (slaveStb_i = '1') then
if (slaveAck = '0') then
if (slaveAddress_i = x"80") then
-- Maintenance read request.
case (packetIndex) is
when 0 =>
-- x"0000" & ackid & vc & crf & prio & tt & ftype
329,17 → 678,14
when 2 =>
-- srcId
when 3 =>
-- transaction & wrsize & srcTID & hop & config_offset(20:13)
-- transaction & rdsize & srcTID & hop & config_offset(20:13)
when 4 =>
-- config_offset(12:0) & wdptr & rsrv & double-word(63:48)
when 5 =>
-- double-word(47:16)
when 6 =>
-- double-word(15:0) & crc(15:0)
-- config_offset(12:0) & wdptr & rsrv & crc(15:0)
when others =>
-- REMARK: Larger packets not supported.
end case;
elsif (slaveAddress_i = x"81") then
-- Maintenance write request.
case (packetIndex) is
when 0 =>
-- x"0000" & ackid & vc & crf & prio & tt & ftype
348,9 → 694,13
when 2 =>
-- srcId
when 3 =>
-- transaction & rdsize & srcTID & hop & config_offset(20:13)
-- transaction & wrsize & srcTID & hop & config_offset(20:13)
when 4 =>
-- config_offset(12:0) & wdptr & rsrv & crc(15:0)
-- config_offset(12:0) & wdptr & rsrv & double-word(63:48)
when 5 =>
-- double-word(47:16)
when 6 =>
-- double-word(15:0) & crc(15:0)
when others =>
-- REMARK: Larger packets not supported.
end case;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.