1
0
mirror of https://github.com/Klagarge/Cursor.git synced 2025-06-25 20:02:31 +00:00

Initial commit

This commit is contained in:
Rémi Heredero
2021-11-24 10:50:51 +01:00
commit c7ba678fbb
961 changed files with 501515 additions and 0 deletions

View File

@ -0,0 +1,54 @@
USE std.textio.all;
ARCHITECTURE bhv OF bramDualportWritefirst IS
-- Define ramContent type
type ramContentType is array(0 to (2**addressBitNb)-1) of bit_vector(dataBitNb-1 DOWNTO 0);
-- Define function to create initvalue signal
impure function ReadRamContentFromFile(ramContentFilenAme : in string) return ramContentType is
FILE ramContentFile : text is in ramContentFilenAme;
variable ramContentFileLine : line;
variable ramContent : ramContentType;
begin
for i in ramContentType'range loop
readline(ramContentFile, ramContentFileLine);
read(ramContentFileLine, ramContent(i));
end loop;
return ramContent;
end function;
-- Declare ramContent signal
shared variable ramContent: ramContentType := ReadRamContentFromFile(initFile);
BEGIN
-- Port A
process(clockA)
begin
if clockA'event and clockA='1' then
if enA = '1' then
if writeEnA = '1' then
dataOutA <= dataInA;
ramContent(to_integer(unsigned(addressA))) := to_bitvector(dataInA,'0');
else
dataOutA <= to_stdulogicvector(ramContent(to_integer(unsigned(addressA))));
end if;
end if;
end if;
end process;
-- Port B
process(clockB)
begin
if clockB'event and clockB='1' then
if enB = '1' then
-- if writeEnB = '1' then
-- ramContent(to_integer(unsigned(addressB))) := to_bitvector(dataInB,'0');
-- dataOutB <= dataInB;
-- else
dataOutB <= to_stdulogicvector(ramContent(to_integer(unsigned(addressB))));
-- end if;
end if;
end if;
end process;
END ARCHITECTURE bhv;

View File

@ -0,0 +1,39 @@
USE std.textio.all;
ARCHITECTURE bhv OF bram IS
-- Define ramContent type
type ramContentType is array(0 to (2**addressBitNb)-1) of bit_vector(dataBitNb-1 DOWNTO 0);
-- Define function to create initvalue signal
impure function ReadRamContentFromFile(ramContentFilenAme : in string) return ramContentType is
FILE ramContentFile : text is in ramContentFilenAme;
variable ramContentFileLine : line;
variable ramContent : ramContentType;
begin
for i in ramContentType'range loop
readline(ramContentFile, ramContentFileLine);
read(ramContentFileLine, ramContent(i));
end loop;
return ramContent;
end function;
-- Declare ramContent signal
shared variable ramContent: ramContentType := ReadRamContentFromFile(initFile);
BEGIN
-- Port A
process(clock)
begin
if clock'event and clock='1' then
if en = '1' then
if writeEn = '1' then
dataOut <= dataIn;
ramContent(to_integer(unsigned(addressIn))) := to_bitvector(dataIn,'0');
else
dataOut <= to_stdulogicvector(ramContent(to_integer(unsigned(addressIn))));
end if;
end if;
end if;
end process;
END ARCHITECTURE bhv;

View File

@ -0,0 +1,55 @@
USE std.textio.all;
ARCHITECTURE bhv OF bramContentDualportWritefirst IS
-- Define ramContent type
type ramContentType is array(0 to (2**addr_bit_nb)-1) of bit_vector(data_bit_nb-1 DOWNTO 0);
-- Define function to create initvalue signal
impure function ReadRamContentFromFile(ramContentFilenAme : in string) return ramContentType is
FILE ramContentFile : text is in ramContentFilenAme;
variable ramContentFileLine : line;
variable ramContent : ramContentType;
begin
for i in ramContentType'range loop
readline(ramContentFile, ramContentFileLine);
read(ramContentFileLine, ramContent(i));
end loop;
return ramContent;
end function;
-- Declare ramContent signal
shared variable ramContent: ramContentType := ReadRamContentFromFile(init_file);
BEGIN
-- Port A
process(clockA)
begin
if clockA'event and clockA='1' then
if enA = '1' then
if writeEnA = '1' then
dataOutA <= dataInA;
ramContent(to_integer(unsigned(addressA))) := to_bitvector(dataInA,'0');
else
dataOutA <= to_stdulogicvector(ramContent(to_integer(unsigned(addressA))));
end if;
end if;
end if;
end process;
-- Port B
process(clockB)
begin
if clockB'event and clockB='1' then
if enB = '1' then
if writeEnB = '1' then
ramContent(to_integer(unsigned(addressB))) := to_bitvector(dataInB,'0');
dataOutB <= dataInB;
else
dataOutB <= to_stdulogicvector(ramContent(to_integer(unsigned(addressB))));
end if;
end if;
end if;
end process;
END ARCHITECTURE bhv;

View File

@ -0,0 +1,73 @@
-- ------------------------------------------------------------------------------
-- Copyright 2013 HES-SO Valais Wallis (www.hevs.ch)
-- ------------------------------------------------------------------------------
-- FIFO bridge with bus width adaption
-- A shift register that connects two FIFOs with different bus width.
-- Many IP blocks nowadays have FIFO or FIFO-like interfaces and often they
-- have to be connected. This block can the be used for this task, even if
-- the bus size of the two FIFO interfaces is different.
-- The Rx side bus width has to be a multiple of the Tx side bus width.
--
-- Created on 2013-10-18
--
-- Author: Oliver A. Gubler (oliver.gubler@hevs.ch)
--
-- 2014-10-06: *modify introduction text
-- +add some comment
-- *change readRx to a pulse
-- *fix bug on shift of shiftreg_s
-- 2013-10-18: +intital release
-- ------------------------------------------------------------------------------
--
library Common;
use Common.CommonLib.all;
ARCHITECTURE behavioral OF fifoBridgeRxToTxBusWidthAdaptionRxBigger IS
signal cnt_s: unsigned(requiredBitNb(dataBitNbRx)-1 downto 0);
signal shiftreg_s: std_ulogic_vector(dataBitNbRx-1 downto 0);
signal emptyRx_s: std_ulogic; -- internal empty signal
signal writeTx_s: std_ulogic; -- internal write signal
constant ratio_rxtx_c: positive range 1 to dataBitNbRx/dataBitNbTx:= dataBitNbRx/dataBitNbTx;
BEGIN
rx0: process(clock, reset)
begin
if reset = '1' then
shiftreg_s <= (others => '0');
emptyRx_s <= '1';
cnt_s <= (others => '0');
writeTx_s <= '0';
dataTx <= (others => '0');
readRx <= '0';
elsif rising_edge(clock) then
writeTx_s <= '0';
readRx <= '0';
-- fetch data
if emptyRx_s = '1' and emptyRx = '0' then
emptyRx_s <= '0';
shiftreg_s <= dataRx;
readRx <= '1';
end if;
-- shift data and put out
-- after each write, wait one cylce to check if full gets high
if emptyRx_s = '0' and fullTx = '0' and writeTx_s = '0' then
shiftreg_s <= shiftreg_s(dataBitNbRx-dataBitNbTx-1 downto 0) & std_ulogic_vector(to_unsigned(0,dataBitNbTx));
dataTx <= shiftreg_s(dataBitNbRx-1 downto dataBitNbRx-dataBitNbTx);
writeTx_s <= '1';
cnt_s <= cnt_s +1;
if cnt_s >= ratio_rxtx_c-1 then
cnt_s <= (others => '0');
emptyRx_s <= '1';
end if;
end if;
end if;
end process;
writeTx <= writeTx_s;
END ARCHITECTURE behavioral;

View File

@ -0,0 +1,75 @@
-- ------------------------------------------------------------------------------
-- Copyright 2013 HES-SO Valais Wallis (www.hevs.ch)
-- ------------------------------------------------------------------------------
-- FIFO bridge with bus width adaption
-- A shift register that connects two FIFOs with different bus width.
-- Many IP blocks nowadays have FIFO or FIFO-like interface. But the bus width
-- varies often. This block can the be used to adapt the bus width to your own
-- needs.
-- The Tx side bus width has to be a multiple of the Rx side bus width.
--
-- Created on 2013-10-21
--
-- Version: 1.0
-- Author: Oliver A. Gubler (oliver.gubler@hevs.ch)
-- ------------------------------------------------------------------------------
--
library common;
use common.commonlib.all;
ARCHITECTURE behavioral OF fifoBridgeRxToTxBusWidthAdaptionTxbigger IS
constant ratio_txrx_c: positive range 1 to dataBitNbTx/dataBitNbRx:= dataBitNbTx/dataBitNbRx;
signal cnt_s: unsigned(requiredBitNb(ratio_txrx_c-1)-1 downto 0);
signal shiftreg_s: std_ulogic_vector(dataBitNbTx-1 downto 0);
signal fullTx_s: std_ulogic;
signal emptyRx_s: std_ulogic;
BEGIN
rx0: process(clock, reset)
begin
if reset = '1' then
shiftreg_s <= (others => '0');
readRx <= '1';
emptyRx_s <= '1';
cnt_s <= (others => '0');
elsif rising_edge(clock) then
readRx <= NOT fullTx_s;
emptyRx_s <= '1';
if emptyRx = '0' and fullTx_s = '0' then
-- shiftreg_s(((to_integer(cnt_s)+1)*dataBitNbRx)-1 downto to_integer(cnt_s)*dataBitNbRx) <= dataRx;
shiftreg_s <= shiftreg_s(dataBitNbTx-dataBitNbRx-1 downto 0) & dataRx;
readRx <= '1';
cnt_s <= cnt_s +1;
if cnt_s >= ratio_txrx_c-1 then
cnt_s <= (others => '0');
emptyRx_s <= '0';
end if;
end if;
end if;
end process;
tx0: process(clock, reset)
begin
if reset = '1' then
fullTx_s <= '1';
writeTx <= '0';
dataTx <= (others => '0');
elsif rising_edge(clock) then
fullTx_s <= fullTx;
writeTx <= '0';
-- no need to wait to check for full (in contrast to RxBigger)
-- because it will forcibly take several clocks to fill the shiftreg
if emptyRx_s = '0' and fullTx = '0' then
dataTx <= shiftreg_s;
writeTx <= '1';
end if;
end if;
end process;
END ARCHITECTURE behavioral;

View File

@ -0,0 +1,165 @@
library Common;
use Common.CommonLib.all;
architecture RTL of FIFO_bram is
subtype register_type is std_ulogic_vector(dataIn'high downto 0);
type memory_type is array (0 to depth-1) of register_type;
signal writeCounter: unsigned(requiredBitNb(depth-1)-1 downto 0);
signal readCounter: unsigned(writeCounter'range);
signal memoryArray: memory_type;
type fifoStateType is (
sEmpty, sFull,
sRead, sWrite, sWriteFirst,
sReadWrite, sWait
);
signal fifoState: fifoStateType;
signal emptyCondition, fullCondition, empty_int: std_ulogic;
begin
------------------------------------------------------------------------------
-- read and write counters
updateWriteCounter: process(reset, clock)
begin
if reset = '1' then
writeCounter <= (others => '0');
elsif rising_edge(clock) then
if (write = '1') and (fullCondition = '0') then
writeCounter <= writeCounter + 1;
end if;
end if;
end process updateWriteCounter;
updateReadCounter: process(reset, clock)
begin
if reset = '1' then
readCounter <= (others => '0');
elsif rising_edge(clock) then
if (read = '1') and (empty_int = '0') then
readCounter <= readCounter + 1;
end if;
end if;
end process updateReadCounter;
------------------------------------------------------------------------------
-- memory access
writeMem: process(clock)
begin
if rising_edge(clock) then
if (write = '1') and (fullCondition = '0') then
memoryArray(to_integer(writeCounter)) <= dataIn;
end if;
end if;
end process writeMem;
readMem: process(reset, clock)
begin
if reset = '1' then
dataOut <= (others => '0');
elsif rising_edge(clock) then
if (read = '0') or (empty_int = '1') then
dataOut <= memoryArray(to_integer(readCounter));
else
dataOut <= memoryArray(to_integer(readCounter+1));
end if;
end if;
end process readMem;
------------------------------------------------------------------------------
-- controls
emptyCondition <= '1' when
( (fifoState = sRead) and (writeCounter = readCounter) ) or
(fifoState = sEmpty)
else '0';
fullCondition <= '1' when
( (fifoState = sWrite) and (writeCounter = readCounter) ) or
(fifoState = sFull)
else '0';
fifoControl: process(reset, clock)
begin
if reset = '1' then
fifoState <= sEmpty;
elsif rising_edge(clock) then
case fifoState is
when sEmpty =>
if write = '1' then
fifoState <= sWriteFirst;
end if;
when sFull =>
if (read = '1') then
fifoState <= sRead;
end if;
when sRead =>
if (read = '1') and (write = '1') then
fifoState <= sReadWrite;
elsif write = '1' then
fifoState <= sWrite;
elsif emptyCondition = '1' then
fifoState <= sEmpty;
elsif read = '1' then
fifoState <= sRead;
else
fifoState <= sWait;
end if;
when sWriteFirst =>
if (read = '1') and (write = '1') then
fifoState <= sReadWrite;
elsif write = '1' then
fifoState <= sWrite;
elsif read = '1' then
fifoState <= sRead;
else
fifoState <= sWait;
end if;
when sWrite =>
if (read = '1') and (write = '1') then
fifoState <= sReadWrite;
elsif read = '1' then
fifoState <= sRead;
elsif fullCondition = '1' then
fifoState <= sFull;
elsif write = '1' then
fifoState <= sWrite;
else
fifoState <= sWait;
end if;
when sReadWrite =>
if (read = '0') and (write = '0') then
fifoState <= sWait;
elsif (read = '1') and (write = '0') then
fifoState <= sRead;
elsif (write = '1') and (read = '0') then
fifoState <= sWrite;
end if;
when sWait =>
if (read = '1') and (write = '1') then
fifoState <= sReadWrite;
elsif read = '1' then
fifoState <= sRead;
elsif write = '1' then
fifoState <= sWrite;
end if;
when others => null;
end case;
end if;
end process fifoControl;
full <= '1' when
(fifoState = sFull) or
(fullCondition = '1')
else '0';
empty_int <= '1' when
(fifoState = sEmpty) or
(fifoState = sWriteFirst) or
( (emptyCondition = '1') and (fifoState = sRead) )
else '0';
empty <= empty_int;
end RTL;

View File

@ -0,0 +1,63 @@
library Common;
use Common.CommonLib.all;
architecture minimal of FIFO_bram is
subtype register_type is std_ulogic_vector(dataIn'high downto 0);
type memory_type is array (0 to depth-1) of register_type;
signal writeCounter: unsigned(requiredBitNb(depth)-1 downto 0);
signal readCounter: unsigned(writeCounter'range);
signal memoryArray : memory_type;
begin
updateWriteCounter: process(reset, clock)
begin
if reset = '1' then
writeCounter <= (others => '0');
elsif rising_edge(clock) then
if write = '1' then
writeCounter <= writeCounter + 1;
end if;
end if;
end process updateWriteCounter;
updateReadCounter: process(reset, clock)
begin
if reset = '1' then
readCounter <= (others => '0');
elsif rising_edge(clock) then
if read = '1' then
readCounter <= readCounter + 1;
end if;
end if;
end process updateReadCounter;
writeMem: process(clock)
begin
if rising_edge(clock) then
if write = '1' then
memoryArray(to_integer(writeCounter)) <= dataIn;
end if;
end if;
end process writeMem;
dataOut <= memoryArray(to_integer(readCounter));
checkStatus: process(readCounter, writeCounter)
begin
if readCounter = writeCounter then
empty <= '1';
else
empty <= '0';
end if;
if writeCounter+1 = readCounter then
full <= '1';
else
full <= '0';
end if;
end process checkStatus;
end minimal;

View File

@ -0,0 +1,37 @@
architecture oneRegister of FIFO_oneRegister is
signal dataRegister: std_ulogic_vector(dataIn'range);
begin
writeReg: process(reset, clock)
begin
if reset = '1' then
dataRegister <= (others => '0');
elsif rising_edge(clock) then
if write = '1' then
dataRegister <= dataIn;
end if;
end if;
end process writeReg;
dataOut <= dataRegister;
manageFlags: process(reset, clock)
begin
if reset = '1' then
empty <= '1';
full <= '0';
elsif rising_edge(clock) then
if write = '1' then
empty <= '0';
full <= '1';
elsif read = '1' then
empty <= '1';
full <= '0';
end if;
end if;
end process manageFlags;
end oneRegister;

View File

@ -0,0 +1,118 @@
library Common;
use Common.CommonLib.all;
architecture pim of FIFO_bram is
type mem_t is array (depth-1 downto 0) of std_ulogic_vector(dataIn'range);
subtype mem_range_r is natural range requiredBitNb(depth)-1 downto 0;
subtype ptr_range_r is natural range requiredBitNb(depth)+1-1 downto 0;
signal mem : mem_t := (others => (others => '0'));
signal full_int : std_logic;
signal empty_int : std_logic;
signal write_error : std_logic;
signal read_error : std_logic;
signal read_ptr : unsigned(ptr_range_r);
signal read_ptr_next : unsigned(ptr_range_r);
signal write_ptr : unsigned(ptr_range_r);
signal write_ptr_next : unsigned(ptr_range_r);
signal used_int : unsigned(ptr_range_r);
begin
-----------------------------------------------------------------------------
-- Free / used
-----------------------------------------------------------------------------
fifo_count_proc: process(reset, clock)
begin
if reset = '1' then
used_int <= (others => '0');
elsif rising_edge(clock) then
if write = '1' and full_int = '0' then
used_int <= used_int + 1;
end if;
if read = '1' and empty_int = '0' then
used_int <= used_int - 1;
end if;
-- Simultaneous read/write -> no change
-- ignore full_int, since it is valid
if write = '1' and read = '1' and empty_int = '0' then
used_int <= used_int;
end if;
end if;
end process;
-----------------------------------------------------------------------------
-- FIFO status
-----------------------------------------------------------------------------
full_int <= '1' when (write_ptr(write_ptr'left) /= read_ptr(read_ptr'left))
and ((write_ptr(mem_range_r) = read_ptr(mem_range_r)))
else '0';
empty_int <= '1' when (write_ptr = read_ptr) else '0';
full <= full_int;
empty <= empty_int;
write_ptr_next <= write_ptr + 1;
read_ptr_next <= read_ptr + 1;
-----------------------------------------------------------------------------
-- FIFO pointers
-----------------------------------------------------------------------------
fifo_ptr_proc: process(reset, clock)
begin
if reset = '1' then
write_ptr <= (others => '0');
read_ptr <= (others => '0');
write_error <= '0';
read_error <= '0';
elsif rising_edge(clock) then
write_error <= '0';
read_error <= '0';
if write = '1' then
if full_int = '0' or read = '1' then
write_ptr <= write_ptr_next;
else
write_error <= '1';
end if;
end if;
if read = '1' then
if empty_int = '0' then
read_ptr <= read_ptr_next;
else
read_error <= '1';
end if;
end if;
end if;
end process;
-----------------------------------------------------------------------------
-- FIFO RAM
-----------------------------------------------------------------------------
fifo_out_proc : process(clock)
begin
if rising_edge(clock) then
dataOut <= mem(to_integer(read_ptr(mem_range_r)));
end if;
end process;
fifo_in_proc : process(clock)
begin
if rising_edge(clock) then
if write = '1' and full_int = '0' then
mem(to_integer(write_ptr(mem_range_r))) <= dataIn;
end if;
end if;
end process;
end pim;

View File

@ -0,0 +1,97 @@
--
-- VHDL Architecture Memory.fifo_minimal
--
-- Created:
-- by - uadmin.UNKNOWN (WE3877)
-- at - 13:54:33 11.07.2012
--
-- using Mentor Graphics HDL Designer(TM) 2009.2 (Build 10)
--
library Common;
use Common.CommonLib.all;
architecture RTL_minimal of FIFO is
subtype register_type is std_ulogic_vector(dataIn'high downto 0);
type memory_type is array (0 to depth-1) of register_type;
signal writeCounter: unsigned(requiredBitNb(depth)-1 downto 0);
signal readCounter: unsigned(writeCounter'range);
signal memoryArray : memory_type;
begin
updateWriteCounter: process(reset, clock)
begin
if reset = '1' then
writeCounter <= (others => '0');
elsif rising_edge(clock) then
if write = '1' then
writeCounter <= writeCounter + 1;
end if;
end if;
end process updateWriteCounter;
updateReadCounter: process(reset, clock)
begin
if reset = '1' then
readCounter <= (others => '0');
elsif rising_edge(clock) then
if read = '1' then
readCounter <= readCounter + 1;
end if;
end if;
end process updateReadCounter;
writeMem: process(clock)
begin
if rising_edge(clock) then
if write = '1' then
memoryArray(to_integer(writeCounter)) <= dataIn;
end if;
end if;
end process writeMem;
dataOut <= memoryArray(to_integer(readCounter));
-- checkStatus: process(reset, clock)
-- begin
-- if reset = '1' then
-- empty <= '1';
-- full <= '0';
-- elsif rising_edge(clock) then
-- if readCounter+1 = writeCounter then
-- if read = '1' then
-- empty <= '1';
-- end if;
-- elsif writeCounter = readCounter then
-- if write = '1' then
-- empty <= '0';
-- end if;
-- if read = '1' then
-- full <= '0';
-- end if;
-- elsif writeCounter+1 = readCounter then
-- if write = '1' then
-- full <= '1';
-- end if;
-- end if;
-- end if;
-- end process checkStatus;
checkStatus: process(readCounter, writeCounter)
begin
if readCounter = writeCounter then
empty <= '1';
else
empty <= '0';
end if;
if writeCounter+1 = readCounter then
full <= '1';
else
full <= '0';
end if;
end process checkStatus;
END ARCHITECTURE RTL_minimal;

View File

@ -0,0 +1,84 @@
-- ------------------------------------------------------------------------------
-- Copyright 2012 HES-SO Valais Wallis (www.hevs.ch)
-- ------------------------------------------------------------------------------
-- FIFO bridge with bus width adaptation
-- A register that connects two FIFOs.
-- Many IP blocks nowadays have FIFO or FIFO-like interfaces and often they
-- have to be connected. This block can the be used for this task.
--
-- Created on 2012
--
-- Author: Oliver A. Gubler (oliver.gubler@hevs.ch)
--
-- 2016-04-01: fix bug in FWFT read when full
-- 2016-03-22: +add FirstWordFallThrough (FWFT) generic
-- 2012: +intital release
-- ------------------------------------------------------------------------------
--
ARCHITECTURE RTL OF fifoBridgeRxToTx IS
signal read1: std_ulogic;
signal read2: std_ulogic;
signal read: std_ulogic;
signal storedData: std_ulogic_vector(data1'range);
signal write: std_ulogic;
BEGIN
readControl: process(reset, clock)
begin
if reset = '1' then
read1 <= '0';
read2 <= '0';
elsif rising_edge(clock) then
if (empty1 = '0') and (full2 = '0') then
read1 <= '1';
else
read1 <= '0';
end if;
read2 <= read1;
end if;
end process readControl;
read <= not empty1 and not full2 when firstWordFallThrough
else not empty1 and read1;
rd1 <= read;
readData: process(reset, clock)
begin
if reset = '1' then
storedData <= (others => '0');
elsif rising_edge(clock) then
if firstWordFallThrough then
storedData <= data1;
else
if read = '1' then
storedData <= data1;
end if;
end if;
end if;
end process readData;
data2 <= storedData;
writeControl: process(reset, clock)
begin
if reset = '1' then
write <= '0';
elsif rising_edge(clock) then
if firstWordFallThrough then
write <= not empty1 and not full2;
else
if read = '1' then
write <= '1';
else
write <= '0';
end if;
end if;
end if;
end process writeControl;
wr2 <= write;
end RTL;

View File

@ -0,0 +1,140 @@
ARCHITECTURE RTL OF flashController IS
signal addressReg: unsigned(flashAddr'range);
signal dataOutReg: std_ulogic_vector(flashDataOut'range);
signal dataInReg: std_ulogic_vector(flashDataIn'range);
type sequenceStateType is (
idle,
waitForBus1, waitForBus0,
startAccess, waitAcccessEnd
);
signal sequenceState: sequenceStateType;
signal read: std_ulogic;
signal startCounter: std_ulogic;
signal sequenceCounter: unsigned(3 downto 0);
signal endOfCount: std_ulogic;
signal readDataValid: std_ulogic;
signal flashCE: std_ulogic;
BEGIN
------------------------------------------------------------------------------
-- memory reset
memRst_n <= not '0';
------------------------------------------------------------------------------
-- address
storeAddress: process(reset, clock)
begin
if reset = '1' then
addressReg <= (others => '0');
elsif rising_edge(clock) then
if (flashRd = '1') or (flashWr = '1') then
addressReg <= shift_left(flashAddr, 1);
end if;
end if;
end process storeAddress;
memAddress <= std_ulogic_vector(addressReg);
------------------------------------------------------------------------------
-- data out
storeDataOut: process(reset, clock)
begin
if reset = '1' then
dataOutReg <= (others => '0');
elsif rising_edge(clock) then
if flashWr = '1' then
dataOutReg <= flashDataOut;
end if;
end if;
end process storeDataOut;
memDataOut <= flashDataOut;
------------------------------------------------------------------------------
-- data in
readDataValid <= '1' when (read = '1') and (endOfCount = '1') else '0';
storeDataIn: process(reset, clock)
begin
if reset = '1' then
dataInReg <= (others => '0');
elsif rising_edge(clock) then
if readDataValid = '1' then
dataInReg <= memDataIn;
end if;
end if;
end process storeDataIn;
flashDataIn <= dataInReg when readDataValid = '0' else memDataIn;
------------------------------------------------------------------------------
-- read/write sequence
busAccessFsm: process(reset, clock)
begin
if reset = '1' then
read <= '0';
sequenceState <= idle;
elsif rising_edge(clock) then
case sequenceState is
when idle =>
if flashRd = '1' then
read <= '1';
sequenceState <= waitForBus1;
elsif flashWr = '1' then
read <= '0';
sequenceState <= waitForBus1;
end if;
when waitForBus1 =>
if memBusEn_n = '1' then
sequenceState <= waitForBus0;
end if;
when waitForBus0 =>
if memBusEn_n = '0' then
sequenceState <= startAccess;
end if;
when startAccess =>
sequenceState <= waitAcccessEnd;
when waitAcccessEnd =>
if endOfCount = '1' then
sequenceState <= idle;
end if;
end case;
end if;
end process busAccessFsm;
startCounter <= '1' when sequenceState = startAccess else '0';
endOfCount <= '1'
when ( (sequenceCounter = rdWaitState) and (read = '1') ) or
( (sequenceCounter = wrWaitState) and (read = '0') )
else '0';
countSequence: process(reset, clock)
begin
if reset = '1' then
sequenceCounter <= (others => '0');
elsif rising_edge(clock) then
if sequenceCounter = 0 then
if startCounter = '1' then
sequenceCounter <= sequenceCounter + 1;
end if;
else
if endOfCount = '1' then
sequenceCounter <= (others => '0');
else
sequenceCounter <= sequenceCounter + 1;
end if;
end if;
end if;
end process countSequence;
flashCE <= '0' when sequenceCounter = 0 else '1';
flashCE_n <= not flashCE;
memWR_n <= not '1' when (read = '0') and (flashCE = '1') and (endOfCount = '0')
else not '0';
memOE_n <= not '1' when (read = '1') and (flashCE = '1') else not '0';
flashDataValid <= endOfCount;
END ARCHITECTURE RTL;

View File

@ -0,0 +1,36 @@
ARCHITECTURE RTL OF sdramControllerBuildAddress IS
constant addressPrecharge: std_ulogic_vector(memAddress'range)
:= (10=> '1', others => '-');
constant addressModeRegU : unsigned(memAddress'range)
:= resize("0" & "00" & "010" & "0" & "000", memAddress'length);
-- ll,10 = reserved,
-- 9 = '0' programmed burst length => burst length applicable for both rd and wr
-- 8,7 = Op mode = 00 => standard operation (all other states are reserved)
-- 6,5,4 = CAS latency = 010 => cas latency of 2
-- 3 = Burst Type = '0' => Sequential (not interleaved)
-- 2,1,0 = Brust Length = 000 => brust length is 1
constant addressModeReg : std_ulogic_vector(memAddress'range)
:= std_ulogic_vector(addressModeRegU);
BEGIN
buildAddresses: process(ramAddr, addrSelPrecharge, addrSelModeReg, addrSelRow, addrSelCol)
begin
memBankAddress <= std_ulogic_vector(ramAddr(ramAddr'high downto ramAddr'high-memBankAddress'length+1));
if addrSelPrecharge = '1' then
memAddress <= addressPrecharge;
elsif addrSelModeReg = '1' then
memAddress <= addressModeReg;
elsif addrSelRow = '1' then
memAddress <= std_ulogic_vector(ramAddr(rowAddressBitNb+colAddressBitNb-1 downto colAddressBitNb));
elsif addrSelCol = '1' then
memAddress(memAddress'high downto colAddressBitNb) <= (others => '0');
memAddress(10) <= '1';
memAddress(colAddressBitNb-1 downto 0) <= std_ulogic_vector(ramAddr(colAddressBitNb-1 downto 0));
else
memAddress <= (others => '-');
end if;
end process buildAddresses;
END ARCHITECTURE RTL;

View File

@ -0,0 +1,48 @@
ARCHITECTURE RTL OF sdramControllerRefreshCounter IS
signal delayCounter: unsigned(delayCounterBitNb-1 downto 0);
signal endOfDelay: std_ulogic;
BEGIN
countDelay : process(reset, clock)
begin
if reset = '1' then
delayCounter <= (others => '0');
elsif rising_edge(clock) then
if endOfDelay = '1' then
delayCounter <= to_unsigned(1, delayCounter'length);
else
delayCounter <= delayCounter + 1;
end if;
end if;
end process countDelay;
findEndOfDelay: process(powerUpDone, delayCounter)
begin
endOfDelay <= '0';
if powerUpDone = '0' then
if delayCounter+1 = 0 then
endOfDelay <= '1';
end if;
else
if delayCounter+1 >= refreshPeriodNb then
endOfDelay <= '1';
end if;
end if;
end process findEndOfDelay;
endOfRefreshCount <= endOfDelay;
signalRefresh: process(powerUpDone, delayCounter)
begin
selectRefresh <= '0';
if (powerUpDone = '1') and (delayCounter < 1024) then
if (delayCounter <= 16) or (delayCounter(3 downto 0) = 0) then
selectRefresh <= '1';
end if;
end if;
end process signalRefresh;
END ARCHITECTURE RTL;

View File

@ -0,0 +1,18 @@
ARCHITECTURE RTL OF sdramControllerSR IS
BEGIN
setReset: process(reset, clock)
begin
if reset = '1' then
flag <= '0';
elsif rising_edge(clock) then
if setFlag = '1' then
flag <= '1';
elsif resetFlag = '1' then
flag <= '0';
end if;
end if;
end process setReset;
END ARCHITECTURE RTL;

View File

@ -0,0 +1,17 @@
ARCHITECTURE RTL OF sdramControllerSampleDataIn IS
BEGIN
sampleRamData: process(reset, clock)
begin
if reset = '1' then
ramDataIn <= (others => '0');
elsif falling_edge(clock) then
if sampleData = '1' then
ramDataIn <= memDataIn;
end if;
end if;
end process sampleRamData;
END ARCHITECTURE RTL;

View File

@ -0,0 +1,14 @@
ARCHITECTURE RTL OF sdramControllerStoreData IS
BEGIN
storeData : process(reset, clock)
begin
if reset = '1' then
memDataOut <= (others => '0');
elsif rising_edge(clock) then
memDataOut <= ramDataOut;
end if;
end process storeData;
END ARCHITECTURE RTL;

View File

@ -0,0 +1,24 @@
ARCHITECTURE RTL OF sdramControllerTimingsShiftRegister IS
--constant leadingZeroesNb: positive := 2;
--constant leadingZeroes: std_ulogic_vector(1 to leadingZeroesNb) := (others => '0');
--signal shiftReg: std_ulogic_vector(1 to timerDone'high-leadingZeroesNb);
signal shiftReg: std_ulogic_vector(1 to timerDone'high);
BEGIN
shiftToken : process(reset, clock)
begin
if reset = '1' then
shiftReg <= (others => '0');
elsif rising_edge(clock) then
shiftReg(1) <= timerStart;
shiftReg(2 to shiftReg'right) <= shiftReg(1 to shiftReg'right-1);
end if;
end process shiftToken;
--timerDone <= leadingZeroes & shiftReg;
timerDone <= shiftReg;
END ARCHITECTURE RTL;

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_93

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
DIALECT atom VHDL_2008
INCLUDE list {
DEFAULT atom 1
}

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_87

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1 @@
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

View File

@ -0,0 +1,4 @@
INCLUDE list {
DEFAULT atom 1
}
DIALECT atom VHDL_2008

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom bram_bhv.vhd
DEFAULT_ARCHITECTURE atom bhv
TOP_MARKER atom 1

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom bramDualportWritefirst_bhv.vhd
DEFAULT_ARCHITECTURE atom bhv
TOP_MARKER atom 1

View File

@ -0,0 +1,3 @@
TOP_MARKER atom 1
DEFAULT_ARCHITECTURE atom struct
DEFAULT_FILE atom @f@i@f@o/struct.bd

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom fifo_bram_rtl.vhd
DEFAULT_ARCHITECTURE atom RTL
TOP_MARKER atom 0

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom fifo_oneRegister_rtl.vhd
DEFAULT_ARCHITECTURE atom oneRegister
TOP_MARKER atom 0

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom fifo@bridge/struct.bd
DEFAULT_ARCHITECTURE atom struct
TOP_MARKER atom 1

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom fifo@bridge@bus@width@adaption/struct.bd
DEFAULT_ARCHITECTURE atom struct
TOP_MARKER atom 1

View File

@ -0,0 +1,2 @@
DEFAULT_FILE atom fifobridgerxtotx_rtl.vhd
DEFAULT_ARCHITECTURE atom RTL

View File

@ -0,0 +1,2 @@
DEFAULT_FILE atom fifoBridgeRxToTxBuswidthAdaptionRxbigger_behavioral.vhd
DEFAULT_ARCHITECTURE atom behavioral

View File

@ -0,0 +1,2 @@
DEFAULT_FILE atom fifoBridgeRxToTxBuswidthAdaptionTxbigger_behavioral.vhd
DEFAULT_ARCHITECTURE atom behavioral

View File

@ -0,0 +1,3 @@
TOP_MARKER atom 1
DEFAULT_ARCHITECTURE atom RTL
DEFAULT_FILE atom flashController_RTL.vhd

View File

@ -0,0 +1,3 @@
DEFAULT_FILE atom sdram@controller/struct.bd
DEFAULT_ARCHITECTURE atom struct
TOP_MARKER atom 1

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom RTL
DEFAULT_FILE atom sdramControllerBuildAddress_RTL.vhd

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom fsm
DEFAULT_FILE atom sdram@controller@fsm/fsm.sm

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom RTL
DEFAULT_FILE atom sdramControllerRefreshCounter_RTL.vhd

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom RTL
DEFAULT_FILE atom sdramControllerSampleDataIn_RTL.vhd

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom RTL
DEFAULT_FILE atom sdramControllerSR_RTL.vhd

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom RTL
DEFAULT_FILE atom sdramControllerStoreData_RTL.vhd

View File

@ -0,0 +1,2 @@
DEFAULT_ARCHITECTURE atom RTL
DEFAULT_FILE atom sdramControllerTimingsShiftRegister_RTL.vhd

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff