6032 lines
204 KiB
VHDL
6032 lines
204 KiB
VHDL
-- VHDL Entity Board.SoC_ebs3.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 10:21:25 08.05.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY SoC_ebs3 IS
|
|
PORT(
|
|
RxD : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset_N : IN std_ulogic;
|
|
selSinCos_n : IN std_ulogic;
|
|
LED1 : OUT std_ulogic;
|
|
LED2 : OUT std_ulogic;
|
|
TxD : OUT std_ulogic;
|
|
spare : OUT std_ulogic_vector (1 TO 17);
|
|
xOut : OUT std_ulogic;
|
|
yOut : OUT std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END SoC_ebs3 ;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity Board.DFF.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 13:07:05 02/19/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
|
|
ENTITY DFF IS
|
|
PORT(
|
|
CLK : IN std_uLogic;
|
|
CLR : IN std_uLogic;
|
|
D : IN std_uLogic;
|
|
Q : OUT std_uLogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END DFF ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE sim OF DFF IS
|
|
BEGIN
|
|
|
|
process(clk, clr)
|
|
begin
|
|
if clr = '1' then
|
|
q <= '0';
|
|
elsif rising_edge(clk) then
|
|
q <= d;
|
|
end if;
|
|
end process;
|
|
|
|
END ARCHITECTURE sim;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity Board.inverterIn.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 13:07:14 02/19/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
|
|
ENTITY inverterIn IS
|
|
PORT(
|
|
in1 : IN std_uLogic;
|
|
out1 : OUT std_uLogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END inverterIn ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE sim OF inverterIn IS
|
|
BEGIN
|
|
|
|
out1 <= NOT in1;
|
|
|
|
END ARCHITECTURE sim;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL netlist generated by SCUBA Diamond (64-bit) 3.12.1.454
|
|
-- Module Version: 5.7
|
|
--C:\lscc\diamond\3.12\ispfpga\bin\nt64\scuba.exe -w -n pll -lang vhdl -synth synplify -bus_exp 7 -bb -arch sa5p00 -type pll -fin 100.00 -fclkop 60 -fclkop_tol 10.0 -fclkos 75 -fclkos_tol 10.0 -phases 0 -fclkos2 50 -fclkos2_tol 10.0 -phases2 0 -fclkos3 10 -fclkos3_tol 10.0 -phases3 0 -phase_cntl STATIC -enable_s -enable_s2 -enable_s3 -pllLocked -fb_mode 1 -fdc C:/temp/clocker/pll/pll.fdc
|
|
|
|
-- Offers 10MHz, 50MHz, 60MHz and 75MHz clocks
|
|
|
|
library IEEE;
|
|
use IEEE.std_logic_1164.all;
|
|
library ECP5U;
|
|
use ECP5U.components.all;
|
|
|
|
ENTITY pll IS
|
|
PORT(
|
|
clkIn100M : IN std_ulogic;
|
|
en75M : IN std_ulogic;
|
|
en50M : IN std_ulogic;
|
|
en10M : IN std_ulogic;
|
|
clk60MHz : OUT std_ulogic;
|
|
clk75MHz : OUT std_ulogic;
|
|
clk50MHz : OUT std_ulogic;
|
|
clk10MHz : OUT std_ulogic;
|
|
pllLocked : OUT std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END pll ;
|
|
|
|
architecture rtl of pll is
|
|
|
|
-- internal signal declarations
|
|
signal REFCLK: std_logic;
|
|
signal CLKOS3_t: std_logic;
|
|
signal CLKOS2_t: std_logic;
|
|
signal CLKOS_t: std_logic;
|
|
signal CLKOP_t: std_logic;
|
|
signal scuba_vhi: std_logic;
|
|
signal scuba_vlo: std_logic;
|
|
|
|
attribute FREQUENCY_PIN_CLKOS3 : string;
|
|
attribute FREQUENCY_PIN_CLKOS2 : string;
|
|
attribute FREQUENCY_PIN_CLKOS : string;
|
|
attribute FREQUENCY_PIN_CLKOP : string;
|
|
attribute FREQUENCY_PIN_CLKI : string;
|
|
attribute ICP_CURRENT : string;
|
|
attribute LPF_RESISTOR : string;
|
|
attribute FREQUENCY_PIN_CLKOS3 of PLLInst_0 : label is "10.000000";
|
|
attribute FREQUENCY_PIN_CLKOS2 of PLLInst_0 : label is "50.000000";
|
|
attribute FREQUENCY_PIN_CLKOS of PLLInst_0 : label is "75.000000";
|
|
attribute FREQUENCY_PIN_CLKOP of PLLInst_0 : label is "60.000000";
|
|
attribute FREQUENCY_PIN_CLKI of PLLInst_0 : label is "100.000000";
|
|
attribute ICP_CURRENT of PLLInst_0 : label is "5";
|
|
attribute LPF_RESISTOR of PLLInst_0 : label is "16";
|
|
attribute syn_keep : boolean;
|
|
attribute NGD_DRC_MASK : integer;
|
|
attribute NGD_DRC_MASK of rtl : architecture is 1;
|
|
|
|
begin
|
|
-- component instantiation statements
|
|
scuba_vhi_inst: VHI
|
|
port map (Z=>scuba_vhi);
|
|
|
|
scuba_vlo_inst: VLO
|
|
port map (Z=>scuba_vlo);
|
|
|
|
PLLInst_0: EHXPLLL
|
|
generic map (PLLRST_ENA=> "DISABLED", INTFB_WAKE=> "DISABLED",
|
|
STDBY_ENABLE=> "DISABLED", DPHASE_SOURCE=> "DISABLED",
|
|
CLKOS3_FPHASE=> 0, CLKOS3_CPHASE=> 59, CLKOS2_FPHASE=> 0,
|
|
CLKOS2_CPHASE=> 11, CLKOS_FPHASE=> 0, CLKOS_CPHASE=> 7,
|
|
CLKOP_FPHASE=> 0, CLKOP_CPHASE=> 9, PLL_LOCK_MODE=> 0,
|
|
CLKOS_TRIM_DELAY=> 0, CLKOS_TRIM_POL=> "FALLING",
|
|
CLKOP_TRIM_DELAY=> 0, CLKOP_TRIM_POL=> "FALLING",
|
|
OUTDIVIDER_MUXD=> "DIVD", CLKOS3_ENABLE=> "DISABLED",
|
|
OUTDIVIDER_MUXC=> "DIVC", CLKOS2_ENABLE=> "DISABLED",
|
|
OUTDIVIDER_MUXB=> "DIVB", CLKOS_ENABLE=> "DISABLED",
|
|
OUTDIVIDER_MUXA=> "DIVA", CLKOP_ENABLE=> "ENABLED", CLKOS3_DIV=> 60,
|
|
CLKOS2_DIV=> 12, CLKOS_DIV=> 8, CLKOP_DIV=> 10, CLKFB_DIV=> 3,
|
|
CLKI_DIV=> 5, FEEDBK_PATH=> "CLKOP")
|
|
port map (CLKI=>clkIn100M, CLKFB=>CLKOP_t, PHASESEL1=>scuba_vlo,
|
|
PHASESEL0=>scuba_vlo, PHASEDIR=>scuba_vlo,
|
|
PHASESTEP=>scuba_vlo, PHASELOADREG=>scuba_vlo,
|
|
STDBY=>scuba_vlo, PLLWAKESYNC=>scuba_vlo, RST=>scuba_vlo,
|
|
ENCLKOP=>scuba_vlo, ENCLKOS=>en75M, ENCLKOS2=>en50M,
|
|
ENCLKOS3=>en10M, CLKOP=>CLKOP_t, CLKOS=>CLKOS_t,
|
|
CLKOS2=>CLKOS2_t, CLKOS3=>CLKOS3_t, LOCK=>pllLocked,
|
|
INTLOCK=>open, REFCLK=>REFCLK, CLKINTFB=>open);
|
|
|
|
clk10MHz <= CLKOS3_t;
|
|
clk50MHz <= CLKOS2_t;
|
|
clk75MHz <= CLKOS_t;
|
|
clk60MHz <= CLKOP_t;
|
|
end rtl;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.beamerSoc.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY beamerSoc IS
|
|
GENERIC(
|
|
ioNb : positive := 8;
|
|
testOutBitNb : positive := 16;
|
|
patternAddressBitNb : positive := 9
|
|
);
|
|
PORT(
|
|
TxD : OUT std_ulogic;
|
|
RxD : IN std_ulogic;
|
|
outX : OUT std_ulogic;
|
|
outY : OUT std_ulogic;
|
|
selSinCos : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
ioEn : OUT std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
ioOut : OUT std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
ioIn : IN std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
testOut : OUT std_ulogic_vector (1 TO testOutBitNb)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END beamerSoc ;
|
|
|
|
|
|
|
|
|
|
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
|
|
PACKAGE ahbLite IS
|
|
------------------------------------------------------------------------------
|
|
-- bus components sizes
|
|
constant ahbAddressBitNb : positive := 16;
|
|
constant ahbDataBitNb : positive := 16;
|
|
constant ahbSlaveNb : positive := 16;
|
|
|
|
constant ahbTransBitNb : positive := 2;
|
|
constant ahbSizeBitNb : positive := 1;
|
|
constant ahbBurstBitNb : positive := 3;
|
|
constant ahbProtBitNb : positive := 4;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- bus data vector type
|
|
subtype ahbDataType is std_logic_vector(ahbDataBitNb-1 downto 0);
|
|
type ahbDataVector is array(1 to ahbSlaveNb) of ahbDataType;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- address decoder
|
|
type ahbMemoryLocationType is
|
|
record
|
|
baseAddress: natural;
|
|
addressMask: natural;
|
|
end record;
|
|
type ahbMemoryLocationVector is array(1 to ahbSlaveNb) of ahbMemoryLocationType;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- bus signals
|
|
subtype transferType is std_ulogic_vector(ahbTransBitNb-1 downto 0);
|
|
constant transIdle : transferType := "00";
|
|
constant transBusy : transferType := "01";
|
|
constant transNonSeq: transferType := "10";
|
|
constant transSeq : transferType := "11";
|
|
|
|
subtype transferSizeType is std_ulogic_vector(ahbSizeBitNb-1 downto 0);
|
|
constant size8 : transferSizeType := "0";
|
|
constant size16 : transferSizeType := "1";
|
|
|
|
subtype burstType is std_ulogic_vector(ahbBurstBitNb-1 downto 0);
|
|
constant burstSingle : burstType := "000";
|
|
constant burstIncr : burstType := "001";
|
|
constant burstWrap4 : burstType := "010";
|
|
constant burstIncr4 : burstType := "011";
|
|
constant burstWrap8 : burstType := "100";
|
|
constant burstIncr8 : burstType := "101";
|
|
constant burstWrap16 : burstType := "110";
|
|
constant burstIncr16 : burstType := "111";
|
|
|
|
subtype protectionType is std_ulogic_vector(ahbProtBitNb-1 downto 0);
|
|
constant protDefault : protectionType := "0011";
|
|
|
|
------------------------------------------------------------------------------
|
|
-- log2
|
|
function addressBitNb (addressNb : natural) return natural;
|
|
|
|
END ahbLite;
|
|
|
|
|
|
|
|
|
|
PACKAGE BODY ahbLite IS
|
|
|
|
function addressBitNb (addressNb : natural) return natural is
|
|
variable powerOfTwo, bitNb : natural;
|
|
begin
|
|
powerOfTwo := 1;
|
|
bitNb := 0;
|
|
while powerOfTwo <= addressNb loop
|
|
powerOfTwo := 2 * powerOfTwo;
|
|
bitNb := bitNb + 1;
|
|
end loop;
|
|
return bitNb;
|
|
end addressBitNb;
|
|
|
|
END ahbLite;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.ahbBeamer.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:22 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ENTITY ahbBeamer IS
|
|
GENERIC(
|
|
patternAddressBitNb : positive := 9;
|
|
testOutBitNb : positive := 16
|
|
);
|
|
PORT(
|
|
outX : OUT std_ulogic;
|
|
hAddr : IN unsigned (ahbAddressBitNb-1 DOWNTO 0);
|
|
outY : OUT std_ulogic;
|
|
hWData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
selSinCos : IN std_ulogic;
|
|
testOut : OUT std_ulogic_vector (1 TO testOutBitNb);
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hTrans : IN std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWrite : IN std_ulogic;
|
|
hSel : IN std_ulogic;
|
|
hReady : OUT std_ulogic;
|
|
hResp : OUT std_ulogic;
|
|
hClk : IN std_ulogic;
|
|
hReset_n : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbBeamer ;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.ahbBeamerOperator.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:21 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY ahbBeamerOperator IS
|
|
GENERIC(
|
|
updatePeriodBitNb : positive := 16;
|
|
signalBitNb : positive := 16
|
|
);
|
|
PORT(
|
|
outX : OUT std_ulogic;
|
|
run : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
outY : OUT std_ulogic;
|
|
selSinCos : IN std_ulogic;
|
|
interpolateLin : IN std_ulogic;
|
|
updatePeriod : IN unsigned (updatePeriodBitNb-1 DOWNTO 0);
|
|
memX : IN std_ulogic_vector (signalBitNb-1 DOWNTO 0);
|
|
memY : IN std_ulogic_vector (signalBitNb-1 DOWNTO 0);
|
|
newPolynom : OUT std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbBeamerOperator ;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SplineInterpolator.interpolatorCoefficients.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 13:00:20 02/19/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY interpolatorCoefficients IS
|
|
GENERIC(
|
|
bitNb : positive := 16;
|
|
coeffBitNb : positive := 16
|
|
);
|
|
PORT(
|
|
sample1 : IN signed (bitNb-1 DOWNTO 0);
|
|
sample2 : IN signed (bitNb-1 DOWNTO 0);
|
|
sample3 : IN signed (bitNb-1 DOWNTO 0);
|
|
sample4 : IN signed (bitNb-1 DOWNTO 0);
|
|
a : OUT signed (coeffBitNb-1 DOWNTO 0);
|
|
b : OUT signed (coeffBitNb-1 DOWNTO 0);
|
|
c : OUT signed (coeffBitNb-1 DOWNTO 0);
|
|
d : OUT signed (coeffBitNb-1 DOWNTO 0);
|
|
interpolateLinear : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END interpolatorCoefficients ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF interpolatorCoefficients IS
|
|
BEGIN
|
|
|
|
calcCoeffs: process(interpolateLinear, sample1, sample2, sample3, sample4)
|
|
begin
|
|
if interpolateLinear = '1' then
|
|
a <= (others => '0');
|
|
b <= (others => '0');
|
|
c <= resize(2*sample3, c'length)
|
|
- resize(2*sample2, c'length);
|
|
d <= resize( sample2, d'length);
|
|
else
|
|
a <= resize( sample4, a'length)
|
|
- resize(3*sample3, a'length)
|
|
+ resize(3*sample2, a'length)
|
|
- resize( sample1, a'length);
|
|
b <= resize(2*sample1, b'length)
|
|
- resize(5*sample2, b'length)
|
|
+ resize(4*sample3, b'length)
|
|
- resize( sample4, b'length);
|
|
c <= resize( sample3, c'length)
|
|
- resize( sample1, c'length);
|
|
d <= resize( sample2, d'length);
|
|
end if;
|
|
end process calcCoeffs;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity DigitalToAnalogConverter.DAC.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 13:06:08 02/19/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY DAC IS
|
|
GENERIC(
|
|
signalBitNb : positive := 16
|
|
);
|
|
PORT(
|
|
serialOut : OUT std_ulogic;
|
|
parallelIn : IN unsigned (signalBitNb-1 DOWNTO 0);
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END DAC ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF DAC IS
|
|
|
|
signal parallelIn1: unsigned(parallelIn'range);
|
|
signal integrator: unsigned(parallelIn'high+1 downto 0);
|
|
signal quantized: std_ulogic;
|
|
|
|
BEGIN
|
|
|
|
-- parallelIn1 <= parallelIn;
|
|
parallelIn1 <= parallelIn/2 + 2**(parallelIn'length-2);
|
|
|
|
integrate: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
integrator <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if quantized = '0' then
|
|
integrator <= integrator + parallelIn1;
|
|
else
|
|
integrator <= integrator + parallelIn1 - 2**parallelIn'length;
|
|
end if;
|
|
end if;
|
|
end process integrate;
|
|
|
|
quantized <= integrator(integrator'high);
|
|
|
|
serialOut <= quantized;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SplineInterpolator.offsetToUnsigned.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 13:00:32 02/19/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY offsetToUnsigned IS
|
|
GENERIC(
|
|
bitNb : positive := 16
|
|
);
|
|
PORT(
|
|
unsignedOut : OUT unsigned (bitNb-1 DOWNTO 0);
|
|
signedIn : IN signed (bitNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END offsetToUnsigned ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF offsetToUnsigned IS
|
|
|
|
BEGIN
|
|
|
|
unsignedOut <= not(signedIn(signedIn'high)) & unsigned(signedIn(signedIn'high-1 downto 0));
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity WaveformGenerator.sawtoothGen.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 08:02:49 03/11/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY sawtoothGen IS
|
|
GENERIC(
|
|
bitNb : positive := 16
|
|
);
|
|
PORT(
|
|
sawtooth : OUT unsigned (bitNb-1 DOWNTO 0);
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
step : IN unsigned (bitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END sawtoothGen ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF sawtoothGen IS
|
|
|
|
signal counter: unsigned(sawtooth'range);
|
|
|
|
begin
|
|
|
|
count: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
counter <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if en = '1' then
|
|
counter <= counter + step;
|
|
end if;
|
|
end if;
|
|
end process count;
|
|
|
|
sawtooth <= counter;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SplineInterpolator.interpolatorCalculatePolynom.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 13:00:14 02/19/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY interpolatorCalculatePolynom IS
|
|
GENERIC(
|
|
signalBitNb : positive := 16;
|
|
coeffBitNb : positive := 16;
|
|
oversamplingBitNb : positive := 8
|
|
);
|
|
PORT(
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
restartPolynom : IN std_ulogic;
|
|
d : IN signed (coeffBitNb-1 DOWNTO 0);
|
|
sampleOut : OUT signed (signalBitNb-1 DOWNTO 0);
|
|
c : IN signed (coeffBitNb-1 DOWNTO 0);
|
|
b : IN signed (coeffBitNb-1 DOWNTO 0);
|
|
a : IN signed (coeffBitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END interpolatorCalculatePolynom ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF interpolatorCalculatePolynom IS
|
|
|
|
constant additionalBitNb: positive := 1;
|
|
constant internalsBitNb: positive := signalBitNb + 3*oversamplingBitNb + 1
|
|
+ additionalBitNb;
|
|
signal x: signed(internalsBitNb-1 downto 0);
|
|
signal u: signed(internalsBitNb-1 downto 0);
|
|
signal v: signed(internalsBitNb-1 downto 0);
|
|
signal w: signed(internalsBitNb-1 downto 0);
|
|
|
|
BEGIN
|
|
|
|
iterativePolynom: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
x <= (others => '0');
|
|
u <= (others => '0');
|
|
v <= (others => '0');
|
|
w <= (others => '0');
|
|
sampleOut <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if en = '1' then
|
|
if restartPolynom = '1' then
|
|
x <= shift_left(resize(2*d, x'length), 3*oversamplingBitNb);
|
|
u <= resize(a, u'length)
|
|
+ shift_left(resize(b, u'length), oversamplingBitNb)
|
|
+ shift_left(resize(c, u'length), 2*oversamplingBitNb);
|
|
v <= resize(6*a, v'length)
|
|
+ shift_left(resize(2*b, v'length), oversamplingBitNb);
|
|
w <= resize(6*a, w'length);
|
|
sampleOut <= resize(d, sampleOut'length);
|
|
else
|
|
x <= x + u;
|
|
u <= u + v;
|
|
v <= v + w;
|
|
sampleOut <= resize(
|
|
shift_right(x, 3*oversamplingBitNb+1), sampleOut'length
|
|
);
|
|
-- limit overflow
|
|
if x(x'high downto x'high-additionalBitNb) = "01" then
|
|
sampleOut <= not shift_left(
|
|
resize("10", sampleOut'length), sampleOut'length-2
|
|
);
|
|
end if;
|
|
-- limit underflow
|
|
if x(x'high downto x'high-additionalBitNb) = "10" then
|
|
sampleOut <= shift_left(
|
|
resize("10", sampleOut'length), sampleOut'length-2
|
|
);
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process iterativePolynom;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.sinCosTable.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY sinCosTable IS
|
|
GENERIC(
|
|
inputBitNb : positive := 16;
|
|
outputBitNb : positive := 16;
|
|
tableAddressBitNb : positive := 3
|
|
);
|
|
PORT(
|
|
sine : OUT signed (outputBitNb-1 DOWNTO 0);
|
|
phase : IN unsigned (inputBitNb-1 DOWNTO 0);
|
|
cosine : OUT signed (outputBitNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END sinCosTable ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF sinCosTable IS
|
|
|
|
signal changeSignSine : std_uLogic;
|
|
signal changeSignCosine : std_uLogic;
|
|
signal flipPhase : std_uLogic;
|
|
signal phaseTableAddress1 : unsigned(tableAddressBitNb-1 downto 0);
|
|
signal phaseTableAddress2 : unsigned(phaseTableAddress1'range);
|
|
signal quarterSine : signed(sine'range);
|
|
signal quarterCosine : signed(cosine'range);
|
|
|
|
BEGIN
|
|
|
|
changeSignSine <= phase(phase'high);
|
|
changeSignCosine <= phase(phase'high) xor phase(phase'high-1);
|
|
flipPhase <= phase(phase'high-1);
|
|
|
|
phaseTableAddress1 <= phase(phase'high-2 downto phase'high-2-tableAddressBitNb+1);
|
|
|
|
checkPhase: process(flipPhase, phaseTableAddress1)
|
|
begin
|
|
if flipPhase = '0' then
|
|
phaseTableAddress2 <= phaseTableAddress1;
|
|
else
|
|
phaseTableAddress2 <= 0 - phaseTableAddress1;
|
|
end if;
|
|
end process checkPhase;
|
|
|
|
|
|
quarterTableSine: process(phaseTableAddress2, flipPhase)
|
|
begin
|
|
case to_integer(phaseTableAddress2) is
|
|
when 0 => if flipPhase = '0' then
|
|
quarterSine <= to_signed(16#0000#, quarterSine'length);
|
|
else
|
|
quarterSine <= to_signed(16#7FFF#, quarterSine'length);
|
|
end if;
|
|
when 1 => quarterSine <= to_signed(16#18F9#, quarterSine'length);
|
|
when 2 => quarterSine <= to_signed(16#30FB#, quarterSine'length);
|
|
when 3 => quarterSine <= to_signed(16#471C#, quarterSine'length);
|
|
when 4 => quarterSine <= to_signed(16#5A82#, quarterSine'length);
|
|
when 5 => quarterSine <= to_signed(16#6A6D#, quarterSine'length);
|
|
when 6 => quarterSine <= to_signed(16#7641#, quarterSine'length);
|
|
when 7 => quarterSine <= to_signed(16#7D89#, quarterSine'length);
|
|
when others => quarterSine <= (others => '-');
|
|
end case;
|
|
end process quarterTableSine;
|
|
|
|
|
|
quarterTableCosine: process(phaseTableAddress2, flipPhase)
|
|
begin
|
|
case to_integer(phaseTableAddress2) is
|
|
when 0 => if flipPhase = '1' then
|
|
quarterCosine <= to_signed(16#0000#, quarterSine'length);
|
|
else
|
|
quarterCosine <= to_signed(16#7FFF#, quarterSine'length);
|
|
end if;
|
|
when 7 => quarterCosine <= to_signed(16#18F9#, quarterSine'length);
|
|
when 6 => quarterCosine <= to_signed(16#30FB#, quarterSine'length);
|
|
when 5 => quarterCosine <= to_signed(16#471C#, quarterSine'length);
|
|
when 4 => quarterCosine <= to_signed(16#5A82#, quarterSine'length);
|
|
when 3 => quarterCosine <= to_signed(16#6A6D#, quarterSine'length);
|
|
when 2 => quarterCosine <= to_signed(16#7641#, quarterSine'length);
|
|
when 1 => quarterCosine <= to_signed(16#7D89#, quarterSine'length);
|
|
when others => quarterCosine <= (others => '-');
|
|
end case;
|
|
end process quarterTableCosine;
|
|
|
|
|
|
checkSignSine: process(changeSignSine, quarterSine)
|
|
begin
|
|
if changeSignSine = '0' then
|
|
sine <= quarterSine;
|
|
else
|
|
sine <= 0 - quarterSine;
|
|
end if;
|
|
end process checkSignSine;
|
|
|
|
|
|
checkSignCosine: process(changeSignCosine, quarterCosine)
|
|
begin
|
|
if changeSignCosine = '0' then
|
|
cosine <= quarterCosine;
|
|
else
|
|
cosine <= 0 - quarterCosine;
|
|
end if;
|
|
end process checkSignCosine;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.periphSpeedController.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY periphSpeedController IS
|
|
GENERIC(
|
|
updatePeriodBitNb : positive := 16
|
|
);
|
|
PORT(
|
|
enableOut : OUT std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
updatePeriod : IN unsigned (updatePeriodBitNb-1 DOWNTO 0);
|
|
enableIn : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END periphSpeedController ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF periphSpeedController IS
|
|
|
|
signal enableCounter: unsigned(updatePeriod'range);
|
|
signal endOfCount: std_uLogic;
|
|
|
|
BEGIN
|
|
|
|
count: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
enableCounter <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if (endOfCount = '0') and (enableIn = '1') then
|
|
enableCounter <= enableCounter - 1;
|
|
else
|
|
enableCounter <= updatePeriod;
|
|
end if;
|
|
end if;
|
|
end process count;
|
|
|
|
testEndOfCount: process(enableCounter)
|
|
begin
|
|
if enableCounter = 0 then
|
|
endOfCount <= '1';
|
|
else
|
|
endOfCount <= '0';
|
|
end if;
|
|
end process testEndOfCount;
|
|
|
|
enableOut <= endOfCount and enableIn;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SplineInterpolator.interpolatorShiftRegister.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 13:00:24 02/19/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY interpolatorShiftRegister IS
|
|
GENERIC(
|
|
signalBitNb : positive := 16
|
|
);
|
|
PORT(
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
shiftSamples : IN std_ulogic;
|
|
sampleIn : IN signed (signalBitNb-1 DOWNTO 0);
|
|
sample1 : OUT signed (signalBitNb-1 DOWNTO 0);
|
|
sample2 : OUT signed (signalBitNb-1 DOWNTO 0);
|
|
sample3 : OUT signed (signalBitNb-1 DOWNTO 0);
|
|
sample4 : OUT signed (signalBitNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END interpolatorShiftRegister ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF interpolatorShiftRegister IS
|
|
|
|
-- signal sample4_int: signed(sampleIn'range);
|
|
-- signal sample3_int: signed(sampleIn'range);
|
|
-- signal sample2_int: signed(sampleIn'range);
|
|
-- signal sample1_int: signed(sampleIn'range);
|
|
|
|
type samplesArray is array(3 downto 0) of signed(sampleIn'range);
|
|
signal samples: samplesArray;
|
|
|
|
begin
|
|
|
|
shiftThem: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
samples <= (others=>(others=>'0'));
|
|
-- sample1_int <= (others => '0');
|
|
-- sample2_int <= (others => '0');
|
|
-- sample3_int <= (others => '0');
|
|
-- sample4_int <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if shiftSamples = '1' then
|
|
-- sample1_int <= sample2_int;
|
|
-- sample2_int <= sample3_int;
|
|
-- sample3_int <= sample4_int;
|
|
-- sample4_int <= sampleIn;
|
|
samples(0) <= samples(1);
|
|
samples(1) <= samples(2);
|
|
samples(2) <= samples(3);
|
|
samples(3) <= sampleIn;
|
|
end if;
|
|
end if;
|
|
end process shiftThem;
|
|
|
|
sample4 <= samples(3);
|
|
sample3 <= samples(2);
|
|
sample2 <= samples(1);
|
|
sample1 <= samples(0);
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SplineInterpolator.interpolatorTrigger.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 13:00:28 02/19/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY interpolatorTrigger IS
|
|
GENERIC(
|
|
counterBitNb : positive := 4
|
|
);
|
|
PORT(
|
|
triggerOut : OUT std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
en : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END interpolatorTrigger ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF interpolatorTrigger IS
|
|
|
|
signal triggerCounter: unsigned(counterBitNb-1 downto 0);
|
|
|
|
BEGIN
|
|
|
|
count: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
triggerCounter <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if en = '1' then
|
|
triggerCounter <= triggerCounter + 1;
|
|
end if;
|
|
end if;
|
|
end process count;
|
|
|
|
trig: process(triggerCounter, en)
|
|
begin
|
|
if triggerCounter = 0 then
|
|
triggerOut <= en;
|
|
else
|
|
triggerOut <= '0';
|
|
end if;
|
|
end process trig;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
--
|
|
-- VHDL Architecture SystemOnChip.ahbBeamerOperator.struct
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 15:01:08 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.ALL;
|
|
|
|
-- LIBRARY DigitalToAnalogConverter;
|
|
-- LIBRARY SplineInterpolator;
|
|
-- LIBRARY SystemOnChip;
|
|
-- LIBRARY WaveformGenerator;
|
|
|
|
ARCHITECTURE struct OF ahbBeamerOperator IS
|
|
|
|
-- Architecture declarations
|
|
constant coeffBitNb : positive := signalBitNb+3+1;
|
|
constant sampleCountBitNb : positive := 8;
|
|
constant patternAddressBitNb : positive := 8;
|
|
-- sinewave generator
|
|
constant tableAddressBitNb : positive := 3;
|
|
constant phaseBitNb : positive := sampleCountBitNb + tableAddressBitNb + 2;
|
|
|
|
-- Internal signal declarations
|
|
SIGNAL aX : signed(coeffBitNb-1 DOWNTO 0);
|
|
SIGNAL aY : signed(coeffBitNb-1 DOWNTO 0);
|
|
SIGNAL bX : signed(coeffBitNb-1 DOWNTO 0);
|
|
SIGNAL bY : signed(coeffBitNb-1 DOWNTO 0);
|
|
SIGNAL cX : signed(coeffBitNb-1 DOWNTO 0);
|
|
SIGNAL cY : signed(coeffBitNb-1 DOWNTO 0);
|
|
SIGNAL cosine : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL dX : signed(coeffBitNb-1 DOWNTO 0);
|
|
SIGNAL dY : signed(coeffBitNb-1 DOWNTO 0);
|
|
SIGNAL interpolateLinear : std_ulogic;
|
|
SIGNAL interpolationEn : std_ulogic;
|
|
SIGNAL interpolationEnable : std_ulogic;
|
|
SIGNAL phase : unsigned(phaseBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleX : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleX1 : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleX2 : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleX3 : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleX4 : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleY : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleY1 : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleY2 : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleY3 : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sampleY4 : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL samplesX : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL samplesY : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL sine : signed(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL step : unsigned(phaseBitNb-1 DOWNTO 0);
|
|
SIGNAL unsignedX : unsigned(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL unsignedY : unsigned(signalBitNb-1 DOWNTO 0);
|
|
|
|
-- Implicit buffer signal declarations
|
|
SIGNAL newPolynom_internal : std_ulogic;
|
|
|
|
|
|
-- Component Declarations
|
|
COMPONENT DAC
|
|
GENERIC (
|
|
signalBitNb : positive := 16
|
|
);
|
|
PORT (
|
|
serialOut : OUT std_ulogic ;
|
|
parallelIn : IN unsigned (signalBitNb-1 DOWNTO 0);
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT interpolatorCalculatePolynom
|
|
GENERIC (
|
|
signalBitNb : positive := 16;
|
|
coeffBitNb : positive := 16;
|
|
oversamplingBitNb : positive := 8
|
|
);
|
|
PORT (
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
restartPolynom : IN std_ulogic ;
|
|
d : IN signed (coeffBitNb-1 DOWNTO 0);
|
|
sampleOut : OUT signed (signalBitNb-1 DOWNTO 0);
|
|
c : IN signed (coeffBitNb-1 DOWNTO 0);
|
|
b : IN signed (coeffBitNb-1 DOWNTO 0);
|
|
a : IN signed (coeffBitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT interpolatorCoefficients
|
|
GENERIC (
|
|
bitNb : positive := 16;
|
|
coeffBitNb : positive := 16
|
|
);
|
|
PORT (
|
|
sample1 : IN signed (bitNb-1 DOWNTO 0);
|
|
sample2 : IN signed (bitNb-1 DOWNTO 0);
|
|
sample3 : IN signed (bitNb-1 DOWNTO 0);
|
|
sample4 : IN signed (bitNb-1 DOWNTO 0);
|
|
a : OUT signed (coeffBitNb-1 DOWNTO 0);
|
|
b : OUT signed (coeffBitNb-1 DOWNTO 0);
|
|
c : OUT signed (coeffBitNb-1 DOWNTO 0);
|
|
d : OUT signed (coeffBitNb-1 DOWNTO 0);
|
|
interpolateLinear : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT interpolatorShiftRegister
|
|
GENERIC (
|
|
signalBitNb : positive := 16
|
|
);
|
|
PORT (
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
shiftSamples : IN std_ulogic ;
|
|
sampleIn : IN signed (signalBitNb-1 DOWNTO 0);
|
|
sample1 : OUT signed (signalBitNb-1 DOWNTO 0);
|
|
sample2 : OUT signed (signalBitNb-1 DOWNTO 0);
|
|
sample3 : OUT signed (signalBitNb-1 DOWNTO 0);
|
|
sample4 : OUT signed (signalBitNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT interpolatorTrigger
|
|
GENERIC (
|
|
counterBitNb : positive := 4
|
|
);
|
|
PORT (
|
|
triggerOut : OUT std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
en : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT offsetToUnsigned
|
|
GENERIC (
|
|
bitNb : positive := 16
|
|
);
|
|
PORT (
|
|
unsignedOut : OUT unsigned (bitNb-1 DOWNTO 0);
|
|
signedIn : IN signed (bitNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT periphSpeedController
|
|
GENERIC (
|
|
updatePeriodBitNb : positive := 16
|
|
);
|
|
PORT (
|
|
enableOut : OUT std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
updatePeriod : IN unsigned (updatePeriodBitNb-1 DOWNTO 0);
|
|
enableIn : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT sinCosTable
|
|
GENERIC (
|
|
inputBitNb : positive := 16;
|
|
outputBitNb : positive := 16;
|
|
tableAddressBitNb : positive := 3
|
|
);
|
|
PORT (
|
|
sine : OUT signed (outputBitNb-1 DOWNTO 0);
|
|
phase : IN unsigned (inputBitNb-1 DOWNTO 0);
|
|
cosine : OUT signed (outputBitNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT sawtoothGen
|
|
GENERIC (
|
|
bitNb : positive := 16
|
|
);
|
|
PORT (
|
|
sawtooth : OUT unsigned (bitNb-1 DOWNTO 0);
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
step : IN unsigned (bitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
|
|
-- Optional embedded configurations
|
|
-- pragma synthesis_off
|
|
-- FOR ALL : DAC USE ENTITY DigitalToAnalogConverter.DAC;
|
|
-- FOR ALL : interpolatorCalculatePolynom USE ENTITY SplineInterpolator.interpolatorCalculatePolynom;
|
|
-- FOR ALL : interpolatorCoefficients USE ENTITY SplineInterpolator.interpolatorCoefficients;
|
|
-- FOR ALL : interpolatorShiftRegister USE ENTITY SplineInterpolator.interpolatorShiftRegister;
|
|
-- FOR ALL : interpolatorTrigger USE ENTITY SplineInterpolator.interpolatorTrigger;
|
|
-- FOR ALL : offsetToUnsigned USE ENTITY SplineInterpolator.offsetToUnsigned;
|
|
-- FOR ALL : periphSpeedController USE ENTITY SystemOnChip.periphSpeedController;
|
|
-- FOR ALL : sawtoothGen USE ENTITY WaveformGenerator.sawtoothGen;
|
|
-- FOR ALL : sinCosTable USE ENTITY SystemOnChip.sinCosTable;
|
|
-- pragma synthesis_on
|
|
|
|
|
|
BEGIN
|
|
-- Architecture concurrent statements
|
|
-- HDL Embedded Text Block 1 eb1
|
|
samplesY <= sine when selSinCos = '1'
|
|
else signed(memY);
|
|
|
|
-- HDL Embedded Text Block 2 eb2
|
|
samplesX <= cosine when selSinCos = '1'
|
|
else signed(memX);
|
|
|
|
-- HDL Embedded Text Block 4 eb4
|
|
step <= to_unsigned(1, step'length);
|
|
|
|
-- HDL Embedded Text Block 5 eb5
|
|
interpolationEnable <= '1' when selSinCos = '1'
|
|
else interpolationEn;
|
|
interpolateLinear <= '0' when selSinCos = '1'
|
|
else interpolateLin;
|
|
--interpolateLinear <= interpolateLin;
|
|
|
|
|
|
-- Instance port mappings.
|
|
I_dacx : DAC
|
|
GENERIC MAP (
|
|
signalBitNb => signalBitNb
|
|
)
|
|
PORT MAP (
|
|
serialOut => outX,
|
|
parallelIn => unsignedX,
|
|
clock => clock,
|
|
reset => reset
|
|
);
|
|
I_dacy : DAC
|
|
GENERIC MAP (
|
|
signalBitNb => signalBitNb
|
|
)
|
|
PORT MAP (
|
|
serialOut => outY,
|
|
parallelIn => unsignedY,
|
|
clock => clock,
|
|
reset => reset
|
|
);
|
|
I_polyx : interpolatorCalculatePolynom
|
|
GENERIC MAP (
|
|
signalBitNb => signalBitNb,
|
|
coeffBitNb => coeffBitNb,
|
|
oversamplingBitNb => sampleCountBitNb
|
|
)
|
|
PORT MAP (
|
|
clock => clock,
|
|
reset => reset,
|
|
restartPolynom => newPolynom_internal,
|
|
d => dX,
|
|
sampleOut => sampleX,
|
|
c => cX,
|
|
b => bX,
|
|
a => aX,
|
|
en => interpolationEnable
|
|
);
|
|
I_polyy : interpolatorCalculatePolynom
|
|
GENERIC MAP (
|
|
signalBitNb => signalBitNb,
|
|
coeffBitNb => coeffBitNb,
|
|
oversamplingBitNb => sampleCountBitNb
|
|
)
|
|
PORT MAP (
|
|
clock => clock,
|
|
reset => reset,
|
|
restartPolynom => newPolynom_internal,
|
|
d => dY,
|
|
sampleOut => sampleY,
|
|
c => cY,
|
|
b => bY,
|
|
a => aY,
|
|
en => interpolationEnable
|
|
);
|
|
I_coeffx : interpolatorCoefficients
|
|
GENERIC MAP (
|
|
bitNb => signalBitNb,
|
|
coeffBitNb => coeffBitNb
|
|
)
|
|
PORT MAP (
|
|
sample1 => sampleX1,
|
|
sample2 => sampleX2,
|
|
sample3 => sampleX3,
|
|
sample4 => sampleX4,
|
|
a => aX,
|
|
b => bX,
|
|
c => cX,
|
|
d => dX,
|
|
interpolateLinear => interpolateLinear
|
|
);
|
|
I_coeffy : interpolatorCoefficients
|
|
GENERIC MAP (
|
|
bitNb => signalBitNb,
|
|
coeffBitNb => coeffBitNb
|
|
)
|
|
PORT MAP (
|
|
sample1 => sampleY1,
|
|
sample2 => sampleY2,
|
|
sample3 => sampleY3,
|
|
sample4 => sampleY4,
|
|
a => aY,
|
|
b => bY,
|
|
c => cY,
|
|
d => dY,
|
|
interpolateLinear => interpolateLinear
|
|
);
|
|
I_srx : interpolatorShiftRegister
|
|
GENERIC MAP (
|
|
signalBitNb => signalBitNb
|
|
)
|
|
PORT MAP (
|
|
clock => clock,
|
|
reset => reset,
|
|
shiftSamples => newPolynom_internal,
|
|
sampleIn => samplesX,
|
|
sample1 => sampleX1,
|
|
sample2 => sampleX2,
|
|
sample3 => sampleX3,
|
|
sample4 => sampleX4
|
|
);
|
|
I_sry : interpolatorShiftRegister
|
|
GENERIC MAP (
|
|
signalBitNb => signalBitNb
|
|
)
|
|
PORT MAP (
|
|
clock => clock,
|
|
reset => reset,
|
|
shiftSamples => newPolynom_internal,
|
|
sampleIn => samplesY,
|
|
sample1 => sampleY1,
|
|
sample2 => sampleY2,
|
|
sample3 => sampleY3,
|
|
sample4 => sampleY4
|
|
);
|
|
I_trig : interpolatorTrigger
|
|
GENERIC MAP (
|
|
counterBitNb => sampleCountBitNb
|
|
)
|
|
PORT MAP (
|
|
triggerOut => newPolynom_internal,
|
|
clock => clock,
|
|
reset => reset,
|
|
en => interpolationEnable
|
|
);
|
|
I_offsx : offsetToUnsigned
|
|
GENERIC MAP (
|
|
bitNb => signalBitNb
|
|
)
|
|
PORT MAP (
|
|
unsignedOut => unsignedX,
|
|
signedIn => sampleX
|
|
);
|
|
I_offsy : offsetToUnsigned
|
|
GENERIC MAP (
|
|
bitNb => signalBitNb
|
|
)
|
|
PORT MAP (
|
|
unsignedOut => unsignedY,
|
|
signedIn => sampleY
|
|
);
|
|
I_speed : periphSpeedController
|
|
GENERIC MAP (
|
|
updatePeriodBitNb => updatePeriodBitNb
|
|
)
|
|
PORT MAP (
|
|
enableOut => interpolationEn,
|
|
clock => clock,
|
|
reset => reset,
|
|
updatePeriod => updatePeriod,
|
|
enableIn => run
|
|
);
|
|
I_sin : sinCosTable
|
|
GENERIC MAP (
|
|
inputBitNb => phaseBitNb,
|
|
outputBitNb => signalBitNb,
|
|
tableAddressBitNb => tableAddressBitNb
|
|
)
|
|
PORT MAP (
|
|
sine => sine,
|
|
phase => phase,
|
|
cosine => cosine
|
|
);
|
|
I_phase : sawtoothGen
|
|
GENERIC MAP (
|
|
bitNb => phaseBitNb
|
|
)
|
|
PORT MAP (
|
|
sawtooth => phase,
|
|
clock => clock,
|
|
reset => reset,
|
|
step => step,
|
|
en => interpolationEnable
|
|
);
|
|
|
|
-- Implicit buffered output assignments
|
|
newPolynom <= newPolynom_internal;
|
|
|
|
END struct;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.ahbBeamerRegisters.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:21 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ENTITY ahbBeamerRegisters IS
|
|
GENERIC(
|
|
updatePeriodBitNb : positive := 16;
|
|
signalBitNb : positive := 16;
|
|
patternAddressBitNb : positive := 8;
|
|
testOutBitNb : positive := 16
|
|
);
|
|
PORT(
|
|
testOut : OUT std_ulogic_vector (1 TO testOutBitNb);
|
|
memX : OUT std_ulogic_vector (signalBitNb-1 DOWNTO 0);
|
|
memY : OUT std_ulogic_vector (signalBitNb-1 DOWNTO 0);
|
|
run : OUT std_ulogic;
|
|
updatePeriod : OUT unsigned (updatePeriodBitNb-1 DOWNTO 0);
|
|
interpolateLin : OUT std_ulogic;
|
|
newPolynom : IN std_ulogic;
|
|
hClk : IN std_ulogic;
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hAddr : IN unsigned (ahbAddressBitNb-1 DOWNTO 0);
|
|
hReset_n : IN std_ulogic;
|
|
hWData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hTrans : IN std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWrite : IN std_ulogic;
|
|
hSel : IN std_ulogic;
|
|
hReady : OUT std_ulogic;
|
|
hResp : OUT std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbBeamerRegisters ;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.blockRAMAddressCounter.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY blockRAMAddressCounter IS
|
|
GENERIC(
|
|
addressBitNb : positive := 8
|
|
);
|
|
PORT(
|
|
en : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
updateMem : IN std_ulogic;
|
|
addr : OUT unsigned (addressBitNb-1 DOWNTO 0);
|
|
patternSize : IN unsigned (addressBitNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END blockRAMAddressCounter ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF blockRAMAddressCounter IS
|
|
|
|
signal updateMemDelayed : std_ulogic;
|
|
signal updateMemChanging : std_ulogic;
|
|
signal addressInt : unsigned(addr'range);
|
|
|
|
BEGIN
|
|
|
|
delay: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
updateMemDelayed <= '0';
|
|
elsif rising_edge(clock) then
|
|
updateMemDelayed <= updateMem;
|
|
end if;
|
|
end process delay;
|
|
|
|
updateMemChanging <= '1' when (updateMem /= updateMemDelayed)
|
|
else '0';
|
|
|
|
count: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
addressInt <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if updateMemChanging = '1' then
|
|
addressInt <= (others => '0');
|
|
elsif en = '1' then
|
|
if updateMem = '1' then
|
|
addressInt <= addressInt + 1;
|
|
else
|
|
if addressInt < patternSize - 1 then
|
|
addressInt <= addressInt + 1;
|
|
else
|
|
addressInt <= (others => '0');
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process count;
|
|
|
|
addr <= addressInt;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.periphControlReg.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY periphControlReg IS
|
|
GENERIC(
|
|
dataBitNb : positive := 16;
|
|
patternSizeBitNb : positive := 8
|
|
);
|
|
PORT(
|
|
run : OUT std_ulogic;
|
|
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
|
updatePattern : OUT std_ulogic;
|
|
dataOut : OUT std_logic_vector (dataBitNb-1 DOWNTO 0);
|
|
write : IN std_ulogic;
|
|
en : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
interpolateLinear : OUT std_ulogic;
|
|
patternSize : OUT unsigned (patternSizeBitNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END periphControlReg ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF periphControlReg IS
|
|
|
|
constant runId : natural := 0;
|
|
constant updatePatternId : natural := 1;
|
|
constant interpolateLinearId : natural := 2;
|
|
constant patternSizeHighId : natural := 15;
|
|
|
|
signal runInt : std_ulogic;
|
|
signal updatePatternInt : std_ulogic;
|
|
signal interpolateLinearInt : std_ulogic;
|
|
signal patternSizeInt : std_ulogic_vector(patternSize'range);
|
|
|
|
signal dataOutReg : std_ulogic_vector(dataOut'range);
|
|
|
|
BEGIN
|
|
|
|
store: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
runInt <= '0';
|
|
updatePatternInt <= '0';
|
|
interpolateLinearInt <= '0';
|
|
patternSizeInt <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if (en = '1') and (write = '1') then
|
|
runInt <= dataIn(runId);
|
|
updatePatternInt <= dataIn(updatePatternId);
|
|
interpolateLinearInt <= dataIn(interpolateLinearId);
|
|
patternSizeInt <=
|
|
dataIn(patternSizeHighId downto patternSizeHighId-patternSize'length+1);
|
|
end if;
|
|
end if;
|
|
end process store;
|
|
|
|
run <= runInt;
|
|
updatePattern <= updatePatternInt;
|
|
interpolateLinear <= interpolateLinearInt;
|
|
patternSize <= unsigned(patternSizeInt);
|
|
|
|
process(runInt, updatePatternInt, interpolateLinearInt, patternSizeInt)
|
|
begin
|
|
dataOutReg <= (others => '-');
|
|
dataOutReg(runId) <= runInt;
|
|
dataOutReg(updatePatternId) <= updatePatternInt;
|
|
dataOutReg(interpolateLinearId) <= interpolateLinearInt;
|
|
dataOutReg(patternSizeHighId downto patternSizeHighId-patternSize'length+1)
|
|
<= patternSizeInt;
|
|
end process;
|
|
|
|
dataOut <= std_logic_vector(dataOutReg) when en = '1'
|
|
else (others => 'Z');
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.blockRAMControl.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY blockRAMControl IS
|
|
PORT(
|
|
memWr : OUT std_ulogic;
|
|
sel : IN std_ulogic;
|
|
memEn : OUT std_ulogic;
|
|
update : IN std_ulogic;
|
|
wr : IN std_ulogic;
|
|
cntIncr : OUT std_ulogic;
|
|
newSample : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END blockRAMControl ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF blockRAMControl IS
|
|
|
|
signal writeDelayed: std_ulogic;
|
|
signal writePulse: std_ulogic;
|
|
signal memWr1: std_ulogic;
|
|
|
|
BEGIN
|
|
|
|
delayWrPulse: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
writeDelayed <= '0';
|
|
elsif rising_edge(clock) then
|
|
writeDelayed <= wr;
|
|
end if;
|
|
end process delayWrPulse;
|
|
|
|
writePulse <= '1' when (wr='1') and (writeDelayed='0')
|
|
else '0';
|
|
|
|
cntIncr <= '1' when ( (update = '0') and (newSample = '1') )
|
|
or ( (update = '1') and (writePulse = '1') and (sel = '1') )
|
|
else '0';
|
|
|
|
memWr1 <= '1' when (update = '1') and (writePulse = '1') and (sel = '1')
|
|
else '0';
|
|
|
|
-- delayMemWrPulse: process(reset, clock)
|
|
-- begin
|
|
-- if reset = '1' then
|
|
-- memWr <= '0';
|
|
-- elsif rising_edge(clock) then
|
|
-- memWr <= memWr1;
|
|
-- end if;
|
|
-- end process delayMemWrPulse;
|
|
memWr <= memWr1;
|
|
|
|
memEn <= '1' when (sel = '1') or (update = '0')
|
|
else '0';
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.periphAddressDecoder.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY periphAddressDecoder IS
|
|
GENERIC(
|
|
addressBitNb : positive := 24
|
|
);
|
|
PORT(
|
|
selControl : OUT std_ulogic;
|
|
addr : IN unsigned (addressBitNb-1 DOWNTO 0);
|
|
selSpeed : OUT std_ulogic;
|
|
selX : OUT std_ulogic;
|
|
selY : OUT std_ulogic;
|
|
selZ : OUT std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END periphAddressDecoder ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF periphAddressDecoder IS
|
|
BEGIN
|
|
|
|
decode: process(addr)
|
|
begin
|
|
selControl <= '0';
|
|
selSpeed <= '0';
|
|
selX <= '0';
|
|
selY <= '0';
|
|
selZ <= '0';
|
|
case to_integer(addr(3 downto 0)) is
|
|
when 16#00# => selControl <= '1';
|
|
when 16#01# => selSpeed <= '1';
|
|
when 16#02# => selX <= '1';
|
|
when 16#03# => selY <= '1';
|
|
when 16#04# => selZ <= '1';
|
|
when others => null;
|
|
end case;
|
|
end process decode;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.blockRAM.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY blockRAM IS
|
|
GENERIC(
|
|
addressBitNb : positive := 8;
|
|
dataBitNb : positive := 16;
|
|
initFileSpec : string := "ramInit.txt"
|
|
);
|
|
PORT(
|
|
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
|
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
write : IN std_ulogic;
|
|
addr : IN unsigned (addressBitNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END blockRAM ;
|
|
|
|
|
|
|
|
|
|
|
|
USE std.textio.all;
|
|
|
|
ARCHITECTURE Spartan3E OF blockRAM IS
|
|
|
|
subtype registerType is std_ulogic_vector(dataBitNb-1 downto 0);
|
|
type memoryType is array (0 to 2**addressBitNb-1) of registerType;
|
|
|
|
-- Define function to create initvalue signal
|
|
impure function ReadRamContentFromFile(ramContentFileSpec : in string) return memoryType is
|
|
FILE ramContentFile : text open read_mode is ramContentFileSpec;
|
|
variable ramContentFileLine : line;
|
|
variable ramContent : memoryType;
|
|
variable ramCurrentWord : bit_vector(registerType'range);
|
|
variable index : natural := 0; --241;
|
|
begin
|
|
for index in ramContent'range loop
|
|
-- while not endfile(ramContentFile) loop
|
|
readline(ramContentFile, ramContentFileLine);
|
|
read(ramContentFileLine, ramCurrentWord);
|
|
ramContent(index) := std_ulogic_vector(to_stdlogicvector(ramCurrentWord));
|
|
-- index := index + 1;
|
|
end loop;
|
|
return ramContent;
|
|
end function;
|
|
|
|
shared variable memoryArray: memoryType := ReadRamContentFromFile(initFileSpec);
|
|
|
|
BEGIN
|
|
|
|
portA: process(clock)
|
|
begin
|
|
if rising_edge(clock) then
|
|
if (en = '1') then
|
|
if (write = '1') then
|
|
memoryArray(to_integer(addr)) := dataIn;
|
|
dataOut <= dataIn;
|
|
else
|
|
dataOut <= memoryArray(to_integer(addr));
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process portA;
|
|
|
|
END ARCHITECTURE Spartan3E;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.periphSpeedReg.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY periphSpeedReg IS
|
|
GENERIC(
|
|
dataBitNb : positive := 16;
|
|
updatePeriodBitNb : positive := 16
|
|
);
|
|
PORT(
|
|
updatePeriod : OUT unsigned (updatePeriodBitNb-1 DOWNTO 0);
|
|
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
|
dataOut : OUT std_logic_vector (dataBitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
write : IN std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END periphSpeedReg ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE masterVersion OF periphSpeedReg IS
|
|
|
|
signal updatePeriodInt: unsigned(updatePeriod'range);
|
|
|
|
BEGIN
|
|
|
|
store: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
updatePeriodInt <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if en = '1' then
|
|
if write = '1' then
|
|
updatePeriodInt <= unsigned(dataIn(updatePeriodInt'range));
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process store;
|
|
|
|
updatePeriod <= updatePeriodInt;
|
|
|
|
writeBack: process(en, updatePeriodInt)
|
|
begin
|
|
if en = '1' then
|
|
dataOut <= (others => '-');
|
|
dataOut(updatePeriodInt'range) <= std_logic_vector(updatePeriodInt);
|
|
else
|
|
dataOut <= (others => 'Z');
|
|
end if;
|
|
end process writeBack;
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
--
|
|
-- VHDL Architecture SystemOnChip.ahbBeamerRegisters.struct
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 15:01:22 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.ALL;
|
|
|
|
-- LIBRARY SystemOnChip;
|
|
|
|
ARCHITECTURE struct OF ahbBeamerRegisters IS
|
|
|
|
-- Architecture declarations
|
|
constant addressBitNb: positive := hAddr'length;
|
|
constant dataBitNb : positive := hWData'length;
|
|
|
|
-- Internal signal declarations
|
|
SIGNAL clock : std_ulogic;
|
|
SIGNAL reset : std_ulogic;
|
|
SIGNAL addr : unsigned(addressBitNb-1 DOWNTO 0);
|
|
SIGNAL addrX : unsigned(patternAddressBitNb-1 DOWNTO 0);
|
|
SIGNAL addrY : unsigned(patternAddressBitNb-1 DOWNTO 0);
|
|
SIGNAL cntIncrX : std_ulogic;
|
|
SIGNAL cntIncrY : std_ulogic;
|
|
SIGNAL dataIn : std_ulogic_vector(dataBitNb-1 DOWNTO 0);
|
|
SIGNAL dataOut : std_logic_vector(dataBitNb-1 DOWNTO 0);
|
|
SIGNAL memEnX : std_ulogic;
|
|
SIGNAL memEnY : std_ulogic;
|
|
SIGNAL memWrX : std_ulogic;
|
|
SIGNAL memWrY : std_ulogic;
|
|
SIGNAL patternSize : unsigned(patternAddressBitNb-1 DOWNTO 0);
|
|
SIGNAL selControl : std_ulogic;
|
|
SIGNAL selSpeed : std_ulogic;
|
|
SIGNAL selX : std_ulogic;
|
|
SIGNAL selY : std_ulogic;
|
|
SIGNAL updatePattern : std_ulogic;
|
|
SIGNAL write : std_ulogic;
|
|
SIGNAL memDataIn : std_ulogic_vector(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL run_int : std_ulogic;
|
|
SIGNAL interpolateLin_int : std_ulogic;
|
|
|
|
|
|
-- Component Declarations
|
|
COMPONENT blockRAM
|
|
GENERIC (
|
|
addressBitNb : positive := 8;
|
|
dataBitNb : positive := 16;
|
|
initFileSpec : string := "ramInit.txt"
|
|
);
|
|
PORT (
|
|
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
|
dataOut : OUT std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
write : IN std_ulogic ;
|
|
addr : IN unsigned (addressBitNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT blockRAMAddressCounter
|
|
GENERIC (
|
|
addressBitNb : positive := 8
|
|
);
|
|
PORT (
|
|
en : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
updateMem : IN std_ulogic ;
|
|
addr : OUT unsigned (addressBitNb-1 DOWNTO 0);
|
|
patternSize : IN unsigned (addressBitNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT blockRAMControl
|
|
PORT (
|
|
memWr : OUT std_ulogic ;
|
|
sel : IN std_ulogic ;
|
|
memEn : OUT std_ulogic ;
|
|
update : IN std_ulogic ;
|
|
wr : IN std_ulogic ;
|
|
cntIncr : OUT std_ulogic ;
|
|
newSample : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT periphAddressDecoder
|
|
GENERIC (
|
|
addressBitNb : positive := 24
|
|
);
|
|
PORT (
|
|
selControl : OUT std_ulogic ;
|
|
addr : IN unsigned (addressBitNb-1 DOWNTO 0);
|
|
selSpeed : OUT std_ulogic ;
|
|
selX : OUT std_ulogic ;
|
|
selY : OUT std_ulogic ;
|
|
selZ : OUT std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT periphControlReg
|
|
GENERIC (
|
|
dataBitNb : positive := 16;
|
|
patternSizeBitNb : positive := 8
|
|
);
|
|
PORT (
|
|
run : OUT std_ulogic ;
|
|
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
|
updatePattern : OUT std_ulogic ;
|
|
dataOut : OUT std_logic_vector (dataBitNb-1 DOWNTO 0);
|
|
write : IN std_ulogic ;
|
|
en : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
interpolateLinear : OUT std_ulogic ;
|
|
patternSize : OUT unsigned (patternSizeBitNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT periphSpeedReg
|
|
GENERIC (
|
|
dataBitNb : positive := 16;
|
|
updatePeriodBitNb : positive := 16
|
|
);
|
|
PORT (
|
|
updatePeriod : OUT unsigned (updatePeriodBitNb-1 DOWNTO 0);
|
|
dataIn : IN std_ulogic_vector (dataBitNb-1 DOWNTO 0);
|
|
dataOut : OUT std_logic_vector (dataBitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
write : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
|
|
-- Optional embedded configurations
|
|
-- pragma synthesis_off
|
|
-- FOR ALL : blockRAM USE ENTITY SystemOnChip.blockRAM;
|
|
-- FOR ALL : blockRAMAddressCounter USE ENTITY SystemOnChip.blockRAMAddressCounter;
|
|
-- FOR ALL : blockRAMControl USE ENTITY SystemOnChip.blockRAMControl;
|
|
-- FOR ALL : periphAddressDecoder USE ENTITY SystemOnChip.periphAddressDecoder;
|
|
-- FOR ALL : periphControlReg USE ENTITY SystemOnChip.periphControlReg;
|
|
-- FOR ALL : periphSpeedReg USE ENTITY SystemOnChip.periphSpeedReg;
|
|
-- pragma synthesis_on
|
|
|
|
|
|
BEGIN
|
|
-- Architecture concurrent statements
|
|
-- HDL Embedded Text Block 3 eb3
|
|
testout( 1) <= run_int; run <= run_int;
|
|
testout( 2) <= updatePattern;
|
|
testout( 3) <= interpolateLin_int; interpolateLin <= interpolateLin_int;
|
|
testout( 4) <= newPolynom;
|
|
testout( 5) <= newPolynom;
|
|
testout( 6) <= '0';
|
|
testout( 7) <= '0';
|
|
testout( 8) <= selControl;
|
|
testout( 9) <= selSpeed;
|
|
testout(10) <= selX;
|
|
testout(11) <= selY;
|
|
testout(12) <= '0';
|
|
testout(13) <= addr(0);
|
|
testout(14) <= addr(1);
|
|
testout(15) <= dataIn(0);
|
|
testout(16) <= dataIn(1);
|
|
|
|
-- HDL Embedded Text Block 8 eb8
|
|
storeControls: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
addr <= (others => '0');
|
|
write <= '0';
|
|
elsif rising_edge(clock) then
|
|
write <= '0';
|
|
if (hSel = '1') and (hTrans = transNonSeq) then
|
|
addr <= hAddr(addr'range);
|
|
write <= hWrite;
|
|
end if;
|
|
end if;
|
|
end process storeControls;
|
|
|
|
dataIn <= hWData;
|
|
|
|
-- HDL Embedded Text Block 9 eb9
|
|
memDataIn <= dataIn(memDataIn'range);
|
|
|
|
-- HDL Embedded Text Block 10 eb10
|
|
hRData <= std_ulogic_vector(dataOut);
|
|
|
|
hReady <= '1'; -- no wait state
|
|
hResp <= '0'; -- data OK
|
|
|
|
-- HDL Embedded Text Block 11 eb11
|
|
clock<= hClk;
|
|
|
|
reset <= not hReset_n;
|
|
|
|
|
|
-- Instance port mappings.
|
|
I_ramx : blockRAM
|
|
GENERIC MAP (
|
|
addressBitNb => patternAddressBitNb,
|
|
dataBitNb => signalBitNb,
|
|
initFileSpec => "C:/dev/sem-labs/06-07-08-09-SystemOnChip/Simulation/ramYInit.txt"
|
|
)
|
|
PORT MAP (
|
|
dataIn => memDataIn,
|
|
dataOut => memX,
|
|
en => memEnX,
|
|
clock => clock,
|
|
reset => reset,
|
|
write => memWrX,
|
|
addr => addrX
|
|
);
|
|
I_ramy : blockRAM
|
|
GENERIC MAP (
|
|
addressBitNb => patternAddressBitNb,
|
|
dataBitNb => signalBitNb,
|
|
initFileSpec => "C:/dev/sem-labs/06-07-08-09-SystemOnChip/Simulation/ramXInit.txt"
|
|
)
|
|
PORT MAP (
|
|
dataIn => memDataIn,
|
|
dataOut => memY,
|
|
en => memEnY,
|
|
clock => clock,
|
|
reset => reset,
|
|
write => memWrY,
|
|
addr => addrY
|
|
);
|
|
I_addrx : blockRAMAddressCounter
|
|
GENERIC MAP (
|
|
addressBitNb => patternAddressBitNb
|
|
)
|
|
PORT MAP (
|
|
en => cntIncrX,
|
|
clock => clock,
|
|
reset => reset,
|
|
updateMem => updatePattern,
|
|
addr => addrX,
|
|
patternSize => patternSize
|
|
);
|
|
I_addry : blockRAMAddressCounter
|
|
GENERIC MAP (
|
|
addressBitNb => patternAddressBitNb
|
|
)
|
|
PORT MAP (
|
|
en => cntIncrY,
|
|
clock => clock,
|
|
reset => reset,
|
|
updateMem => updatePattern,
|
|
addr => addrY,
|
|
patternSize => patternSize
|
|
);
|
|
I_ctlx : blockRAMControl
|
|
PORT MAP (
|
|
memWr => memWrX,
|
|
sel => selX,
|
|
memEn => memEnX,
|
|
update => updatePattern,
|
|
wr => write,
|
|
cntIncr => cntIncrX,
|
|
newSample => newPolynom,
|
|
clock => clock,
|
|
reset => reset
|
|
);
|
|
I_ctly : blockRAMControl
|
|
PORT MAP (
|
|
memWr => memWrY,
|
|
sel => selY,
|
|
memEn => memEnY,
|
|
update => updatePattern,
|
|
wr => write,
|
|
cntIncr => cntIncrY,
|
|
newSample => newPolynom,
|
|
clock => clock,
|
|
reset => reset
|
|
);
|
|
I_decoder : periphAddressDecoder
|
|
GENERIC MAP (
|
|
addressBitNb => addressBitNb
|
|
)
|
|
PORT MAP (
|
|
selControl => selControl,
|
|
addr => addr,
|
|
selSpeed => selSpeed,
|
|
selX => selX,
|
|
selY => selY,
|
|
selZ => OPEN
|
|
);
|
|
I_ctl : periphControlReg
|
|
GENERIC MAP (
|
|
dataBitNb => dataBitNb,
|
|
patternSizeBitNb => patternAddressBitNb
|
|
)
|
|
PORT MAP (
|
|
run => run_int,
|
|
dataIn => dataIn,
|
|
updatePattern => updatePattern,
|
|
dataOut => dataOut,
|
|
write => write,
|
|
en => selControl,
|
|
clock => clock,
|
|
reset => reset,
|
|
interpolateLinear => interpolateLin_int,
|
|
patternSize => patternSize
|
|
);
|
|
I_speed : periphSpeedReg
|
|
GENERIC MAP (
|
|
dataBitNb => dataBitNb,
|
|
updatePeriodBitNb => updatePeriodBitNb
|
|
)
|
|
PORT MAP (
|
|
updatePeriod => updatePeriod,
|
|
dataIn => dataIn,
|
|
dataOut => dataOut,
|
|
en => selSpeed,
|
|
clock => clock,
|
|
reset => reset,
|
|
write => write
|
|
);
|
|
|
|
END struct;
|
|
|
|
|
|
|
|
|
|
--
|
|
-- VHDL Architecture SystemOnChip.ahbBeamer.struct
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 15:00:20 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.ALL;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
-- LIBRARY SystemOnChip;
|
|
|
|
ARCHITECTURE struct OF ahbBeamer IS
|
|
|
|
-- Architecture declarations
|
|
constant signalBitNb: positive := 16;
|
|
constant updatePeriodBitNb : positive := 16;
|
|
|
|
-- Internal signal declarations
|
|
SIGNAL reset : std_ulogic;
|
|
SIGNAL run : std_ulogic;
|
|
SIGNAL interpolateLin : std_ulogic;
|
|
SIGNAL updatePeriod : unsigned(updatePeriodBitNb-1 DOWNTO 0);
|
|
SIGNAL memX : std_ulogic_vector(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL memY : std_ulogic_vector(signalBitNb-1 DOWNTO 0);
|
|
SIGNAL newPolynom : std_ulogic;
|
|
|
|
|
|
-- Component Declarations
|
|
COMPONENT ahbBeamerOperator
|
|
GENERIC (
|
|
updatePeriodBitNb : positive := 16;
|
|
signalBitNb : positive := 16
|
|
);
|
|
PORT (
|
|
outX : OUT std_ulogic ;
|
|
run : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
outY : OUT std_ulogic ;
|
|
selSinCos : IN std_ulogic ;
|
|
interpolateLin : IN std_ulogic ;
|
|
updatePeriod : IN unsigned (updatePeriodBitNb-1 DOWNTO 0);
|
|
memX : IN std_ulogic_vector (signalBitNb-1 DOWNTO 0);
|
|
memY : IN std_ulogic_vector (signalBitNb-1 DOWNTO 0);
|
|
newPolynom : OUT std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT ahbBeamerRegisters
|
|
GENERIC (
|
|
updatePeriodBitNb : positive := 16;
|
|
signalBitNb : positive := 16;
|
|
patternAddressBitNb : positive := 8;
|
|
testOutBitNb : positive := 16
|
|
);
|
|
PORT (
|
|
testOut : OUT std_ulogic_vector (1 TO testOutBitNb);
|
|
memX : OUT std_ulogic_vector (signalBitNb-1 DOWNTO 0);
|
|
memY : OUT std_ulogic_vector (signalBitNb-1 DOWNTO 0);
|
|
run : OUT std_ulogic ;
|
|
updatePeriod : OUT unsigned (updatePeriodBitNb-1 DOWNTO 0);
|
|
interpolateLin : OUT std_ulogic ;
|
|
newPolynom : IN std_ulogic ;
|
|
hClk : IN std_ulogic ;
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hAddr : IN unsigned (ahbAddressBitNb-1 DOWNTO 0);
|
|
hReset_n : IN std_ulogic ;
|
|
hWData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hTrans : IN std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWrite : IN std_ulogic ;
|
|
hSel : IN std_ulogic ;
|
|
hReady : OUT std_ulogic ;
|
|
hResp : OUT std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
|
|
-- Optional embedded configurations
|
|
-- pragma synthesis_off
|
|
-- FOR ALL : ahbBeamerOperator USE ENTITY SystemOnChip.ahbBeamerOperator;
|
|
-- FOR ALL : ahbBeamerRegisters USE ENTITY SystemOnChip.ahbBeamerRegisters;
|
|
-- pragma synthesis_on
|
|
|
|
|
|
BEGIN
|
|
-- Architecture concurrent statements
|
|
-- HDL Embedded Text Block 2 eb2
|
|
--process
|
|
--begin
|
|
-- newPolynom <= '0';
|
|
-- for index in 1 to 2**4-1 loop
|
|
-- wait until rising_edge(clock);
|
|
-- end loop;
|
|
-- newPolynom <= '1';
|
|
-- wait until rising_edge(clock);
|
|
--end process;
|
|
|
|
-- HDL Embedded Text Block 3 eb3
|
|
reset <= not hReset_n;
|
|
|
|
|
|
-- Instance port mappings.
|
|
I_op : ahbBeamerOperator
|
|
GENERIC MAP (
|
|
updatePeriodBitNb => updatePeriodBitNb,
|
|
signalBitNb => signalBitNb
|
|
)
|
|
PORT MAP (
|
|
outX => outX,
|
|
run => run,
|
|
clock => hClk,
|
|
reset => reset,
|
|
outY => outY,
|
|
selSinCos => selSinCos,
|
|
interpolateLin => interpolateLin,
|
|
updatePeriod => updatePeriod,
|
|
memX => memX,
|
|
memY => memY,
|
|
newPolynom => newPolynom
|
|
);
|
|
I_regs : ahbBeamerRegisters
|
|
GENERIC MAP (
|
|
updatePeriodBitNb => updatePeriodBitNb,
|
|
signalBitNb => signalBitNb,
|
|
patternAddressBitNb => patternAddressBitNb,
|
|
testOutBitNb => testOutBitNb
|
|
)
|
|
PORT MAP (
|
|
testOut => testOut,
|
|
memX => memX,
|
|
memY => memY,
|
|
run => run,
|
|
updatePeriod => updatePeriod,
|
|
interpolateLin => interpolateLin,
|
|
newPolynom => newPolynom,
|
|
hClk => hClk,
|
|
hRData => hRData,
|
|
hAddr => hAddr,
|
|
hReset_n => hReset_n,
|
|
hWData => hWData,
|
|
hTrans => hTrans,
|
|
hWrite => hWrite,
|
|
hSel => hSel,
|
|
hReady => hReady,
|
|
hResp => hResp
|
|
);
|
|
|
|
END struct;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity AhbLite.ahbMuxConnector.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:16 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ENTITY ahbMuxConnector IS
|
|
GENERIC(
|
|
index : positive := 1
|
|
);
|
|
PORT(
|
|
hRData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : IN std_uLogic;
|
|
hResp : IN std_uLogic;
|
|
hSelV : IN std_ulogic_vector ( 1 TO ahbSlaveNb );
|
|
hRDataV : OUT ahbDataVector;
|
|
hReadyV : OUT std_logic_vector (1 TO ahbSlaveNb);
|
|
hRespV : OUT std_logic_vector (1 TO ahbSlaveNb);
|
|
hSel : OUT std_uLogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbMuxConnector ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF ahbMuxConnector IS
|
|
BEGIN
|
|
|
|
hSel <= hSelV(index);
|
|
|
|
hRDataV(index) <= std_logic_vector(hRData);
|
|
hReadyV(index) <= hReady;
|
|
hRespV(index) <= hResp;
|
|
|
|
hRDataV <= (others => (others => 'Z'));
|
|
hReadyV <= (others => 'Z');
|
|
hRespV <= (others => 'Z');
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity AhbLite.ahbDecoder.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:16 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ENTITY ahbDecoder IS
|
|
GENERIC(
|
|
ahbMemoryLocation : ahbMemoryLocationVector
|
|
);
|
|
PORT(
|
|
hAddr : IN unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
hSel : OUT std_ulogic_vector (1 TO ahbSlaveNb)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbDecoder ;
|
|
|
|
|
|
|
|
|
|
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ARCHITECTURE RTL OF ahbDecoder IS
|
|
BEGIN
|
|
|
|
decodeAddress: process(hAddr)
|
|
variable mask: unsigned(hAddr'range);
|
|
begin
|
|
hSel <= (others => '0');
|
|
for index in hSel'range loop
|
|
mask := to_unsigned(ahbMemoryLocation(index).addressMask, mask'length);
|
|
if (hAddr and mask) = ahbMemoryLocation(index).baseAddress then
|
|
hSel(index) <= '1';
|
|
end if;
|
|
end loop;
|
|
end process decodeAddress;
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity AhbLiteComponents.ahbGpio.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:43:49 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ENTITY ahbGpio IS
|
|
GENERIC(
|
|
ioNb : positive := 8
|
|
);
|
|
PORT(
|
|
hAddr : IN unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
hClk : IN std_uLogic;
|
|
hReset_n : IN std_uLogic;
|
|
hSel : IN std_uLogic;
|
|
hTrans : IN std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hWrite : IN std_uLogic;
|
|
ioIn : IN std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : OUT std_uLogic;
|
|
hResp : OUT std_uLogic;
|
|
ioEn : OUT std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
ioOut : OUT std_ulogic_vector (ioNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbGpio ;
|
|
|
|
|
|
|
|
|
|
|
|
--==============================================================================
|
|
--
|
|
-- AHB general purpose input/outputs
|
|
--
|
|
-- Provides "ioNb" input/output signals .
|
|
--
|
|
--------------------------------------------------------------------------------
|
|
--
|
|
-- Write registers
|
|
--
|
|
-- 00, data register receives the values to drive the output lines.
|
|
-- 01, output enable register defines the signal direction:
|
|
-- when '1', the direction is "out".
|
|
--
|
|
--------------------------------------------------------------------------------
|
|
--
|
|
-- Read registers
|
|
-- 00, data register provides the values detected on the lines.
|
|
--
|
|
|
|
ARCHITECTURE masterVersion OF ahbGpio IS
|
|
|
|
signal reset, clock: std_ulogic;
|
|
-- register definitions
|
|
constant dataRegisterId: natural := 0;
|
|
constant outputEnableRegisterId: natural := 1;
|
|
|
|
signal addressReg: unsigned(addressBitNb(outputEnableRegisterId)-1 downto 0);
|
|
signal writeReg: std_ulogic;
|
|
-- written registers
|
|
subtype registerType is unsigned(ioNb-1 downto 0);
|
|
signal dataOutRegister, outputEnableRegister: registerType;
|
|
-- read registers
|
|
signal dataInRegister : registerType;
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- reset and clock
|
|
reset <= not hReset_n;
|
|
clock <= hClk;
|
|
|
|
--============================================================================
|
|
-- address and controls
|
|
storeControls: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
addressReg <= (others => '0');
|
|
writeReg <= '0';
|
|
elsif rising_edge(clock) then
|
|
writeReg <= '0';
|
|
if (hSel = '1') and (hTrans = transNonSeq) then
|
|
addressReg <= hAddr(addressReg'range);
|
|
writeReg <= hWrite;
|
|
end if;
|
|
end if;
|
|
end process storeControls;
|
|
|
|
--============================================================================
|
|
-- registers
|
|
storeWriteRegisters: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
dataOutRegister <= (others => '0');
|
|
outputEnableRegister <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if writeReg = '1' then
|
|
case to_integer(addressReg) is
|
|
when dataRegisterId => dataOutRegister <= unsigned(hWData(dataOutRegister'range));
|
|
when outputEnableRegisterId => outputEnableRegister <= unsigned(hWData(outputEnableRegister'range));
|
|
when others => null;
|
|
end case;
|
|
end if;
|
|
end if;
|
|
end process storeWriteRegisters;
|
|
|
|
ioOut <= std_ulogic_vector(dataOutRegister);
|
|
ioEn <= std_ulogic_vector(outputEnableRegister);
|
|
|
|
--============================================================================
|
|
-- data readback
|
|
dataInRegister <= unsigned(ioIn);
|
|
|
|
hRData <= std_ulogic_vector(resize(dataInRegister, hRData'length));
|
|
hReady <= '1'; -- no wait state
|
|
hResp <= '0'; -- data OK
|
|
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity AhbLite.ahbMasterInterface.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:16 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ENTITY ahbMasterInterface IS
|
|
PORT(
|
|
clock : IN std_ulogic;
|
|
hRData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : IN std_uLogic;
|
|
hResp : IN std_uLogic;
|
|
pAddress : IN unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
pDataOut : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
pReadStrobe : IN std_uLogic;
|
|
pWriteStrobe : IN std_uLogic;
|
|
reset : IN std_ulogic;
|
|
hAddr : OUT unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
hBurst : OUT std_ulogic_vector (ahbBurstBitNb-1 DOWNTO 0);
|
|
hClk : OUT std_uLogic;
|
|
hMastLock : OUT std_uLogic;
|
|
hProt : OUT std_ulogic_vector (ahbProtBitNb-1 DOWNTO 0);
|
|
hReset_n : OUT std_uLogic;
|
|
hSize : OUT std_ulogic_vector (ahbSizeBitNb-1 DOWNTO 0);
|
|
hTrans : OUT std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hWrite : OUT std_uLogic;
|
|
pDataIn : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbMasterInterface ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF ahbMasterInterface IS
|
|
|
|
signal addressReg: unsigned(pAddress'range);
|
|
signal newAddress: std_ulogic;
|
|
signal writeReg: std_ulogic;
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- reset and clock
|
|
hReset_n <= not reset;
|
|
hClk <= clock;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- address and controls
|
|
newAddress <= pReadStrobe or pWriteStrobe;
|
|
|
|
storeAddress: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
addressReg <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if newAddress = '1' then
|
|
addressReg <= pAddress;
|
|
end if;
|
|
end if;
|
|
end process storeAddress;
|
|
|
|
hAddr <= pAddress when newAddress = '1'
|
|
else addressReg;
|
|
|
|
storeWrite: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
writeReg <= '0';
|
|
elsif rising_edge(clock) then
|
|
if newAddress = '1' then
|
|
writeReg <= pWriteStrobe;
|
|
end if;
|
|
end if;
|
|
end process storeWrite;
|
|
|
|
hWrite <= pWriteStrobe when newAddress = '1'
|
|
else writeReg;
|
|
|
|
hTrans <= transNonSeq when newAddress = '1'
|
|
else transIdle;
|
|
|
|
hSize <= size16;
|
|
hBurst <= burstSingle;
|
|
hProt <= protDefault;
|
|
hMastLock <= '0';
|
|
|
|
------------------------------------------------------------------------------
|
|
-- data out
|
|
delayData: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
hWData <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if pWriteStrobe = '1' then
|
|
hWData <= pDataOut;
|
|
end if;
|
|
end if;
|
|
end process delayData;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- data in
|
|
pDataIn <= hRData;
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity AhbLite.ahbMultiplexor.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:16 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ENTITY ahbMultiplexor IS
|
|
PORT(
|
|
hRDataV : IN ahbDataVector;
|
|
hReadyV : IN std_logic_vector (1 TO ahbSlaveNb);
|
|
hRespV : IN std_logic_vector (1 TO ahbSlaveNb);
|
|
hSel : IN std_ulogic_vector ( 1 TO ahbSlaveNb );
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : OUT std_uLogic;
|
|
hResp : OUT std_uLogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbMultiplexor ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF ahbMultiplexor IS
|
|
BEGIN
|
|
|
|
multiplexData: process(hSel, hRDataV, hReadyV, hRespV)
|
|
begin
|
|
hRData <= (others => '0');
|
|
hReady <= '1';
|
|
hResp <= '0';
|
|
for index in hSel'range loop
|
|
if hSel(index) = '1' then
|
|
hRData <= std_ulogic_vector(hRDataV(index));
|
|
hReady <= hReadyV(index);
|
|
hResp <= hRespV(index);
|
|
end if;
|
|
end loop;
|
|
end process multiplexData;
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity SystemOnChip.programRom.symbol
|
|
--
|
|
-- Created:
|
|
-- by - francois.francois (Aphelia)
|
|
-- at - 14:40:20 03/13/19
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY programRom IS
|
|
GENERIC(
|
|
addressBitNb : positive := 8;
|
|
dataBitNb : positive := 8
|
|
);
|
|
PORT(
|
|
address : IN unsigned (addressBitNb-1 DOWNTO 0);
|
|
clock : IN std_ulogic;
|
|
en : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
dataOut : OUT std_ulogic_vector ( dataBitNb-1 DOWNTO 0 )
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END programRom ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE mapped OF programRom IS
|
|
|
|
subtype opCodeType is std_ulogic_vector(5 downto 0);
|
|
constant opLoadC : opCodeType := "000000";
|
|
constant opLoadR : opCodeType := "000001";
|
|
constant opInputC : opCodeType := "000100";
|
|
constant opInputR : opCodeType := "000101";
|
|
constant opFetchC : opCodeType := "000110";
|
|
constant opFetchR : opCodeType := "000111";
|
|
constant opAndC : opCodeType := "001010";
|
|
constant opAndR : opCodeType := "001011";
|
|
constant opOrC : opCodeType := "001100";
|
|
constant opOrR : opCodeType := "001101";
|
|
constant opXorC : opCodeType := "001110";
|
|
constant opXorR : opCodeType := "001111";
|
|
constant opTestC : opCodeType := "010010";
|
|
constant opTestR : opCodeType := "010011";
|
|
constant opCompC : opCodeType := "010100";
|
|
constant opCompR : opCodeType := "010101";
|
|
constant opAddC : opCodeType := "011000";
|
|
constant opAddR : opCodeType := "011001";
|
|
constant opAddCyC : opCodeType := "011010";
|
|
constant opAddCyR : opCodeType := "011011";
|
|
constant opSubC : opCodeType := "011100";
|
|
constant opSubR : opCodeType := "011101";
|
|
constant opSubCyC : opCodeType := "011110";
|
|
constant opSubCyR : opCodeType := "011111";
|
|
constant opShRot : opCodeType := "100000";
|
|
constant opOutputC : opCodeType := "101100";
|
|
constant opOutputR : opCodeType := "101101";
|
|
constant opStoreC : opCodeType := "101110";
|
|
constant opStoreR : opCodeType := "101111";
|
|
|
|
subtype shRotCinType is std_ulogic_vector(2 downto 0);
|
|
constant shRotLdC : shRotCinType := "00-";
|
|
constant shRotLdM : shRotCinType := "01-";
|
|
constant shRotLdL : shRotCinType := "10-";
|
|
constant shRotLd0 : shRotCinType := "110";
|
|
constant shRotLd1 : shRotCinType := "111";
|
|
|
|
constant registerAddressBitNb : positive := 4;
|
|
constant shRotPadLength : positive
|
|
:= dataOut'length - opCodeType'length - registerAddressBitNb
|
|
- 1 - shRotCinType'length;
|
|
subtype shRotDirType is std_ulogic_vector(1+shRotPadLength-1 downto 0);
|
|
constant shRotL : shRotDirType := (0 => '0', others => '-');
|
|
constant shRotR : shRotDirType := (0 => '1', others => '-');
|
|
|
|
subtype branchCodeType is std_ulogic_vector(4 downto 0);
|
|
constant brRet : branchCodeType := "10101";
|
|
constant brCall : branchCodeType := "11000";
|
|
constant brJump : branchCodeType := "11010";
|
|
constant brReti : branchCodeType := "11100";
|
|
constant brEni : branchCodeType := "11110";
|
|
|
|
subtype branchConditionType is std_ulogic_vector(2 downto 0);
|
|
constant brDo : branchConditionType := "000";
|
|
constant brZ : branchConditionType := "100";
|
|
constant brNZ : branchConditionType := "101";
|
|
constant brC : branchConditionType := "110";
|
|
constant brNC : branchConditionType := "111";
|
|
|
|
subtype memoryWordType is std_ulogic_vector(dataOut'range);
|
|
type memoryArrayType is array (0 to 2**address'length-1) of memoryWordType;
|
|
|
|
signal memoryArray : memoryArrayType := (
|
|
--===============================================================
|
|
-- Beamer control
|
|
--===============================================================
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- register definitions
|
|
-- s0, s1: used for INPUT and OUTPUT operations
|
|
-- S2: returns UART data byte
|
|
-- S3: uart protocol checksum
|
|
-- S4: uart protocol packet id
|
|
-- S5: uart protocol command id
|
|
-- S6: uart protocol address
|
|
-- S7: uart protocol data
|
|
-- S8: copy of UART data byte for debug
|
|
-----------------------------------------------------------------
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- GPIO definitions
|
|
-----------------------------------------------------------------
|
|
-----------------------------------------------------------------
|
|
-- UART definitions
|
|
-----------------------------------------------------------------
|
|
-- CONSTANT uartBaudCount, 023D ; 66E6 / 115 200 = 573
|
|
-- CONSTANT uartpollDelay, 0100
|
|
-----------------------------------------------------------------
|
|
-- beamer peripheral definitions
|
|
-----------------------------------------------------------------
|
|
-- CONSTANT beamerCtlInit, 1001
|
|
--
|
|
--===============================================================
|
|
-- initializations
|
|
--===============================================================
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- initialize GPIO
|
|
-----------------------------------------------------------------
|
|
16#000# => opLoadC & "0000" & "0000000000000000", -- LOAD s0, 0000
|
|
16#001# => opAddC & "0000" & "0000000000000000", -- ADD s0, 0000
|
|
16#002# => opLoadC & "0001" & "0000000010101010", -- LOAD s1, AA
|
|
16#003# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
|
16#004# => opLoadC & "0000" & "0000000000000000", -- LOAD s0, 0000
|
|
16#005# => opAddC & "0000" & "0000000000000001", -- ADD s0, 0001
|
|
16#006# => opLoadC & "0001" & "0000000000001111", -- LOAD s1, 0F
|
|
16#007# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
|
-----------------------------------------------------------------
|
|
-- initialize UART
|
|
-----------------------------------------------------------------
|
|
16#008# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010
|
|
16#009# => opAddC & "0000" & "0000000000000010", -- ADD s0, 0002
|
|
16#00A# => opLoadC & "0001" & "0000000001000010", -- LOAD s1, 0042
|
|
16#00B# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
|
-----------------------------------------------------------------
|
|
-- initialize beamer peripheral
|
|
-----------------------------------------------------------------
|
|
16#00C# => opLoadC & "0000" & "0000000000100000", -- LOAD s0, 0020
|
|
16#00D# => opAddC & "0000" & "0000000000000000", -- ADD s0, 0000
|
|
16#00E# => opLoadC & "0001" & "0000010000000001", -- LOAD s1, 0401
|
|
16#00F# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
|
16#010# => opLoadC & "0000" & "0000000000100000", -- LOAD s0, 0020
|
|
16#011# => opAddC & "0000" & "0000000000000001", -- ADD s0, 0001
|
|
16#012# => opLoadC & "0001" & "0000000000000100", -- LOAD s1, 0004
|
|
16#013# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
|
--
|
|
--===============================================================
|
|
-- Main loop
|
|
--===============================================================
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- Process commands from serial port
|
|
-----------------------------------------------------------------
|
|
-- _main_:
|
|
16#014# => brCall & brDo & "--------0000100001",-- CALL 021 ; get command from UART
|
|
16#015# => opCompC & "0011" & "0000000000000000", -- COMPARE s3, 0000 ; check function return
|
|
16#016# => brJump & brNZ & "--------0000011111",-- JUMP NZ, 01F
|
|
16#017# => opCompC & "0101" & "0000000000000011", -- COMPARE s5, 0003 ; check for WRITE_MEM command
|
|
16#018# => brJump & brNZ & "--------0000011100",-- JUMP NZ, 01C
|
|
16#019# => opOutputR & "0111" & "0110------------", -- OUTPUT s7, (S6) ; write word to memory location
|
|
16#01A# => brCall & brDo & "--------0001100000",-- CALL 060 ; send write acknowledge
|
|
16#01B# => brJump & brDo & "--------0000010100",-- JUMP 014
|
|
-- _commandRead_:
|
|
16#01C# => opInputR & "0111" & "0110------------", -- INPUT s7, (S6) ; write word in memory location
|
|
16#01D# => brCall & brDo & "--------0001101111",-- CALL 06F ; send back read data
|
|
16#01E# => brJump & brDo & "--------0000010100",-- JUMP 014
|
|
-- _commandAbort_:
|
|
16#01F# => brCall & brDo & "--------0001010001",-- CALL 051
|
|
16#020# => brJump & brDo & "--------0000010100",-- JUMP 014
|
|
--
|
|
--===============================================================
|
|
-- Subroutines
|
|
--===============================================================
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- Get command from serial port
|
|
-----------------------------------------------------------------
|
|
-- _uartGetCmd_:
|
|
16#021# => brCall & brDo & "--------0010000110",-- CALL 086 ; get command header
|
|
16#022# => opCompC & "0010" & "0000000010101010", -- COMPARE s2, 00AA
|
|
16#023# => brJump & brNZ & "--------0000100001",-- JUMP NZ, 021 ; loop until byte is AAh
|
|
16#024# => opLoadR & "0011" & "0010------------", -- LOAD s3, s2 ; prepare checksum
|
|
16#025# => brCall & brDo & "--------0010000110",-- CALL 086 ; get packet id
|
|
16#026# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#027# => opLoadR & "0100" & "0010------------", -- LOAD s4, s2 ; store id for reply
|
|
16#028# => brCall & brDo & "--------0010000110",-- CALL 086 ; get command
|
|
16#029# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#02A# => opCompC & "0010" & "0000000000000011", -- COMPARE s2, 0003 ; check for WRITE_MEM command
|
|
16#02B# => brJump & brZ & "--------0000101111",-- JUMP Z, 02F
|
|
16#02C# => opCompC & "0010" & "0000000000000100", -- COMPARE s2, 0004 ; check for READ_MEM command
|
|
16#02D# => brJump & brZ & "--------0000101111",-- JUMP Z, 02F
|
|
16#02E# => brJump & brDo & "--------0001001111",-- JUMP 04F ; no match
|
|
-- _commandOk_:
|
|
16#02F# => opLoadR & "0101" & "0010------------", -- LOAD s5, s2 ; store command for action
|
|
16#030# => brCall & brDo & "--------0010000110",-- CALL 086 ; get data length
|
|
16#031# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#032# => opCompC & "0101" & "0000000000000011", -- COMPARE s5, 0003 ; check for WRITE_MEM command
|
|
16#033# => brJump & brZ & "--------0000110111",-- JUMP Z, 037 ; go to test write command length
|
|
16#034# => opCompC & "0010" & "0000000000000010", -- COMPARE s2, 0002 ; verify READ_MEM length
|
|
16#035# => brJump & brNZ & "--------0001001111",-- JUMP NZ, 04F
|
|
16#036# => brJump & brDo & "--------0000111001",-- JUMP 039
|
|
-- _testWrLength_:
|
|
16#037# => opCompC & "0010" & "0000000000000100", -- COMPARE s2, 0004 ; verify WRITE_MEM length
|
|
16#038# => brJump & brNZ & "--------0001001111",-- JUMP NZ, 04F
|
|
-- _getAddress_:
|
|
16#039# => brCall & brDo & "--------0010000110",-- CALL 086 ; get address low
|
|
16#03A# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#03B# => opLoadR & "0110" & "0010------------", -- LOAD s6, s2 ; store address low
|
|
16#03C# => brCall & brDo & "--------0010000110",-- CALL 086 ; get address high
|
|
16#03D# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#03E# => brCall & brDo & "--------0010100000",-- CALL 0A0
|
|
16#03F# => opAddR & "0110" & "0010------------", -- ADD s6, s2 ; build address from low and high
|
|
16#040# => opCompC & "0101" & "0000000000000100", -- COMPARE s5, 0004 ; check for READ_MEM command
|
|
16#041# => brJump & brZ & "--------0001001001",-- JUMP Z, 049 ; skip reading data word
|
|
16#042# => brCall & brDo & "--------0010000110",-- CALL 086 ; get data low
|
|
16#043# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#044# => opLoadR & "0111" & "0010------------", -- LOAD s7, s2 ; store data low
|
|
16#045# => brCall & brDo & "--------0010000110",-- CALL 086 ; get data high
|
|
16#046# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#047# => brCall & brDo & "--------0010100000",-- CALL 0A0
|
|
16#048# => opAddR & "0111" & "0010------------", -- ADD s7, s2 ; build data from low and high
|
|
-- _getChecksum_:
|
|
16#049# => brCall & brDo & "--------0010000110",-- CALL 086 ; get checksum
|
|
16#04A# => opAndC & "0011" & "0000000011111111", -- AND s3, 00FF ; limit calculated checksum to 8 bit
|
|
16#04B# => opCompR & "0011" & "0010------------", -- COMPARE s3, s2 ; test checksum
|
|
16#04C# => brJump & brNZ & "--------0001001111",-- JUMP NZ, 04F
|
|
16#04D# => opLoadC & "0011" & "0000000000000000", -- LOAD s3, 0000 ; return OK
|
|
16#04E# => brRet & brDo & "------------------",-- RETURN
|
|
-- _commandKo_:
|
|
16#04F# => opLoadC & "0011" & "0000000000000001", -- LOAD s3, 0001 ; return KO
|
|
16#050# => brRet & brDo & "------------------",-- RETURN
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- send NACK reply
|
|
-----------------------------------------------------------------
|
|
-- _sendNAck_:
|
|
16#051# => opLoadC & "0010" & "0000000010101010", -- LOAD s2, 00AA ; send header
|
|
16#052# => opLoadR & "0011" & "0010------------", -- LOAD s3, s2 ; prepare checksum
|
|
16#053# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#054# => opLoadR & "0010" & "0100------------", -- LOAD s2, s4 ; packet id
|
|
16#055# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#056# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#057# => opLoadC & "0010" & "0000000000000000", -- LOAD s2, 0000 ; negative Acknowledge
|
|
16#058# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#059# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#05A# => opLoadC & "0010" & "0000000000000000", -- LOAD s2, 0000 ; packet length: no data
|
|
16#05B# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#05C# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#05D# => opLoadR & "0010" & "0011------------", -- LOAD s2, s3 ; checksum
|
|
16#05E# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#05F# => brRet & brDo & "------------------",-- RETURN
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- send WRITE_MEM reply
|
|
-----------------------------------------------------------------
|
|
-- _sendWriteOk_:
|
|
16#060# => opLoadC & "0010" & "0000000010101010", -- LOAD s2, 00AA ; send header
|
|
16#061# => opLoadR & "0011" & "0010------------", -- LOAD s3, s2 ; prepare checksum
|
|
16#062# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#063# => opLoadR & "0010" & "0100------------", -- LOAD s2, s4 ; packet id
|
|
16#064# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#065# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#066# => opLoadR & "0010" & "0101------------", -- LOAD s2, s5 ; received command
|
|
16#067# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#068# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#069# => opLoadC & "0010" & "0000000000000000", -- LOAD s2, 0000 ; packet length: no data
|
|
16#06A# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#06B# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#06C# => opLoadR & "0010" & "0011------------", -- LOAD s2, s3 ; checksum
|
|
16#06D# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#06E# => brRet & brDo & "------------------",-- RETURN
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- send READ_MEM reply
|
|
-----------------------------------------------------------------
|
|
-- _sendReadData_:
|
|
16#06F# => opLoadC & "0010" & "0000000010101010", -- LOAD s2, 00AA ; send header
|
|
16#070# => opLoadR & "0011" & "0010------------", -- LOAD s3, s2 ; prepare checksum
|
|
16#071# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#072# => opLoadR & "0010" & "0100------------", -- LOAD s2, s4 ; packet id
|
|
16#073# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#074# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#075# => opLoadR & "0010" & "0101------------", -- LOAD s2, s5 ; received command
|
|
16#076# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#077# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#078# => opLoadC & "0010" & "0000000000000010", -- LOAD s2, 0002 ; packet length: 2 bytes
|
|
16#079# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#07A# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#07B# => opLoadR & "0010" & "0111------------", -- LOAD s2, s7 ; data low
|
|
16#07C# => opAndC & "0010" & "0000000011111111", -- AND s2, 00FF ; keep low byte only
|
|
16#07D# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#07E# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#07F# => opLoadR & "0010" & "0111------------", -- LOAD s2, s7 ; data high
|
|
16#080# => brCall & brDo & "--------0010100101",-- CALL 0A5 ; shift MSBs down to LSBs
|
|
16#081# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
|
16#082# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#083# => opLoadR & "0010" & "0011------------", -- LOAD s2, s3 ; checksum
|
|
16#084# => brCall & brDo & "--------0010010011",-- CALL 093
|
|
16#085# => brRet & brDo & "------------------",-- RETURN
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- Get byte from serial port
|
|
-----------------------------------------------------------------
|
|
-- _uartGetByte_:
|
|
16#086# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010 ; read UART satus register
|
|
16#087# => opAddC & "0000" & "0000000000000001", -- ADD s0, 01
|
|
--load s8, 0100
|
|
-- _checkStat_:
|
|
16#088# => opLoadC & "0010" & "0000000001000000", -- LOAD s2, 0040 ; add delay between bus reads
|
|
-- _delay0_:
|
|
16#089# => opSubC & "0010" & "0000000000000001", -- SUB s2, 0001
|
|
16#08A# => brJump & brNZ & "--------0010001001",-- JUMP NZ, 089
|
|
--sub s8, 0001
|
|
--jump nz, continue
|
|
--load s2, 0035
|
|
--call uartSendByte
|
|
--load s8, 0100
|
|
-- _continue_:
|
|
16#08B# => opInputR & "0001" & "0000------------", -- INPUT s1, (S0)
|
|
16#08C# => opInputR & "0001" & "0000------------", -- INPUT s1, (S0)
|
|
16#08D# => opTestC & "0001" & "0000000000000001", -- TEST s1, 0001 ; check "data ready" bit
|
|
16#08E# => brJump & brZ & "--------0010001000",-- JUMP Z, 088 ; loop until bit is '1'
|
|
16#08F# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010 ; read UART data register
|
|
16#090# => opInputR & "0010" & "0000------------", -- INPUT s2, (S0)
|
|
16#091# => opInputR & "0010" & "0000------------", -- INPUT s2, (S0)
|
|
--LOAD s8, s2
|
|
16#092# => brRet & brDo & "------------------",-- RETURN
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- Send byte to serial port
|
|
-----------------------------------------------------------------
|
|
-- _uartSendByte_:
|
|
16#093# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010 ; read UART satus register
|
|
16#094# => opAddC & "0000" & "0000000000000001", -- ADD s0, 0001
|
|
-- _readStatus_:
|
|
16#095# => opInputR & "0001" & "0000------------", -- INPUT s1, (S0)
|
|
16#096# => opInputR & "0001" & "0000------------", -- INPUT s1, (S0)
|
|
16#097# => opTestC & "0001" & "0000000000000010", -- TEST s1, 0002 ; check "sending data" bit
|
|
16#098# => brJump & brZ & "--------0010011101",-- JUMP Z, 09D ; loop until bit is '1'
|
|
16#099# => opLoadC & "0001" & "0000000001000000", -- LOAD s1, 0040 ; add delay between bus reads
|
|
-- _delay1_:
|
|
16#09A# => opSubC & "0001" & "0000000000000001", -- SUB s1, 0001
|
|
16#09B# => brJump & brNZ & "--------0010011010",-- JUMP NZ, 09A
|
|
16#09C# => brJump & brDo & "--------0010010101",-- JUMP 095
|
|
-- _sendByte_:
|
|
16#09D# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010 ; write UART data register
|
|
16#09E# => opOutputR & "0010" & "0000------------", -- OUTPUT s2, (S0)
|
|
16#09F# => brRet & brDo & "------------------",-- RETURN
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- shift s2 8 bits to the left
|
|
-----------------------------------------------------------------
|
|
-- _shiftS2L8_:
|
|
16#0A0# => opLoadC & "0000" & "0000000000001000", -- LOAD s0, 8 ; loop count
|
|
-- _shiftLeftLoop_:
|
|
16#0A1# => opShRot & "0010" & shRotL & shRotLd0, -- SL0 s2
|
|
16#0A2# => opSubC & "0000" & "0000000000000001", -- SUB s0, 0001
|
|
16#0A3# => brJump & brNZ & "--------0010100001",-- JUMP NZ, 0A1
|
|
16#0A4# => brRet & brDo & "------------------",-- RETURN
|
|
--
|
|
-----------------------------------------------------------------
|
|
-- shift s2 8 bits to the right
|
|
-----------------------------------------------------------------
|
|
-- _shiftS2R8_:
|
|
16#0A5# => opLoadC & "0000" & "0000000000001000", -- LOAD s0, 8 ; loop count
|
|
-- _shiftRightLoop_:
|
|
16#0A6# => opShRot & "0010" & shRotR & shRotLd0, -- SR0 s2
|
|
16#0A7# => opSubC & "0000" & "0000000000000001", -- SUB s0, 0001
|
|
16#0A8# => brJump & brNZ & "--------0010100110",-- JUMP NZ, 0A6
|
|
16#0A9# => brRet & brDo & "------------------",-- RETURN
|
|
--
|
|
--===============================================================
|
|
-- End of instruction memory
|
|
--===============================================================
|
|
-- _endOfMemory_:
|
|
16#3FF# => brJump & brDo & "--------1111111111",-- JUMP 3FF
|
|
others => (others => '0')
|
|
);
|
|
|
|
BEGIN
|
|
|
|
process (clock)
|
|
begin
|
|
if rising_edge(clock) then
|
|
if en = '1' then
|
|
dataOut <= memoryArray(to_integer(address));
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
END ARCHITECTURE mapped;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity AhbLiteComponents.ahbUart.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:43:49 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
ENTITY ahbUart IS
|
|
GENERIC(
|
|
txFifoDepth : positive := 8;
|
|
rxFifoDepth : positive := 1
|
|
);
|
|
PORT(
|
|
RxD : IN std_ulogic;
|
|
hAddr : IN unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
hClk : IN std_uLogic;
|
|
hReset_n : IN std_uLogic;
|
|
hSel : IN std_uLogic;
|
|
hTrans : IN std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hWrite : IN std_uLogic;
|
|
TxD : OUT std_ulogic;
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : OUT std_uLogic;
|
|
hResp : OUT std_uLogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END ahbUart ;
|
|
|
|
|
|
|
|
|
|
|
|
--==============================================================================
|
|
--
|
|
-- AHB UART
|
|
--
|
|
-- Implements a serial port.
|
|
--
|
|
--------------------------------------------------------------------------------
|
|
--
|
|
-- Write registers
|
|
--
|
|
-- 00, data register receives the word to be sent to the serial port.
|
|
-- 01, control register is used to control the peripheral.
|
|
-- 02, scaler register is used to set the baud rate.
|
|
--
|
|
--------------------------------------------------------------------------------
|
|
--
|
|
-- Read registers
|
|
-- 00, data register provides the last word received by the serial port.
|
|
-- 01, status register is used to get the peripheral's state.
|
|
-- bit 0: data ready for read
|
|
-- bit 1: sending in progress
|
|
-- bit 2: receiving in progress
|
|
--
|
|
|
|
ARCHITECTURE masterVersion OF ahbUart IS
|
|
|
|
signal reset, clock: std_ulogic;
|
|
-- register definitions
|
|
constant dataOutRegisterId: natural := 0;
|
|
constant dataBitNb: positive := 8;
|
|
constant controlRegisterId: natural := 1;
|
|
constant controlBpoId: natural := 0;
|
|
constant controlFormatId: natural := 0;
|
|
constant scalerRegisterId: natural := 2;
|
|
|
|
constant statusRegisterId: natural := 1;
|
|
constant statusReadyId: natural := 0;
|
|
constant statusSendingId: natural := 1;
|
|
constant statusReceivingId: natural := 2;
|
|
-- written registers
|
|
signal addressReg: unsigned(addressBitNb(scalerRegisterId)+1-1 downto 0);
|
|
signal writeReg: std_ulogic;
|
|
signal readReg: std_ulogic;
|
|
subtype registerType is unsigned(hWdata'length-1 downto 0);
|
|
signal dataOutRegister : unsigned(dataBitNb-1 downto 0);
|
|
signal controlRegister, scalerRegister: registerType;
|
|
-- serializer
|
|
signal txPeriodCounter: unsigned(registerType'range);
|
|
signal txEn: std_uLogic;
|
|
signal txStart: std_uLogic;
|
|
signal txSending: std_uLogic;
|
|
signal txShiftCounter : unsigned(addressBitNb(dataOutRegister'length+2)-1 downto 0);
|
|
signal txShiftRegister : unsigned(dataOutRegister'high+1 downto 0);
|
|
-- read registers
|
|
signal dataInRegister : unsigned(dataOutRegister'range);
|
|
signal statusRegister: registerType;
|
|
-- deserializer
|
|
signal rxPeriodCounter: unsigned(registerType'range);
|
|
signal rxEn: std_uLogic;
|
|
signal rxDelayed, rxChanged: std_uLogic;
|
|
signal rxShiftCounter : unsigned(txShiftCounter'range);
|
|
signal rxReceiving: std_uLogic;
|
|
signal rxShiftRegister : unsigned(dataInRegister'range);
|
|
signal rxDataReady: std_uLogic;
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- reset and clock
|
|
reset <= not hReset_n;
|
|
clock <= hClk;
|
|
|
|
--============================================================================
|
|
-- address and controls
|
|
storeControls: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
addressReg <= (others => '0');
|
|
writeReg <= '0';
|
|
readReg <= '0';
|
|
elsif rising_edge(clock) then
|
|
writeReg <= '0';
|
|
readReg <= '0';
|
|
if (hSel = '1') and (hTrans = transNonSeq) then
|
|
addressReg <= hAddr(addressReg'range);
|
|
writeReg <= hWrite;
|
|
readReg <= not hWrite;
|
|
end if;
|
|
end if;
|
|
end process storeControls;
|
|
|
|
--============================================================================
|
|
-- registers
|
|
storeWriteRegisters: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
dataOutRegister <= (others => '0');
|
|
controlRegister <= (others => '0');
|
|
scalerRegister <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if writeReg = '1' then
|
|
case to_integer(addressReg) is
|
|
when dataOutRegisterId => dataOutRegister <= unsigned(hWData(dataOutRegister'range));
|
|
when controlRegisterId => controlRegister <= unsigned(hWData);
|
|
when scalerRegisterId => scalerRegister <= unsigned(hWData);
|
|
when others => null;
|
|
end case;
|
|
end if;
|
|
end if;
|
|
end process storeWriteRegisters;
|
|
|
|
txStart <= '1' when (writeReg = '1') and (addressReg = dataOutRegisterId)
|
|
else '0';
|
|
|
|
--============================================================================
|
|
-- serializer
|
|
-- tx baud rate
|
|
countTxBaudRate: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
txPeriodCounter <= (others => '1');
|
|
elsif rising_edge(clock) then
|
|
if txPeriodCounter + 1 < scalerRegister then
|
|
txPeriodCounter <= txPeriodCounter + 1;
|
|
else
|
|
txPeriodCounter <= (others => '0');
|
|
end if;
|
|
end if;
|
|
end process countTxBaudRate;
|
|
|
|
txEn <= '1' when txPeriodCounter = 1
|
|
else '0';
|
|
-- count tx shift
|
|
countTxShift: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
txShiftCounter <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if txShiftCounter = 0 then
|
|
if txStart = '1' then
|
|
txShiftCounter <= txShiftCounter + 1;
|
|
end if;
|
|
elsif txEn = '1' then
|
|
if txShiftCounter < dataOutRegister'length + 3 then
|
|
txShiftCounter <= txShiftCounter + 1;
|
|
else
|
|
txShiftCounter <= (others => '0');
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process countTxShift;
|
|
|
|
txSending <= '1' when txShiftCounter /= 0
|
|
else '0';
|
|
-- tx serializer
|
|
shiftTxData: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
txShiftRegister <= (others => '1');
|
|
elsif rising_edge(clock) then
|
|
if txEn = '1' then
|
|
if txShiftCounter = 1 then
|
|
txShiftRegister <= dataOutRegister & '0';
|
|
else
|
|
txShiftRegister <= shift_right(txShiftRegister, 1);
|
|
txShiftRegister(txShiftRegister'high) <= '1';
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process shiftTxData;
|
|
|
|
TxD <= txShiftRegister(0);
|
|
|
|
--============================================================================
|
|
-- deserializer
|
|
delayRxd: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
rxDelayed <= '0';
|
|
elsif rising_edge(clock) then
|
|
rxDelayed <= RxD;
|
|
end if;
|
|
end process delayRxd;
|
|
|
|
rxChanged <= '1' when rxDelayed /= RxD
|
|
else '0';
|
|
-- rx baud rate
|
|
countRxBaudRate: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
rxPeriodCounter <= (others => '1');
|
|
elsif rising_edge(clock) then
|
|
if rxChanged = '1' then
|
|
rxPeriodCounter <= (others => '0');
|
|
elsif rxPeriodCounter + 1 < scalerRegister then
|
|
rxPeriodCounter <= rxPeriodCounter + 1;
|
|
else
|
|
rxPeriodCounter <= (others => '0');
|
|
end if;
|
|
end if;
|
|
end process countRxBaudRate;
|
|
|
|
rxEn <= '1' when rxPeriodCounter = shift_right(scalerRegister-2, 1)
|
|
else '0';
|
|
-- count rx shift
|
|
countRxShift: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
rxShiftCounter <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if rxShiftCounter = 0 then
|
|
if (RxD = '0') and (rxDelayed = '1') then
|
|
rxShiftCounter <= rxShiftCounter + 1;
|
|
end if;
|
|
elsif rxEn = '1' then
|
|
if rxShiftCounter < dataInRegister'length + 2 then
|
|
rxShiftCounter <= rxShiftCounter + 1;
|
|
else
|
|
rxShiftCounter <= (others => '0');
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process countRxShift;
|
|
|
|
rxReceiving <= '1' when rxShiftCounter /= 0
|
|
else '0';
|
|
-- rx deserializer
|
|
shiftRxData: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
rxShiftRegister <= (others => '1');
|
|
dataInRegister <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if rxEn = '1' then
|
|
if rxShiftCounter <= dataInRegister'length+1 then
|
|
rxShiftRegister <= shift_right(rxShiftRegister, 1);
|
|
rxShiftRegister(rxShiftRegister'high) <= RxD;
|
|
end if;
|
|
if rxShiftCounter = dataInRegister'length+2 then
|
|
dataInRegister <= rxShiftRegister;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process shiftRxData;
|
|
-- monitor data ready
|
|
checkDataReady: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
rxDataReady <= '0';
|
|
elsif rising_edge(clock) then
|
|
if (rxEn = '1') and (rxShiftCounter = dataInRegister'length+2) then
|
|
rxDataReady <= '1';
|
|
elsif (readReg = '1') and (addressReg = dataOutRegisterId) then
|
|
rxDataReady <= '0';
|
|
end if;
|
|
end if;
|
|
end process checkDataReady;
|
|
|
|
--============================================================================
|
|
-- data readback
|
|
statusRegister <= (
|
|
statusReadyId => rxDataReady,
|
|
statusSendingId => txSending,
|
|
statusReceivingId => rxReceiving,
|
|
others => '0'
|
|
);
|
|
|
|
selectData: process(addressReg, dataInRegister, statusRegister)
|
|
begin
|
|
hRData <= (others => '-');
|
|
case to_integer(addressReg) is
|
|
when dataOutRegisterId => hRData <= std_ulogic_vector(resize(dataInRegister, hRData'length));
|
|
when statusRegisterId => hRData <= std_ulogic_vector(statusRegister);
|
|
when others => null;
|
|
end case;
|
|
end process selectData;
|
|
|
|
hReady <= '1'; -- no wait state
|
|
hResp <= '0'; -- data OK
|
|
|
|
|
|
END ARCHITECTURE masterVersion;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.nanoProcessor.symbol
|
|
--
|
|
-- Created:
|
|
-- by - silvan.zahno.UNKNOWN (WE6996)
|
|
-- at - 07:38:43 11.11.2019
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY nanoProcessor IS
|
|
GENERIC(
|
|
addressBitNb : positive := 8;
|
|
registerBitNb : positive := 8;
|
|
registerAddressBitNb : positive := 4;
|
|
programCounterBitNb : positive := 10;
|
|
stackPointerBitNb : positive := 5;
|
|
instructionBitNb : positive := 18;
|
|
scratchpadAddressBitNb : natural := 4
|
|
);
|
|
PORT(
|
|
clock : IN std_ulogic;
|
|
dataIn : IN std_ulogic_vector (registerBitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic;
|
|
instruction : IN std_ulogic_vector (instructionBitNb-1 DOWNTO 0);
|
|
int : IN std_uLogic;
|
|
reset : IN std_ulogic;
|
|
dataAddress : OUT unsigned (addressBitNb-1 DOWNTO 0);
|
|
dataOut : OUT std_ulogic_vector (registerBitNb-1 DOWNTO 0);
|
|
intAck : OUT std_ulogic;
|
|
progCounter : OUT unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
readStrobe : OUT std_uLogic;
|
|
writeStrobe : OUT std_uLogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END nanoProcessor ;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.aluAndRegs.symbol
|
|
--
|
|
-- Created:
|
|
-- by - silvan.zahno.UNKNOWN (WE6996)
|
|
-- at - 07:38:43 11.11.2019
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY aluAndRegs IS
|
|
GENERIC(
|
|
registerBitNb : positive := 8;
|
|
registerAddressBitNb : positive := 4;
|
|
aluCodeBitNb : positive := 5;
|
|
portAddressBitNb : positive := 8;
|
|
scratchpadAddressBitNb : natural := 4
|
|
);
|
|
PORT(
|
|
addrA : IN unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
addrB : IN unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
aluCode : IN std_ulogic_vector ( aluCodeBitNb-1 DOWNTO 0 );
|
|
cIn : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
instrData : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
instrDataSel : IN std_ulogic;
|
|
portIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
portInSel : IN std_ulogic;
|
|
regWrite : IN std_ulogic;
|
|
registerFileSel : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
scratchpadSel : IN std_ulogic;
|
|
spadIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
cOut : OUT std_ulogic;
|
|
portAddr : OUT unsigned (portAddressBitNb-1 DOWNTO 0);
|
|
portOut : OUT signed ( registerBitNb-1 DOWNTO 0 );
|
|
scratchpadAddr : OUT unsigned (scratchpadAddressBitNb-1 DOWNTO 0);
|
|
spadOut : OUT signed ( registerBitNb-1 DOWNTO 0 );
|
|
zero : OUT std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END aluAndRegs ;
|
|
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.alu.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:17 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY alu IS
|
|
GENERIC(
|
|
aluCodeBitNb : positive := 5;
|
|
dataBitNb : positive := 8
|
|
);
|
|
PORT(
|
|
aluCode : IN std_ulogic_vector ( aluCodeBitNb-1 DOWNTO 0 );
|
|
cIn : IN std_ulogic;
|
|
opA : IN signed ( dataBitNb-1 DOWNTO 0 );
|
|
opB : IN signed ( dataBitNb-1 DOWNTO 0 );
|
|
aluOut : OUT signed ( dataBitNb-1 DOWNTO 0 );
|
|
cOut : OUT std_ulogic;
|
|
zero : OUT std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END alu ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF alu IS
|
|
|
|
signal aluCodeInt: unsigned(aluCode'range);
|
|
signal aArith: signed(opA'high+1 downto 0);
|
|
signal bArith: signed(opA'high+1 downto 0);
|
|
signal cInArith: signed(1 downto 0);
|
|
signal cInShift: std_ulogic;
|
|
signal yArith: signed(aluOut'high+1 downto 0);
|
|
signal aluOutInt: signed(aluOut'range);
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- clear aluCode don't care LSB for shifts
|
|
aluCodeInt(aluCode'high downto 1) <= unsigned(aluCode(aluCode'high downto 1));
|
|
|
|
cleanupLsb: process(aluCode)
|
|
begin
|
|
if aluCode(aluCode'high) = '1' then
|
|
aluCodeInt(0) <= '0';
|
|
else
|
|
aluCodeInt(0) <= aluCode(0);
|
|
end if;
|
|
end process cleanupLsb;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- values for arithmetic operations
|
|
aArith <= signed(resize(unsigned(opA), aArith'length));
|
|
bArith <= signed(resize(unsigned(opB), bArith'length));
|
|
cInArith <= (0 => cIn, others => '0');
|
|
|
|
process(aluCode, cIn, opA)
|
|
begin
|
|
case aluCode(2 downto 1) is
|
|
when "00" => cInShift <= cIn;
|
|
when "01" => cInShift <= opA(opA'high);
|
|
when "10" => cInShift <= opA(opA'low);
|
|
when "11" => cInShift <= aluCode(0);
|
|
when others => cInShift <= '-';
|
|
end case;
|
|
end process;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- alu operations
|
|
aluOperation: process(
|
|
aluCodeInt,
|
|
opA, opB,
|
|
aArith, bArith, cInArith,
|
|
cInShift,
|
|
yArith, aluOutInt
|
|
)
|
|
variable xorAcc: std_ulogic;
|
|
begin
|
|
yArith <= (others => '-');
|
|
cOut <= '-';
|
|
aluOutInt <= (others => '-');
|
|
case to_integer(aluCodeInt) is
|
|
when 0 => -- LOAD sX, kk
|
|
aluOutInt <= opB;
|
|
when 2 => -- INPUT sX, pp
|
|
aluOutInt <= opB;
|
|
when 3 => -- FETCH sX, ss
|
|
aluOutInt <= opB;
|
|
when 5 => -- AND sX, kk
|
|
aluOutInt <= opA and opB;
|
|
cOut <= '0';
|
|
when 6 => -- OR sX, kk
|
|
aluOutInt <= opA or opB;
|
|
cOut <= '0';
|
|
when 7 => -- XOR sX, kk
|
|
aluOutInt <= opA xor opB;
|
|
cOut <= '0';
|
|
when 9 => -- TEST sX, kk
|
|
aluOutInt <= opA and opB;
|
|
xorAcc := '0';
|
|
for index in aluOutInt'range loop
|
|
xorAcc := xorAcc xor aluOutInt(index);
|
|
end loop;
|
|
cOut <= xorAcc;
|
|
when 10 => -- COMPARE sX, kk
|
|
yArith <= aArith - bArith;
|
|
aluOutInt <= yArith(aluOut'range);
|
|
cOut <= yArith(yArith'high);
|
|
when 12 => -- ADD sX, kk
|
|
yArith <= aArith + bArith;
|
|
aluOutInt <= yArith(aluOut'range);
|
|
cOut <= yArith(yArith'high);
|
|
when 13 => -- ADDCY sX, kk
|
|
yArith <= (aArith + bArith) + cInArith;
|
|
aluOutInt <= yArith(aluOut'range);
|
|
cOut <= yArith(yArith'high);
|
|
when 14 => -- SUB sX, kk
|
|
yArith <= aArith - bArith;
|
|
aluOutInt <= yArith(aluOut'range);
|
|
cOut <= yArith(yArith'high);
|
|
when 15 => -- SUBCY sX, kk
|
|
yArith <= (aArith - bArith) - cInArith;
|
|
aluOutInt <= yArith(aluOut'range);
|
|
cOut <= yArith(yArith'high);
|
|
when 16 to 23 => -- SL sX
|
|
aluOutInt <= opA(opA'high-1 downto 0) & cInShift;
|
|
cOut <= opA(opA'high);
|
|
when 24 to 31 => -- SR sX
|
|
aluOutInt <= cInShift & opA(opA'high downto 1);
|
|
cOut <= opA(0);
|
|
when others =>
|
|
aluOutInt <= (others => '-');
|
|
end case;
|
|
end process aluOperation;
|
|
|
|
aluOut <= aluOutInt;
|
|
zero <= '1' when aluOutInt = 0 else '0';
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.aluBOpSelector.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:17 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY aluBOpSelector IS
|
|
GENERIC(
|
|
registerBitNb : positive := 8
|
|
);
|
|
PORT(
|
|
instrData : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
instrDataSel : IN std_ulogic;
|
|
portIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
portInSel : IN std_ulogic;
|
|
registerFileIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
registerFileSel : IN std_ulogic;
|
|
scratchpadSel : IN std_ulogic;
|
|
spadIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
opB : OUT signed (registerBitNb-1 DOWNTO 0)
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END aluBOpSelector ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF aluBOpSelector IS
|
|
BEGIN
|
|
|
|
selectDataSource: process(
|
|
registerFileSel, registerFileIn,
|
|
scratchpadSel, spadIn,
|
|
portInSel, portIn,
|
|
instrDataSel, instrData
|
|
)
|
|
begin
|
|
if registerFileSel = '1' then
|
|
opB <= registerFileIn;
|
|
elsif scratchpadSel = '1' then
|
|
opB <= spadIn;
|
|
elsif portInSel = '1' then
|
|
opB <= portIn;
|
|
elsif instrDataSel = '1' then
|
|
opB <= instrData;
|
|
else
|
|
opB <= (others => '-');
|
|
end if;
|
|
end process selectDataSource;
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.registerFile.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:17 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY registerFile IS
|
|
GENERIC(
|
|
registerAddressBitNb : positive := 4;
|
|
dataBitNb : positive := 8
|
|
);
|
|
PORT(
|
|
addrA : IN unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
addrB : IN unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
clock : IN std_ulogic;
|
|
regWrite : IN std_ulogic;
|
|
registersIn : IN signed ( dataBitNb-1 DOWNTO 0 );
|
|
reset : IN std_ulogic;
|
|
opA : OUT signed ( dataBitNb-1 DOWNTO 0 );
|
|
opB : OUT signed ( dataBitNb-1 DOWNTO 0 )
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END registerFile ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF registerFile IS
|
|
|
|
subtype registerType is signed(registersIn'range);
|
|
type registerArrayType is array (0 to 2**registerAddressBitNb-1) of registerType;
|
|
signal registerArray : registerArrayType;
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- write to registers
|
|
updateRegister: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
registerArray <= (others => (others => '0'));
|
|
elsif rising_edge(clock) then
|
|
if regWrite = '1' then
|
|
registerArray(to_integer(addrA)) <= registersIn;
|
|
end if;
|
|
end if;
|
|
end process updateRegister;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- read from registers
|
|
opA <= registerArray(to_integer(addrA));
|
|
opB <= registerArray(to_integer(addrB));
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
--
|
|
-- VHDL Architecture NanoBlaze.aluAndRegs.struct
|
|
--
|
|
-- Created:
|
|
-- by - silvan.zahno.UNKNOWN (WE6996)
|
|
-- at - 07:38:44 11.11.2019
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
-- LIBRARY NanoBlaze;
|
|
|
|
ARCHITECTURE struct OF aluAndRegs IS
|
|
|
|
-- Architecture declarations
|
|
|
|
-- Internal signal declarations
|
|
SIGNAL aluOut : signed(registerBitNb-1 DOWNTO 0);
|
|
SIGNAL opA : signed(registerBitNb-1 DOWNTO 0);
|
|
SIGNAL opB : signed(registerBitNb-1 DOWNTO 0);
|
|
SIGNAL registerFileIn : signed(registerBitNb-1 DOWNTO 0);
|
|
|
|
|
|
-- Component Declarations
|
|
COMPONENT alu
|
|
GENERIC (
|
|
aluCodeBitNb : positive := 5;
|
|
dataBitNb : positive := 8
|
|
);
|
|
PORT (
|
|
aluCode : IN std_ulogic_vector ( aluCodeBitNb-1 DOWNTO 0 );
|
|
cIn : IN std_ulogic ;
|
|
opA : IN signed ( dataBitNb-1 DOWNTO 0 );
|
|
opB : IN signed ( dataBitNb-1 DOWNTO 0 );
|
|
aluOut : OUT signed ( dataBitNb-1 DOWNTO 0 );
|
|
cOut : OUT std_ulogic ;
|
|
zero : OUT std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT aluBOpSelector
|
|
GENERIC (
|
|
registerBitNb : positive := 8
|
|
);
|
|
PORT (
|
|
instrData : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
instrDataSel : IN std_ulogic ;
|
|
portIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
portInSel : IN std_ulogic ;
|
|
registerFileIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
registerFileSel : IN std_ulogic ;
|
|
scratchpadSel : IN std_ulogic ;
|
|
spadIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
opB : OUT signed (registerBitNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT registerFile
|
|
GENERIC (
|
|
registerAddressBitNb : positive := 4;
|
|
dataBitNb : positive := 8
|
|
);
|
|
PORT (
|
|
addrA : IN unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
addrB : IN unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
clock : IN std_ulogic ;
|
|
regWrite : IN std_ulogic ;
|
|
registersIn : IN signed ( dataBitNb-1 DOWNTO 0 );
|
|
reset : IN std_ulogic ;
|
|
opA : OUT signed ( dataBitNb-1 DOWNTO 0 );
|
|
opB : OUT signed ( dataBitNb-1 DOWNTO 0 )
|
|
);
|
|
END COMPONENT;
|
|
|
|
-- Optional embedded configurations
|
|
-- pragma synthesis_off
|
|
-- FOR ALL : alu USE ENTITY NanoBlaze.alu;
|
|
-- FOR ALL : aluBOpSelector USE ENTITY NanoBlaze.aluBOpSelector;
|
|
-- FOR ALL : registerFile USE ENTITY NanoBlaze.registerFile;
|
|
-- pragma synthesis_on
|
|
|
|
|
|
BEGIN
|
|
-- Architecture concurrent statements
|
|
-- HDL Embedded Text Block 1 eb1
|
|
portOut <= opA;
|
|
spadOut <= opA;
|
|
|
|
-- HDL Embedded Text Block 2 eb2
|
|
portAddr <= resize(unsigned(registerFileIn), portAddressBitNb);
|
|
scratchpadAddr <= resize(unsigned(registerFileIn), scratchpadAddressBitNb);
|
|
|
|
|
|
-- Instance port mappings.
|
|
I_ALU : alu
|
|
GENERIC MAP (
|
|
aluCodeBitNb => aluCodeBitNb,
|
|
dataBitNb => registerBitNb
|
|
)
|
|
PORT MAP (
|
|
aluCode => aluCode,
|
|
cIn => cIn,
|
|
opA => opA,
|
|
opB => opB,
|
|
aluOut => aluOut,
|
|
cOut => cOut,
|
|
zero => zero
|
|
);
|
|
I_bSel : aluBOpSelector
|
|
GENERIC MAP (
|
|
registerBitNb => registerBitNb
|
|
)
|
|
PORT MAP (
|
|
instrData => instrData,
|
|
instrDataSel => instrDataSel,
|
|
portIn => portIn,
|
|
portInSel => portInSel,
|
|
registerFileIn => registerFileIn,
|
|
registerFileSel => registerFileSel,
|
|
scratchpadSel => scratchpadSel,
|
|
spadIn => spadIn,
|
|
opB => opB
|
|
);
|
|
I_regs : registerFile
|
|
GENERIC MAP (
|
|
registerAddressBitNb => registerAddressBitNb,
|
|
dataBitNb => registerBitNb
|
|
)
|
|
PORT MAP (
|
|
addrA => addrA,
|
|
addrB => addrB,
|
|
clock => clock,
|
|
regWrite => regWrite,
|
|
registersIn => aluOut,
|
|
reset => reset,
|
|
opA => opA,
|
|
opB => registerFileIn
|
|
);
|
|
|
|
END struct;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.branchStack.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:17 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY branchStack IS
|
|
GENERIC(
|
|
programCounterBitNb : positive := 10;
|
|
stackPointerBitNb : positive := 5
|
|
);
|
|
PORT(
|
|
clock : IN std_ulogic;
|
|
prevPC : IN std_ulogic;
|
|
progCounter : IN unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
reset : IN std_ulogic;
|
|
storePC : IN std_ulogic;
|
|
storedProgCounter : OUT unsigned ( programCounterBitNb-1 DOWNTO 0 )
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END branchStack ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF branchStack IS
|
|
|
|
subtype progCounterType is unsigned(progCounter'range);
|
|
type progCounterArrayType is array (0 to 2**stackPointerBitNb) of progCounterType;
|
|
signal progCounterArray : progCounterArrayType;
|
|
|
|
signal writePointer : unsigned(stackPointerBitNb-1 downto 0);
|
|
signal readPointer : unsigned(stackPointerBitNb-1 downto 0);
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- stack pointers
|
|
updateStackPointer: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
writePointer <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if storePC = '1' then
|
|
writePointer <= writePointer + 1;
|
|
elsif prevPC = '1' then
|
|
writePointer <= writePointer - 1;
|
|
end if;
|
|
end if;
|
|
end process updateStackPointer;
|
|
|
|
readPointer <= writePointer - 1;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- program counters stack
|
|
updateStack: process(reset, clock)
|
|
begin
|
|
if rising_edge(clock) then
|
|
if storePc = '1' then
|
|
progCounterArray(to_integer(writePointer)) <= progCounter;
|
|
end if;
|
|
storedProgCounter <= progCounterArray(to_integer(readPointer));
|
|
end if;
|
|
end process updateStack;
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.controller.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:17 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY controller IS
|
|
GENERIC(
|
|
intCodeBitNb : positive := 5;
|
|
branchCondBitNb : positive := 3;
|
|
opCodeBitNb : positive := 5
|
|
);
|
|
PORT(
|
|
branchCond : IN std_ulogic_vector ( branchCondBitNb-1 DOWNTO 0 );
|
|
cOut : IN std_ulogic;
|
|
clock : IN std_ulogic;
|
|
en : IN std_ulogic;
|
|
int : IN std_uLogic;
|
|
intCode : IN std_ulogic_vector ( intCodeBitNb-1 DOWNTO 0 );
|
|
opCode : IN std_ulogic_vector (opCodeBitNb-1 DOWNTO 0);
|
|
reset : IN std_ulogic;
|
|
twoRegInstr : IN std_ulogic;
|
|
zero : IN std_ulogic;
|
|
cIn : OUT std_ulogic;
|
|
incPC : OUT std_ulogic;
|
|
instrDataSel : OUT std_ulogic;
|
|
intAck : OUT std_ulogic;
|
|
loadInstrAddress : OUT std_ulogic;
|
|
loadStoredPC : OUT std_ulogic;
|
|
portInSel : OUT std_ulogic;
|
|
prevPC : OUT std_ulogic;
|
|
readStrobe : OUT std_uLogic;
|
|
regWrite : OUT std_ulogic;
|
|
registerFileSel : OUT std_ulogic;
|
|
scratchpadSel : OUT std_ulogic;
|
|
scratchpadWrite : OUT std_ulogic;
|
|
storePC : OUT std_ulogic;
|
|
writeStrobe : OUT std_uLogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END controller ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF controller IS
|
|
|
|
signal en1, enInt: std_ulogic;
|
|
|
|
constant opCodeLength : integer := 5;
|
|
subtype opCodeType is std_ulogic_vector(opCodeLength-1 downto 0);
|
|
constant opLoad : opCodeType := "00000";
|
|
constant opInput : opCodeType := "00010";
|
|
constant opFetch : opCodeType := "00011";
|
|
constant opAnd : opCodeType := "00101";
|
|
constant opOr : opCodeType := "00110";
|
|
constant opXor : opCodeType := "00111";
|
|
constant opTest : opCodeType := "01001";
|
|
constant opComp : opCodeType := "01010";
|
|
constant opAdd : opCodeType := "01100";
|
|
constant opAddCy : opCodeType := "01101";
|
|
constant opSub : opCodeType := "01110";
|
|
constant opSubCy : opCodeType := "01111";
|
|
constant opShRot : opCodeType := "10000";
|
|
constant opRet : opCodeType := "10101";
|
|
constant opOutput: opCodeType := "10110";
|
|
constant opStore : opCodeType := "10111";
|
|
constant opCall : opCodeType := "11000";
|
|
constant opJump : opCodeType := "11010";
|
|
constant opIntF : opCodeType := "11110";
|
|
|
|
constant branchConditionLength : integer := 3;
|
|
subtype branchConditionType is std_ulogic_vector(branchConditionLength-1 downto 0);
|
|
constant brAw : branchConditionType := "000";
|
|
constant brZ : branchConditionType := "100";
|
|
constant brNZ : branchConditionType := "101";
|
|
constant brC : branchConditionType := "110";
|
|
constant brNC : branchConditionType := "111";
|
|
|
|
signal aluOpSel: std_ulogic;
|
|
signal regWriteEn: std_ulogic;
|
|
|
|
signal flagsEn, flagsEnable: std_ulogic;
|
|
signal carrySaved: std_ulogic;
|
|
signal zeroSaved: std_ulogic;
|
|
|
|
signal branchEnable1, branchEnable: std_ulogic;
|
|
signal discardOpCode: std_ulogic;
|
|
|
|
signal updateIntFlag: std_ulogic;
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- Enable signal
|
|
buildEnable: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
en1 <= '0';
|
|
elsif rising_edge(clock) then
|
|
en1 <= '1';
|
|
end if;
|
|
end process buildEnable;
|
|
|
|
enInt <= en1 and en; -- don't enable very first instruction twice
|
|
|
|
------------------------------------------------------------------------------
|
|
-- ALU controls
|
|
selectdataSource: process(opCode)
|
|
begin
|
|
aluOpSel <= '0';
|
|
portInSel <= '0';
|
|
scratchpadSel <= '0';
|
|
case opCode(opCodeLength-1 downto 0) is
|
|
when opLoad => aluOpSel <= '1';
|
|
when opInput => portInSel <= '1';
|
|
when opFetch => scratchpadSel <= '1';
|
|
when opAnd => aluOpSel <= '1';
|
|
when opOr => aluOpSel <= '1';
|
|
when opXor => aluOpSel <= '1';
|
|
when opTest => aluOpSel <= '1';
|
|
when opComp => aluOpSel <= '1';
|
|
when opAdd => aluOpSel <= '1';
|
|
when opAddCy => aluOpSel <= '1';
|
|
when opSub => aluOpSel <= '1';
|
|
when opSubCy => aluOpSel <= '1';
|
|
when opShRot => aluOpSel <= '1';
|
|
when others => aluOpSel <= '-';
|
|
portInSel <= '-';
|
|
scratchpadSel <= '-';
|
|
end case;
|
|
end process selectdataSource;
|
|
|
|
registerFileSel <= aluOpSel and twoRegInstr;
|
|
instrDataSel <= aluOpSel and (not twoRegInstr);
|
|
|
|
regWriteEn <= enInt and (not discardOpCode);
|
|
|
|
regWriteTable: process(opCode, regWriteEn)
|
|
begin
|
|
case opCode(opCodeLength-1 downto 0) is
|
|
when opLoad => regWrite <= regWriteEn;
|
|
when opInput => regWrite <= regWriteEn;
|
|
when opFetch => regWrite <= regWriteEn;
|
|
when opAnd => regWrite <= regWriteEn;
|
|
when opOr => regWrite <= regWriteEn;
|
|
when opXor => regWrite <= regWriteEn;
|
|
when opAdd => regWrite <= regWriteEn;
|
|
when opAddCy => regWrite <= regWriteEn;
|
|
when opSub => regWrite <= regWriteEn;
|
|
when opSubCy => regWrite <= regWriteEn;
|
|
when opShRot => regWrite <= regWriteEn;
|
|
when others => regWrite <= '0';
|
|
end case;
|
|
end process regWriteTable;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- I/O controls
|
|
readStrobe <= enInt when (opCode = opInput) and (discardOpCode = '0')
|
|
else '0';
|
|
writeStrobe <= enInt when (opCode = opOutput) and (discardOpCode = '0')
|
|
else '0';
|
|
|
|
------------------------------------------------------------------------------
|
|
-- scratchpad controls
|
|
scratchpadWrite <= '1' when opCode = opStore else '0';
|
|
|
|
------------------------------------------------------------------------------
|
|
-- Carry logic
|
|
flagsEn <= enInt and (not branchEnable);
|
|
|
|
flagsEnableTable: process(opCode, flagsEn)
|
|
begin
|
|
case opCode(opCodeLength-1 downto 0) is
|
|
when opAnd => flagsEnable <= flagsEn;
|
|
when opOr => flagsEnable <= flagsEn;
|
|
when opXor => flagsEnable <= flagsEn;
|
|
when opTest => flagsEnable <= flagsEn;
|
|
when opComp => flagsEnable <= flagsEn;
|
|
when opAdd => flagsEnable <= flagsEn;
|
|
when opAddCy => flagsEnable <= flagsEn;
|
|
when opSub => flagsEnable <= flagsEn;
|
|
when opSubCy => flagsEnable <= flagsEn;
|
|
when opShRot => flagsEnable <= flagsEn;
|
|
when others => flagsEnable <= '0';
|
|
end case;
|
|
end process flagsEnableTable;
|
|
|
|
saveCarries: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
carrySaved <= '0';
|
|
zeroSaved <= '0';
|
|
elsif rising_edge(clock) then
|
|
if flagsEnable = '1' then
|
|
carrySaved <= cOut;
|
|
zeroSaved <= zero;
|
|
end if;
|
|
end if;
|
|
end process saveCarries;
|
|
|
|
cIn <= carrySaved;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- Program counter controls
|
|
checkBranchCondition: process(branchCond, zeroSaved, carrySaved)
|
|
begin
|
|
case branchCond(branchConditionLength-1 downto 0) is
|
|
when brAw => branchEnable1 <= '1';
|
|
when brZ => branchEnable1 <= zeroSaved;
|
|
when brNZ => branchEnable1 <= not zeroSaved;
|
|
when brC => branchEnable1 <= carrySaved;
|
|
when brNC => branchEnable1 <= not carrySaved;
|
|
when others => branchEnable1 <= '-';
|
|
end case;
|
|
end process checkBranchCondition;
|
|
|
|
branchEnableTable: process(opCode, branchEnable1, discardOpCode)
|
|
begin
|
|
if discardOpCode = '0' then
|
|
case opCode(opCodeLength-1 downto 0) is
|
|
when opRet => branchEnable <= branchEnable1;
|
|
when opCall => branchEnable <= branchEnable1;
|
|
when opJump => branchEnable <= branchEnable1;
|
|
when others => branchEnable <= '0';
|
|
end case;
|
|
else
|
|
branchEnable <= '0';
|
|
end if;
|
|
end process branchEnableTable;
|
|
|
|
progCounterControlTable: process(opCode, enInt, branchEnable)
|
|
begin
|
|
incPC <= enInt;
|
|
loadInstrAddress <= '0';
|
|
loadStoredPC <= '0';
|
|
case opCode(opCodeLength-1 downto 0) is
|
|
when opRet => incPC <= not branchEnable;
|
|
loadStoredPC <= enInt and branchEnable;
|
|
when opCall => incPC <= not branchEnable;
|
|
loadInstrAddress <= enInt and branchEnable;
|
|
when opJump => incPC <= not branchEnable;
|
|
loadInstrAddress <= enInt and branchEnable;
|
|
when others => null;
|
|
end case;
|
|
end process progCounterControlTable;
|
|
|
|
-- If a branch condition is met, the next operation has to be discarded.
|
|
-- This is due to the synchronous operation of the program ROM: the
|
|
-- instructions are provided one clock period after the program counter.
|
|
-- so while the branch operation is processed, the next instruction is
|
|
-- already being fetched.
|
|
delayBranchEnable: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
discardOpCode <= '0';
|
|
elsif rising_edge(clock) then
|
|
discardOpCode <= branchEnable;
|
|
end if;
|
|
end process delayBranchEnable;
|
|
|
|
------------------------------------------------------------------------------
|
|
-- Stack pointer controls
|
|
pcStackControlTable: process(discardOpCode, opCode, enInt)
|
|
begin
|
|
storePC <= '0';
|
|
prevPC <= '0';
|
|
if discardOpCode = '0' then
|
|
case opCode(opCodeLength-1 downto 0) is
|
|
when opRet => prevPC <= enInt;
|
|
when opCall => storePC <= enInt;
|
|
when others => null;
|
|
end case;
|
|
end if;
|
|
end process pcStackControlTable;
|
|
|
|
|
|
------------------------------------------------------------------------------
|
|
-- interrupt control
|
|
updateIntFlag <= '1' when opCode = opIntF else '0';
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.instructionDecoder.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:17 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY instructionDecoder IS
|
|
GENERIC(
|
|
registerBitNb : positive := 8;
|
|
registerAddressBitNb : positive := 4;
|
|
aluCodeBitNb : positive := 5;
|
|
instructionBitNb : positive := 18;
|
|
programCounterBitNb : positive := 10;
|
|
opCodeBitNb : positive := 5;
|
|
branchCondBitNb : positive := 3;
|
|
intCodeBitNb : positive := 5;
|
|
spadAddressBitNb : natural := 4;
|
|
portAddressBitNb : positive := 8
|
|
);
|
|
PORT(
|
|
instruction : IN std_ulogic_vector ( instructionBitNb-1 DOWNTO 0 );
|
|
addrA : OUT unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
addrB : OUT unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
aluCode : OUT std_ulogic_vector ( aluCodeBitNb-1 DOWNTO 0 );
|
|
branchCond : OUT std_ulogic_vector (branchCondBitNb-1 DOWNTO 0);
|
|
instrAddress : OUT unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
instrData : OUT signed ( registerBitNb-1 DOWNTO 0 );
|
|
intCode : OUT std_ulogic_vector ( intCodeBitNb-1 DOWNTO 0 );
|
|
opCode : OUT std_ulogic_vector ( opCodeBitNb-1 DOWNTO 0 );
|
|
portAddress : OUT unsigned (portAddressBitNb-1 DOWNTO 0);
|
|
portIndexedSel : OUT std_ulogic;
|
|
spadAddress : OUT unsigned ( spadAddressBitNb-1 DOWNTO 0 );
|
|
spadIndexedSel : OUT std_ulogic;
|
|
twoRegInstr : OUT std_ulogic
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END instructionDecoder ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF instructionDecoder IS
|
|
|
|
constant opCodeIndexH : integer := instruction'high;
|
|
constant opCodeIndexL : integer := opCodeIndexH - opCodeBitNb + 1;
|
|
|
|
constant twoRegInstrIndex : integer := opCodeIndexL - 1;
|
|
constant ioAddrIndexed : integer := twoRegInstrIndex;
|
|
|
|
constant addrAIndexH : integer := twoRegInstrIndex - 1;
|
|
constant addrAIndexL : integer := addrAIndexH - registerAddressBitNb + 1;
|
|
|
|
constant immediateDataIndexH : integer := registerBitNb-1;
|
|
constant immediateDataIndexL : integer := 0;
|
|
constant addrBIndexH : integer := addrAIndexL - 1;
|
|
constant addrBIndexL : integer := addrBIndexH - registerAddressBitNb + 1;
|
|
|
|
constant aluCodeIndexH : integer := opCodeIndexH;
|
|
constant aluCodeIndexL : integer := aluCodeIndexH - aluCodeBitNb + 1;
|
|
|
|
constant portAddressH : integer := registerBitNb-1;
|
|
constant portAddressL : integer := portAddressH-portAddressBitNb+1;
|
|
constant spadAddressH : integer := registerBitNb-1;
|
|
constant spadAddressL : integer := spadAddressH-spadAddressBitNb+1;
|
|
|
|
constant branchCondH : integer := opCodeIndexL-1;
|
|
constant branchCondL : integer := branchCondH-branchCondBitNb+1;
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- ALU control
|
|
aluCode <=
|
|
instruction(aluCodeIndexH downto aluCodeIndexL)
|
|
when instruction(aluCodeIndexH) = '0' else
|
|
'1' & instruction(aluCodeBitNb-2 downto 0);
|
|
opCode <= instruction(opCodeIndexH downto opCodeIndexL);
|
|
twoRegInstr <= instruction(twoRegInstrIndex);
|
|
addrA <= unsigned(instruction(addrAIndexH downto addrAIndexL));
|
|
addrB <= unsigned(instruction(addrBIndexH downto addrBIndexL));
|
|
instrData <= signed(instruction(immediateDataIndexH downto immediateDataIndexL));
|
|
|
|
------------------------------------------------------------------------------
|
|
-- I/O control
|
|
portIndexedSel <= instruction(ioAddrIndexed);
|
|
portAddress <= unsigned(instruction(portAddressH downto portAddressL));
|
|
|
|
------------------------------------------------------------------------------
|
|
-- scratchpad control
|
|
spadIndexedSel <= instruction(ioAddrIndexed);
|
|
spadAddress <= unsigned(instruction(spadAddressH downto spadAddressL));
|
|
|
|
------------------------------------------------------------------------------
|
|
-- branch control
|
|
branchCond <= instruction(branchCondH downto branchCondL);
|
|
instrAddress <= unsigned(instruction(instrAddress'range));
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.programCounter.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:17 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY programCounter IS
|
|
GENERIC(
|
|
programCounterBitNb : positive := 10
|
|
);
|
|
PORT(
|
|
clock : IN std_ulogic;
|
|
incPC : IN std_ulogic;
|
|
instrAddress : IN unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
loadInstrAddress : IN std_ulogic;
|
|
loadStoredPC : IN std_ulogic;
|
|
reset : IN std_ulogic;
|
|
storedProgCounter : IN unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
progCounter : OUT unsigned ( programCounterBitNb-1 DOWNTO 0 )
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END programCounter ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF programCounter IS
|
|
|
|
signal pCounter: unsigned(progCounter'range);
|
|
|
|
BEGIN
|
|
|
|
updateProgramCounter: process(reset, clock)
|
|
begin
|
|
if reset = '1' then
|
|
pCounter <= (others => '0');
|
|
elsif rising_edge(clock) then
|
|
if incPC = '1' then
|
|
pCounter <= pCounter + 1;
|
|
elsif loadInstrAddress = '1' then
|
|
pCounter <= instrAddress;
|
|
elsif loadStoredPC = '1' then
|
|
pCounter <= storedProgCounter;
|
|
end if;
|
|
end if;
|
|
end process updateProgramCounter;
|
|
|
|
progCounter <= pCounter;
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
-- VHDL Entity NanoBlaze.scratchpad.symbol
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 11:44:17 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
ENTITY scratchpad IS
|
|
GENERIC(
|
|
registerBitNb : positive := 8;
|
|
spadAddressBitNb : natural := 4
|
|
);
|
|
PORT(
|
|
addr : IN unsigned ( spadAddressBitNb-1 DOWNTO 0 );
|
|
clock : IN std_ulogic;
|
|
dataIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
reset : IN std_ulogic;
|
|
write : IN std_ulogic;
|
|
dataOut : OUT signed ( registerBitNb-1 DOWNTO 0 )
|
|
);
|
|
|
|
-- Declarations
|
|
|
|
END scratchpad ;
|
|
|
|
|
|
|
|
|
|
|
|
ARCHITECTURE RTL OF scratchpad IS
|
|
|
|
subtype memoryWordType is signed(dataOut'range);
|
|
type memoryArrayType is array (0 to 2**addr'length-1) of memoryWordType;
|
|
|
|
signal memoryArray : memoryArrayType;
|
|
|
|
BEGIN
|
|
|
|
process (clock)
|
|
begin
|
|
if rising_edge(clock) then
|
|
if write = '1' then
|
|
memoryArray(to_integer(addr)) <= dataIn;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
dataOut <= memoryArray(to_integer(addr));
|
|
|
|
END ARCHITECTURE RTL;
|
|
|
|
|
|
|
|
|
|
--
|
|
-- VHDL Architecture NanoBlaze.nanoProcessor.struct
|
|
--
|
|
-- Created:
|
|
-- by - silvan.zahno.UNKNOWN (WE6996)
|
|
-- at - 07:38:43 11.11.2019
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
-- LIBRARY NanoBlaze;
|
|
|
|
ARCHITECTURE struct OF nanoProcessor IS
|
|
|
|
-- Architecture declarations
|
|
constant aluCodeBitNb: positive := 5;
|
|
constant opCodeBitNb: positive := 5;
|
|
constant branchCondBitNb: positive := 3;
|
|
constant intCodeBitNb: positive := 5;
|
|
|
|
-- Internal signal declarations
|
|
SIGNAL addrA : unsigned( registerAddressBitNb-1 DOWNTO 0 );
|
|
SIGNAL addrB : unsigned( registerAddressBitNb-1 DOWNTO 0 );
|
|
SIGNAL aluCode : std_ulogic_vector( aluCodeBitNb-1 DOWNTO 0 );
|
|
SIGNAL branchCond : std_ulogic_vector(branchCondBitNb-1 DOWNTO 0);
|
|
SIGNAL cIn : std_ulogic;
|
|
SIGNAL cOut : std_ulogic;
|
|
SIGNAL incPC : std_ulogic;
|
|
SIGNAL instrAddress : unsigned( programCounterBitNb-1 DOWNTO 0 );
|
|
SIGNAL instrData : signed( registerBitNb-1 DOWNTO 0 );
|
|
SIGNAL instrDataSel : std_ulogic;
|
|
SIGNAL instrString : string(1 TO 16);
|
|
SIGNAL intCode : std_ulogic_vector( intCodeBitNb-1 DOWNTO 0 );
|
|
SIGNAL loadInstrAddress : std_ulogic;
|
|
SIGNAL loadStoredPC : std_ulogic;
|
|
SIGNAL opCode : std_ulogic_vector( opCodeBitNb-1 DOWNTO 0 );
|
|
SIGNAL portIn : signed( registerBitNb-1 DOWNTO 0 );
|
|
SIGNAL portInSel : std_ulogic;
|
|
SIGNAL portIndexedSel : std_ulogic;
|
|
SIGNAL portInstrAddress : unsigned(addressBitNb-1 DOWNTO 0);
|
|
SIGNAL portOut : signed( registerBitNb-1 DOWNTO 0 );
|
|
SIGNAL portRegAddress : unsigned(addressBitNb-1 DOWNTO 0);
|
|
SIGNAL prevPC : std_ulogic;
|
|
SIGNAL regWrite : std_ulogic;
|
|
SIGNAL registerFileSel : std_ulogic;
|
|
SIGNAL scratchpadSel : std_ulogic;
|
|
SIGNAL scratchpadWrite : std_ulogic;
|
|
SIGNAL spadAddress : unsigned(scratchpadAddressBitNb-1 DOWNTO 0);
|
|
SIGNAL spadIn : signed(registerBitNb-1 DOWNTO 0);
|
|
SIGNAL spadIndexedSel : std_ulogic;
|
|
SIGNAL spadInstrAddress : unsigned(scratchpadAddressBitNb-1 DOWNTO 0);
|
|
SIGNAL spadOut : signed(registerBitNb-1 DOWNTO 0);
|
|
SIGNAL spadRegAddress : unsigned(scratchpadAddressBitNb-1 DOWNTO 0);
|
|
SIGNAL storePC : std_ulogic;
|
|
SIGNAL storedProgCounter : unsigned( programCounterBitNb-1 DOWNTO 0 );
|
|
SIGNAL twoRegInstr : std_ulogic;
|
|
SIGNAL zero : std_ulogic;
|
|
|
|
-- Implicit buffer signal declarations
|
|
SIGNAL progCounter_internal : unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
|
|
|
|
-- Component Declarations
|
|
COMPONENT aluAndRegs
|
|
GENERIC (
|
|
registerBitNb : positive := 8;
|
|
registerAddressBitNb : positive := 4;
|
|
aluCodeBitNb : positive := 5;
|
|
portAddressBitNb : positive := 8;
|
|
scratchpadAddressBitNb : natural := 4
|
|
);
|
|
PORT (
|
|
addrA : IN unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
addrB : IN unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
aluCode : IN std_ulogic_vector ( aluCodeBitNb-1 DOWNTO 0 );
|
|
cIn : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
instrData : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
instrDataSel : IN std_ulogic ;
|
|
portIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
portInSel : IN std_ulogic ;
|
|
regWrite : IN std_ulogic ;
|
|
registerFileSel : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
scratchpadSel : IN std_ulogic ;
|
|
spadIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
cOut : OUT std_ulogic ;
|
|
portAddr : OUT unsigned (portAddressBitNb-1 DOWNTO 0);
|
|
portOut : OUT signed ( registerBitNb-1 DOWNTO 0 );
|
|
scratchpadAddr : OUT unsigned (scratchpadAddressBitNb-1 DOWNTO 0);
|
|
spadOut : OUT signed ( registerBitNb-1 DOWNTO 0 );
|
|
zero : OUT std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT branchStack
|
|
GENERIC (
|
|
programCounterBitNb : positive := 10;
|
|
stackPointerBitNb : positive := 5
|
|
);
|
|
PORT (
|
|
clock : IN std_ulogic ;
|
|
prevPC : IN std_ulogic ;
|
|
progCounter : IN unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
reset : IN std_ulogic ;
|
|
storePC : IN std_ulogic ;
|
|
storedProgCounter : OUT unsigned ( programCounterBitNb-1 DOWNTO 0 )
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT controller
|
|
GENERIC (
|
|
intCodeBitNb : positive := 5;
|
|
branchCondBitNb : positive := 3;
|
|
opCodeBitNb : positive := 5
|
|
);
|
|
PORT (
|
|
branchCond : IN std_ulogic_vector ( branchCondBitNb-1 DOWNTO 0 );
|
|
cOut : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
en : IN std_ulogic ;
|
|
int : IN std_uLogic ;
|
|
intCode : IN std_ulogic_vector ( intCodeBitNb-1 DOWNTO 0 );
|
|
opCode : IN std_ulogic_vector (opCodeBitNb-1 DOWNTO 0);
|
|
reset : IN std_ulogic ;
|
|
twoRegInstr : IN std_ulogic ;
|
|
zero : IN std_ulogic ;
|
|
cIn : OUT std_ulogic ;
|
|
incPC : OUT std_ulogic ;
|
|
instrDataSel : OUT std_ulogic ;
|
|
intAck : OUT std_ulogic ;
|
|
loadInstrAddress : OUT std_ulogic ;
|
|
loadStoredPC : OUT std_ulogic ;
|
|
portInSel : OUT std_ulogic ;
|
|
prevPC : OUT std_ulogic ;
|
|
readStrobe : OUT std_uLogic ;
|
|
regWrite : OUT std_ulogic ;
|
|
registerFileSel : OUT std_ulogic ;
|
|
scratchpadSel : OUT std_ulogic ;
|
|
scratchpadWrite : OUT std_ulogic ;
|
|
storePC : OUT std_ulogic ;
|
|
writeStrobe : OUT std_uLogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT instructionDecoder
|
|
GENERIC (
|
|
registerBitNb : positive := 8;
|
|
registerAddressBitNb : positive := 4;
|
|
aluCodeBitNb : positive := 5;
|
|
instructionBitNb : positive := 18;
|
|
programCounterBitNb : positive := 10;
|
|
opCodeBitNb : positive := 5;
|
|
branchCondBitNb : positive := 3;
|
|
intCodeBitNb : positive := 5;
|
|
spadAddressBitNb : natural := 4;
|
|
portAddressBitNb : positive := 8
|
|
);
|
|
PORT (
|
|
instruction : IN std_ulogic_vector ( instructionBitNb-1 DOWNTO 0 );
|
|
addrA : OUT unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
addrB : OUT unsigned ( registerAddressBitNb-1 DOWNTO 0 );
|
|
aluCode : OUT std_ulogic_vector ( aluCodeBitNb-1 DOWNTO 0 );
|
|
branchCond : OUT std_ulogic_vector (branchCondBitNb-1 DOWNTO 0);
|
|
instrAddress : OUT unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
instrData : OUT signed ( registerBitNb-1 DOWNTO 0 );
|
|
intCode : OUT std_ulogic_vector ( intCodeBitNb-1 DOWNTO 0 );
|
|
opCode : OUT std_ulogic_vector ( opCodeBitNb-1 DOWNTO 0 );
|
|
portAddress : OUT unsigned (portAddressBitNb-1 DOWNTO 0);
|
|
portIndexedSel : OUT std_ulogic ;
|
|
spadAddress : OUT unsigned ( spadAddressBitNb-1 DOWNTO 0 );
|
|
spadIndexedSel : OUT std_ulogic ;
|
|
twoRegInstr : OUT std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT programCounter
|
|
GENERIC (
|
|
programCounterBitNb : positive := 10
|
|
);
|
|
PORT (
|
|
clock : IN std_ulogic ;
|
|
incPC : IN std_ulogic ;
|
|
instrAddress : IN unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
loadInstrAddress : IN std_ulogic ;
|
|
loadStoredPC : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
storedProgCounter : IN unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
progCounter : OUT unsigned ( programCounterBitNb-1 DOWNTO 0 )
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT scratchpad
|
|
GENERIC (
|
|
registerBitNb : positive := 8;
|
|
spadAddressBitNb : natural := 4
|
|
);
|
|
PORT (
|
|
addr : IN unsigned ( spadAddressBitNb-1 DOWNTO 0 );
|
|
clock : IN std_ulogic ;
|
|
dataIn : IN signed ( registerBitNb-1 DOWNTO 0 );
|
|
reset : IN std_ulogic ;
|
|
write : IN std_ulogic ;
|
|
dataOut : OUT signed ( registerBitNb-1 DOWNTO 0 )
|
|
);
|
|
END COMPONENT;
|
|
|
|
-- Optional embedded configurations
|
|
-- pragma synthesis_off
|
|
-- FOR ALL : aluAndRegs USE ENTITY NanoBlaze.aluAndRegs;
|
|
-- FOR ALL : branchStack USE ENTITY NanoBlaze.branchStack;
|
|
-- FOR ALL : controller USE ENTITY NanoBlaze.controller;
|
|
-- FOR ALL : instructionDecoder USE ENTITY NanoBlaze.instructionDecoder;
|
|
-- FOR ALL : programCounter USE ENTITY NanoBlaze.programCounter;
|
|
-- pragma synthesis_on
|
|
|
|
|
|
BEGIN
|
|
-- Architecture concurrent statements
|
|
-- HDL Embedded Text Block 1 eb1
|
|
dataAddress <= portInstrAddress when portIndexedSel = '0' else portRegAddress;
|
|
|
|
-- HDL Embedded Text Block 2 eb2
|
|
dataOut <= std_ulogic_vector(portOut);
|
|
portIn <= signed(dataIn);
|
|
|
|
-- HDL Embedded Text Block 3 eb3
|
|
spadAddress <= spadInstrAddress when spadIndexedSel = '0' else spadRegAddress;
|
|
|
|
-- HDL Embedded Text Block 4 eb4
|
|
-- pragma translate_off
|
|
|
|
process(instruction)
|
|
|
|
constant bitsPerHexDigit : positive := 4;
|
|
|
|
function pad(inString : string; outLength : positive) return string is
|
|
variable outString : string(1 to outLength);
|
|
begin
|
|
outString := (others => ' ');
|
|
outString(inString'range) := inString;
|
|
return outString;
|
|
end function pad;
|
|
|
|
function hexDigitNb(bitNb : positive) return positive is
|
|
begin
|
|
return (bitNb-1)/bitsPerHexDigit+1;
|
|
end function hexDigitNb;
|
|
|
|
function to01(nineValued : unsigned) return unsigned is
|
|
variable twoValued : unsigned(nineValued'range);
|
|
begin
|
|
twoValued := (others => '0');
|
|
for index in nineValued'range loop
|
|
if (nineValued(index) = '1') or (nineValued(index) = 'H') then
|
|
twoValued(index) := '1';
|
|
end if;
|
|
end loop;
|
|
return twoValued;
|
|
end function to01;
|
|
|
|
variable opCode : unsigned(1+opCodeBitNb-1 downto 0);
|
|
variable destRegister : unsigned(registerAddressBitNb-1 downto 0);
|
|
variable destRegisterString : string(1 to 1+hexDigitNb(registerAddressBitNb));
|
|
variable sourceRegister : unsigned(registerAddressBitNb-1 downto 0);
|
|
variable sourceRegisterString : string(1 to 1+hexDigitNb(registerAddressBitNb));
|
|
variable sourceConstant : unsigned(registerBitNb-1 downto 0);
|
|
variable sourceConstantString : string(1 to hexDigitNb(registerBitNb));
|
|
variable branchAddress : unsigned(programCounterBitNb-1 downto 0);
|
|
variable branchAddressString : string(1 to hexDigitNb(programCounterBitNb));
|
|
variable branchKind : unsigned(1 downto 0);
|
|
variable shRotCin : unsigned(2 downto 0);
|
|
variable shRotDir: std_ulogic;
|
|
|
|
function toHexDigit(binary : unsigned(bitsPerHexDigit-1 downto 0)) return character is
|
|
begin
|
|
if binary <= 9 then
|
|
return character'val(character'pos('0') + to_integer(to01(binary)));
|
|
else
|
|
return character'val(character'pos('A') + to_integer(to01(binary)) - 10);
|
|
end if;
|
|
end function toHexDigit;
|
|
|
|
function toHexString(binary : unsigned) return string is
|
|
variable hexString : string(1 to hexDigitNb(binary'length));
|
|
begin
|
|
for index in hexString'high-1 downto 0 loop
|
|
hexString(hexString'high-index) := toHexDigit(
|
|
resize(shift_right(binary, bitsPerHexDigit*index), bitsPerHexDigit)
|
|
);
|
|
end loop;
|
|
return hexString;
|
|
end function toHexString;
|
|
|
|
begin
|
|
|
|
opCode := resize(
|
|
shift_right(unsigned(instruction), instruction'length-opCode'length),
|
|
opCode'length
|
|
);
|
|
destRegister := resize(
|
|
shift_right(unsigned(instruction), instruction'length-opCode'length-destRegister'length),
|
|
destRegister'length
|
|
);
|
|
destRegisterString := 's' & toHexDigit(destRegister);
|
|
sourceRegister := resize(
|
|
shift_right(unsigned(instruction), instruction'length-opCode'length-destRegister'length-sourceRegister'length),
|
|
sourceRegister'length
|
|
);
|
|
sourceRegisterString := 's' & toHexDigit(sourceRegister);
|
|
sourceConstant := resize(unsigned(instruction), sourceConstant'length);
|
|
sourceConstantString := toHexString(sourceConstant);
|
|
branchKind := resize(
|
|
shift_right(unsigned(instruction), instruction'length-opCode'length-branchKind'length),
|
|
branchKind'length
|
|
);
|
|
branchAddress := resize(unsigned(instruction), branchAddress'length);
|
|
branchAddressString := toHexString(branchAddress);
|
|
shRotCin := resize(shift_right(unsigned(instruction), 1), shRotCin'length);
|
|
shRotDir := instruction(0);
|
|
|
|
case opCode is
|
|
when "000000" => instrString <= pad("LOAD " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "000001" => instrString <= pad("LOAD " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "000100" => instrString <= pad("INPUT " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "000101" => instrString <= pad("INPUT " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "000110" => instrString <= pad("FETCH " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "000111" => instrString <= pad("FETCH " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "001010" => instrString <= pad("AND " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "001011" => instrString <= pad("AND " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "001100" => instrString <= pad("OR " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "001101" => instrString <= pad("OR " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "001110" => instrString <= pad("XOR " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "001111" => instrString <= pad("XOR " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "010010" => instrString <= pad("TEST " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "010011" => instrString <= pad("TEST " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "010100" => instrString <= pad("COMP " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "010101" => instrString <= pad("COMP " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "011000" => instrString <= pad("ADD " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "011001" => instrString <= pad("ADD " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "011010" => instrString <= pad("ADDCY " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "011011" => instrString <= pad("ADDCY " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "011100" => instrString <= pad("SUB " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "011101" => instrString <= pad("SUB " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "011110" => instrString <= pad("SUBCY " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "011111" => instrString <= pad("SUBCY " & destRegisterString & " " & sourceRegisterString, instrString'length);
|
|
when "100000" =>
|
|
case shRotCin is
|
|
when "000" => instrString <= pad("SLA " & destRegisterString, instrString'length);
|
|
when "001" => instrString <= pad("RL " & destRegisterString, instrString'length);
|
|
when "010" => instrString <= pad("SLX " & destRegisterString, instrString'length);
|
|
when "011" =>
|
|
case shRotDir is
|
|
when '0' => instrString <= pad("SL0 " & destRegisterString, instrString'length);
|
|
when '1' => instrString <= pad("SL1 " & destRegisterString, instrString'length);
|
|
when others => instrString <= pad("--------", instrString'length);
|
|
end case;
|
|
when "100" => instrString <= pad("SRA " & destRegisterString, instrString'length);
|
|
when "101" => instrString <= pad("SRX " & destRegisterString, instrString'length);
|
|
when "110" => instrString <= pad("RR " & destRegisterString, instrString'length);
|
|
when "111" =>
|
|
case shRotDir is
|
|
when '0' => instrString <= pad("SR0 " & destRegisterString, instrString'length);
|
|
when '1' => instrString <= pad("SR1 " & destRegisterString, instrString'length);
|
|
when others => instrString <= pad("--------", instrString'length);
|
|
end case;
|
|
when others => instrString <= pad("--------", instrString'length);
|
|
end case;
|
|
when "101100" => instrString <= pad("OUTPUT " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "101101" => instrString <= pad("OUTPUT " & destRegisterString & " (" & sourceRegisterString & ")", instrString'length);
|
|
when "101110" => instrString <= pad("STORE " & destRegisterString & " " & sourceConstantString, instrString'length);
|
|
when "101111" => instrString <= pad("STORE " & destRegisterString & " (" & sourceRegisterString & ")", instrString'length);
|
|
when "101010" => instrString <= pad("RET", instrString'length);
|
|
when "101011" =>
|
|
case branchKind is
|
|
when "00" => instrString <= pad("RET Z", instrString'length);
|
|
when "01" => instrString <= pad("RET NZ", instrString'length);
|
|
when "10" => instrString <= pad("RET C", instrString'length);
|
|
when "11" => instrString <= pad("RET NC", instrString'length);
|
|
when others => instrString <= pad("--------", instrString'length);
|
|
end case;
|
|
when "110000" => instrString <= pad("CALL " & branchAddressString, instrString'length);
|
|
when "110001" =>
|
|
case branchKind is
|
|
when "00" => instrString <= pad("CALL Z " & branchAddressString, instrString'length);
|
|
when "01" => instrString <= pad("CALL NZ " & branchAddressString, instrString'length);
|
|
when "10" => instrString <= pad("CALL C " & branchAddressString, instrString'length);
|
|
when "11" => instrString <= pad("CALL NC " & branchAddressString, instrString'length);
|
|
when others => instrString <= pad("--------", instrString'length);
|
|
end case;
|
|
when "110100" => instrString <= pad("JUMP " & branchAddressString, instrString'length);
|
|
when "110101" =>
|
|
case branchKind is
|
|
when "00" => instrString <= pad("JUMP Z " & branchAddressString, instrString'length);
|
|
when "01" => instrString <= pad("JUMP NZ " & branchAddressString, instrString'length);
|
|
when "10" => instrString <= pad("JUMP C " & branchAddressString, instrString'length);
|
|
when "11" => instrString <= pad("JUMP NC " & branchAddressString, instrString'length);
|
|
when others => instrString <= pad("--------", instrString'length);
|
|
end case;
|
|
when others => instrString <= pad("--------", instrString'length);
|
|
end case;
|
|
|
|
end process;
|
|
|
|
-- pragma translate_on
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- Instance port mappings.
|
|
I_alu : aluAndRegs
|
|
GENERIC MAP (
|
|
registerBitNb => registerBitNb,
|
|
registerAddressBitNb => registerAddressBitNb,
|
|
aluCodeBitNb => aluCodeBitNb,
|
|
portAddressBitNb => addressBitNb,
|
|
scratchpadAddressBitNb => scratchpadAddressBitNb
|
|
)
|
|
PORT MAP (
|
|
addrA => addrA,
|
|
addrB => addrB,
|
|
aluCode => aluCode,
|
|
cIn => cIn,
|
|
clock => clock,
|
|
instrData => instrData,
|
|
instrDataSel => instrDataSel,
|
|
portIn => portIn,
|
|
portInSel => portInSel,
|
|
regWrite => regWrite,
|
|
registerFileSel => registerFileSel,
|
|
reset => reset,
|
|
scratchpadSel => scratchpadSel,
|
|
spadIn => spadIn,
|
|
cOut => cOut,
|
|
portAddr => portRegAddress,
|
|
portOut => portOut,
|
|
scratchpadAddr => spadRegAddress,
|
|
spadOut => spadOut,
|
|
zero => zero
|
|
);
|
|
I_BR : branchStack
|
|
GENERIC MAP (
|
|
programCounterBitNb => programCounterBitNb,
|
|
stackPointerBitNb => stackPointerBitNb
|
|
)
|
|
PORT MAP (
|
|
clock => clock,
|
|
prevPC => prevPC,
|
|
progCounter => progCounter_internal,
|
|
reset => reset,
|
|
storePC => storePC,
|
|
storedProgCounter => storedProgCounter
|
|
);
|
|
I_ctrl : controller
|
|
GENERIC MAP (
|
|
intCodeBitNb => 5,
|
|
branchCondBitNb => branchCondBitNb,
|
|
opCodeBitNb => opCodeBitNb
|
|
)
|
|
PORT MAP (
|
|
branchCond => branchCond,
|
|
cOut => cOut,
|
|
clock => clock,
|
|
en => en,
|
|
int => int,
|
|
intCode => intCode,
|
|
opCode => opCode,
|
|
reset => reset,
|
|
twoRegInstr => twoRegInstr,
|
|
zero => zero,
|
|
cIn => cIn,
|
|
incPC => incPC,
|
|
instrDataSel => instrDataSel,
|
|
intAck => intAck,
|
|
loadInstrAddress => loadInstrAddress,
|
|
loadStoredPC => loadStoredPC,
|
|
portInSel => portInSel,
|
|
prevPC => prevPC,
|
|
readStrobe => readStrobe,
|
|
regWrite => regWrite,
|
|
registerFileSel => registerFileSel,
|
|
scratchpadSel => scratchpadSel,
|
|
scratchpadWrite => scratchpadWrite,
|
|
storePC => storePC,
|
|
writeStrobe => writeStrobe
|
|
);
|
|
I_instr : instructionDecoder
|
|
GENERIC MAP (
|
|
registerBitNb => registerBitNb,
|
|
registerAddressBitNb => registerAddressBitNb,
|
|
aluCodeBitNb => aluCodeBitNb,
|
|
instructionBitNb => instructionBitNb,
|
|
programCounterBitNb => programCounterBitNb,
|
|
opCodeBitNb => opCodeBitNb,
|
|
branchCondBitNb => branchCondBitNb,
|
|
intCodeBitNb => 5,
|
|
spadAddressBitNb => scratchpadAddressBitNb,
|
|
portAddressBitNb => addressBitNb
|
|
)
|
|
PORT MAP (
|
|
instruction => instruction,
|
|
addrA => addrA,
|
|
addrB => addrB,
|
|
aluCode => aluCode,
|
|
branchCond => branchCond,
|
|
instrAddress => instrAddress,
|
|
instrData => instrData,
|
|
intCode => intCode,
|
|
opCode => opCode,
|
|
portAddress => portInstrAddress,
|
|
portIndexedSel => portIndexedSel,
|
|
spadAddress => spadInstrAddress,
|
|
spadIndexedSel => spadIndexedSel,
|
|
twoRegInstr => twoRegInstr
|
|
);
|
|
I_PC : programCounter
|
|
GENERIC MAP (
|
|
programCounterBitNb => programCounterBitNb
|
|
)
|
|
PORT MAP (
|
|
clock => clock,
|
|
incPC => incPC,
|
|
instrAddress => instrAddress,
|
|
loadInstrAddress => loadInstrAddress,
|
|
loadStoredPC => loadStoredPC,
|
|
reset => reset,
|
|
storedProgCounter => storedProgCounter,
|
|
progCounter => progCounter_internal
|
|
);
|
|
|
|
g_scratchpad: IF scratchpadAddressBitNb > 0 GENERATE
|
|
-- Optional embedded configurations
|
|
-- pragma synthesis_off
|
|
-- FOR ALL : scratchpad USE ENTITY NanoBlaze.scratchpad;
|
|
-- pragma synthesis_on
|
|
|
|
BEGIN
|
|
I_sPad : scratchpad
|
|
GENERIC MAP (
|
|
registerBitNb => registerBitNb,
|
|
spadAddressBitNb => scratchpadAddressBitNb
|
|
)
|
|
PORT MAP (
|
|
addr => spadAddress,
|
|
clock => clock,
|
|
dataIn => spadOut,
|
|
reset => reset,
|
|
write => scratchpadWrite,
|
|
dataOut => spadIn
|
|
);
|
|
END GENERATE g_scratchpad;
|
|
|
|
-- Implicit buffered output assignments
|
|
progCounter <= progCounter_internal;
|
|
|
|
END struct;
|
|
|
|
|
|
|
|
|
|
--
|
|
-- VHDL Architecture SystemOnChip.beamerSoc.struct
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 15:02:29 28.04.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.ALL;
|
|
-- LIBRARY AhbLite;
|
|
use work.ahbLite.all;
|
|
|
|
-- LIBRARY AhbLiteComponents;
|
|
-- LIBRARY NanoBlaze;
|
|
-- LIBRARY SystemOnChip;
|
|
|
|
ARCHITECTURE struct OF beamerSoc IS
|
|
|
|
-- Architecture declarations
|
|
constant programCounterBitNb: positive := 10;
|
|
constant instructionBitNb: positive := 26;
|
|
constant stackPointerBitNb: positive := 4;
|
|
constant registerAddressBitNb: positive := 4;
|
|
constant scratchpadAddressBitNb: natural := 0;
|
|
|
|
constant signalBitNb: positive := 16;
|
|
constant updatePeriodBitNb : positive := 16;
|
|
|
|
constant gpioIndex: positive := 1;
|
|
constant uartIndex: positive := gpioIndex+1;
|
|
constant beamerIndex: positive := uartIndex+1;
|
|
|
|
constant ahbMemoryLocation : ahbMemoryLocationVector := (
|
|
gpioIndex => (
|
|
baseAddress => 16#0000#,
|
|
addressMask => 16#10000# - 16#0002#
|
|
),
|
|
uartIndex => (
|
|
baseAddress => 16#0010#,
|
|
addressMask => 16#10000# - 16#0004#
|
|
),
|
|
beamerIndex => (
|
|
baseAddress => 16#0020#,
|
|
addressMask => 16#10000# - 16#0004#
|
|
),
|
|
others => (
|
|
baseAddress => 16#FFFF#,
|
|
addressMask => 16#0000#
|
|
)
|
|
);
|
|
|
|
-- Internal signal declarations
|
|
SIGNAL upEn : std_ulogic;
|
|
SIGNAL int : std_uLogic;
|
|
SIGNAL upAddress : unsigned(ahbAddressBitNb-1 DOWNTO 0);
|
|
SIGNAL upDataOut : std_ulogic_vector(ahbDataBitNb-1 DOWNTO 0);
|
|
SIGNAL upDataIn : std_ulogic_vector(ahbDataBitNb-1 DOWNTO 0);
|
|
SIGNAL upReadStrobe : std_uLogic;
|
|
SIGNAL upWriteStrobe : std_uLogic;
|
|
SIGNAL hAddr : unsigned(ahbAddressBitNb-1 DOWNTO 0);
|
|
SIGNAL hWData : std_ulogic_vector(ahbDataBitNb-1 DOWNTO 0);
|
|
SIGNAL hRData : std_ulogic_vector(ahbDataBitNb-1 DOWNTO 0);
|
|
SIGNAL hTrans : std_ulogic_vector(ahbTransBitNb-1 DOWNTO 0);
|
|
SIGNAL hSize : std_ulogic_vector(ahbSizeBitNb-1 DOWNTO 0);
|
|
SIGNAL hBurst : std_ulogic_vector(ahbBurstBitNb-1 DOWNTO 0);
|
|
SIGNAL hProt : std_ulogic_vector(ahbProtBitNb-1 DOWNTO 0);
|
|
SIGNAL hWrite : std_uLogic;
|
|
SIGNAL hReady : std_uLogic;
|
|
SIGNAL hMastLock : std_uLogic;
|
|
SIGNAL hResp : std_uLogic;
|
|
SIGNAL hClk : std_uLogic;
|
|
SIGNAL hReset_n : std_uLogic;
|
|
SIGNAL hSelV : std_ulogic_vector(1 TO ahbSlaveNb);
|
|
SIGNAL hRDataV : ahbDataVector;
|
|
SIGNAL hReadyV : std_logic_vector(1 TO ahbSlaveNb);
|
|
SIGNAL hRespV : std_logic_vector(1 TO ahbSlaveNb);
|
|
SIGNAL hSelGpio : std_uLogic;
|
|
SIGNAL hRespGpio : std_uLogic;
|
|
SIGNAL hReadyGpio : std_uLogic;
|
|
SIGNAL hRDataGpio : std_ulogic_vector(ahbDataBitNb-1 DOWNTO 0);
|
|
SIGNAL hRDataBeamer : std_ulogic_vector(ahbDataBitNb-1 DOWNTO 0);
|
|
SIGNAL hRDataUart : std_ulogic_vector(ahbDataBitNb-1 DOWNTO 0);
|
|
SIGNAL hSelBeamer : std_uLogic;
|
|
SIGNAL hSelUart : std_uLogic;
|
|
SIGNAL hRespUart : std_uLogic;
|
|
SIGNAL hRespBeamer : std_uLogic;
|
|
SIGNAL hReadyBeamer : std_uLogic;
|
|
SIGNAL hReadyUart : std_uLogic;
|
|
SIGNAL intAck : std_ulogic;
|
|
SIGNAL instruction : std_ulogic_vector(instructionBitNb-1 DOWNTO 0);
|
|
SIGNAL programCounter : unsigned(programCounterBitNb-1 DOWNTO 0);
|
|
|
|
|
|
-- Component Declarations
|
|
COMPONENT ahbDecoder
|
|
GENERIC (
|
|
ahbMemoryLocation : ahbMemoryLocationVector
|
|
);
|
|
PORT (
|
|
hAddr : IN unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
hSel : OUT std_ulogic_vector (1 TO ahbSlaveNb)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT ahbMasterInterface
|
|
PORT (
|
|
clock : IN std_ulogic ;
|
|
hRData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : IN std_uLogic ;
|
|
hResp : IN std_uLogic ;
|
|
pAddress : IN unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
pDataOut : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
pReadStrobe : IN std_uLogic ;
|
|
pWriteStrobe : IN std_uLogic ;
|
|
reset : IN std_ulogic ;
|
|
hAddr : OUT unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
hBurst : OUT std_ulogic_vector (ahbBurstBitNb-1 DOWNTO 0);
|
|
hClk : OUT std_uLogic ;
|
|
hMastLock : OUT std_uLogic ;
|
|
hProt : OUT std_ulogic_vector (ahbProtBitNb-1 DOWNTO 0);
|
|
hReset_n : OUT std_uLogic ;
|
|
hSize : OUT std_ulogic_vector (ahbSizeBitNb-1 DOWNTO 0);
|
|
hTrans : OUT std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hWrite : OUT std_uLogic ;
|
|
pDataIn : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT ahbMultiplexor
|
|
PORT (
|
|
hRDataV : IN ahbDataVector ;
|
|
hReadyV : IN std_logic_vector (1 TO ahbSlaveNb);
|
|
hRespV : IN std_logic_vector (1 TO ahbSlaveNb);
|
|
hSel : IN std_ulogic_vector ( 1 TO ahbSlaveNb );
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : OUT std_uLogic ;
|
|
hResp : OUT std_uLogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT ahbMuxConnector
|
|
GENERIC (
|
|
index : positive := 1
|
|
);
|
|
PORT (
|
|
hRData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : IN std_uLogic ;
|
|
hResp : IN std_uLogic ;
|
|
hSelV : IN std_ulogic_vector ( 1 TO ahbSlaveNb );
|
|
hRDataV : OUT ahbDataVector ;
|
|
hReadyV : OUT std_logic_vector (1 TO ahbSlaveNb);
|
|
hRespV : OUT std_logic_vector (1 TO ahbSlaveNb);
|
|
hSel : OUT std_uLogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT ahbGpio
|
|
GENERIC (
|
|
ioNb : positive := 8
|
|
);
|
|
PORT (
|
|
hAddr : IN unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
hClk : IN std_uLogic ;
|
|
hReset_n : IN std_uLogic ;
|
|
hSel : IN std_uLogic ;
|
|
hTrans : IN std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hWrite : IN std_uLogic ;
|
|
ioIn : IN std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : OUT std_uLogic ;
|
|
hResp : OUT std_uLogic ;
|
|
ioEn : OUT std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
ioOut : OUT std_ulogic_vector (ioNb-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT ahbUart
|
|
GENERIC (
|
|
txFifoDepth : positive := 8;
|
|
rxFifoDepth : positive := 1
|
|
);
|
|
PORT (
|
|
RxD : IN std_ulogic ;
|
|
hAddr : IN unsigned ( ahbAddressBitNb-1 DOWNTO 0 );
|
|
hClk : IN std_uLogic ;
|
|
hReset_n : IN std_uLogic ;
|
|
hSel : IN std_uLogic ;
|
|
hTrans : IN std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hWrite : IN std_uLogic ;
|
|
TxD : OUT std_ulogic ;
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hReady : OUT std_uLogic ;
|
|
hResp : OUT std_uLogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT nanoProcessor
|
|
GENERIC (
|
|
addressBitNb : positive := 8;
|
|
registerBitNb : positive := 8;
|
|
registerAddressBitNb : positive := 4;
|
|
programCounterBitNb : positive := 10;
|
|
stackPointerBitNb : positive := 5;
|
|
instructionBitNb : positive := 18;
|
|
scratchpadAddressBitNb : natural := 4
|
|
);
|
|
PORT (
|
|
clock : IN std_ulogic ;
|
|
dataIn : IN std_ulogic_vector (registerBitNb-1 DOWNTO 0);
|
|
en : IN std_ulogic ;
|
|
instruction : IN std_ulogic_vector (instructionBitNb-1 DOWNTO 0);
|
|
int : IN std_uLogic ;
|
|
reset : IN std_ulogic ;
|
|
dataAddress : OUT unsigned (addressBitNb-1 DOWNTO 0);
|
|
dataOut : OUT std_ulogic_vector (registerBitNb-1 DOWNTO 0);
|
|
intAck : OUT std_ulogic ;
|
|
progCounter : OUT unsigned ( programCounterBitNb-1 DOWNTO 0 );
|
|
readStrobe : OUT std_uLogic ;
|
|
writeStrobe : OUT std_uLogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT ahbBeamer
|
|
GENERIC (
|
|
patternAddressBitNb : positive := 9;
|
|
testOutBitNb : positive := 16
|
|
);
|
|
PORT (
|
|
outX : OUT std_ulogic ;
|
|
hAddr : IN unsigned (ahbAddressBitNb-1 DOWNTO 0);
|
|
outY : OUT std_ulogic ;
|
|
hWData : IN std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
selSinCos : IN std_ulogic ;
|
|
testOut : OUT std_ulogic_vector (1 TO testOutBitNb);
|
|
hRData : OUT std_ulogic_vector (ahbDataBitNb-1 DOWNTO 0);
|
|
hTrans : IN std_ulogic_vector (ahbTransBitNb-1 DOWNTO 0);
|
|
hWrite : IN std_ulogic ;
|
|
hSel : IN std_ulogic ;
|
|
hReady : OUT std_ulogic ;
|
|
hResp : OUT std_ulogic ;
|
|
hClk : IN std_ulogic ;
|
|
hReset_n : IN std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT programRom
|
|
GENERIC (
|
|
addressBitNb : positive := 8;
|
|
dataBitNb : positive := 8
|
|
);
|
|
PORT (
|
|
address : IN unsigned (addressBitNb-1 DOWNTO 0);
|
|
clock : IN std_ulogic ;
|
|
en : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
dataOut : OUT std_ulogic_vector ( dataBitNb-1 DOWNTO 0 )
|
|
);
|
|
END COMPONENT;
|
|
|
|
-- Optional embedded configurations
|
|
-- pragma synthesis_off
|
|
-- FOR ALL : ahbBeamer USE ENTITY SystemOnChip.ahbBeamer;
|
|
-- FOR ALL : ahbDecoder USE ENTITY AhbLite.ahbDecoder;
|
|
-- FOR ALL : ahbGpio USE ENTITY AhbLiteComponents.ahbGpio;
|
|
-- FOR ALL : ahbMasterInterface USE ENTITY AhbLite.ahbMasterInterface;
|
|
-- FOR ALL : ahbMultiplexor USE ENTITY AhbLite.ahbMultiplexor;
|
|
-- FOR ALL : ahbMuxConnector USE ENTITY AhbLite.ahbMuxConnector;
|
|
-- FOR ALL : ahbUart USE ENTITY AhbLiteComponents.ahbUart;
|
|
-- FOR ALL : nanoProcessor USE ENTITY NanoBlaze.nanoProcessor;
|
|
-- FOR ALL : programRom USE ENTITY SystemOnChip.programRom;
|
|
-- pragma synthesis_on
|
|
|
|
|
|
BEGIN
|
|
-- Architecture concurrent statements
|
|
-- HDL Embedded Text Block 1 eb1
|
|
upEn <= '1';
|
|
|
|
|
|
-- Instance port mappings.
|
|
I_dec : ahbDecoder
|
|
GENERIC MAP (
|
|
ahbMemoryLocation => ahbMemoryLocation
|
|
)
|
|
PORT MAP (
|
|
hAddr => hAddr,
|
|
hSel => hSelV
|
|
);
|
|
I_mst : ahbMasterInterface
|
|
PORT MAP (
|
|
clock => clock,
|
|
hRData => hRData,
|
|
hReady => hReady,
|
|
hResp => hResp,
|
|
pAddress => upAddress,
|
|
pDataOut => upDataOut,
|
|
pReadStrobe => upReadStrobe,
|
|
pWriteStrobe => upWriteStrobe,
|
|
reset => reset,
|
|
hAddr => hAddr,
|
|
hBurst => hBurst,
|
|
hClk => hClk,
|
|
hMastLock => hMastLock,
|
|
hProt => hProt,
|
|
hReset_n => hReset_n,
|
|
hSize => hSize,
|
|
hTrans => hTrans,
|
|
hWData => hWData,
|
|
hWrite => hWrite,
|
|
pDataIn => upDataIn
|
|
);
|
|
I_mux : ahbMultiplexor
|
|
PORT MAP (
|
|
hRDataV => hRDataV,
|
|
hReadyV => hReadyV,
|
|
hRespV => hRespV,
|
|
hSel => hSelV,
|
|
hRData => hRData,
|
|
hReady => hReady,
|
|
hResp => hResp
|
|
);
|
|
I_connBeam : ahbMuxConnector
|
|
GENERIC MAP (
|
|
index => beamerIndex
|
|
)
|
|
PORT MAP (
|
|
hRData => hRDataBeamer,
|
|
hReady => hReadyBeamer,
|
|
hResp => hRespBeamer,
|
|
hSelV => hSelV,
|
|
hRDataV => hRDataV,
|
|
hReadyV => hReadyV,
|
|
hRespV => hRespV,
|
|
hSel => hSelBeamer
|
|
);
|
|
I_connT : ahbMuxConnector
|
|
GENERIC MAP (
|
|
index => gpioIndex
|
|
)
|
|
PORT MAP (
|
|
hRData => hRDataGpio,
|
|
hReady => hReadyGpio,
|
|
hResp => hRespGpio,
|
|
hSelV => hSelV,
|
|
hRDataV => hRDataV,
|
|
hReadyV => hReadyV,
|
|
hRespV => hRespV,
|
|
hSel => hSelGpio
|
|
);
|
|
I_connUart : ahbMuxConnector
|
|
GENERIC MAP (
|
|
index => uartIndex
|
|
)
|
|
PORT MAP (
|
|
hRData => hRDataUart,
|
|
hReady => hReadyUart,
|
|
hResp => hRespUart,
|
|
hSelV => hSelV,
|
|
hRDataV => hRDataV,
|
|
hReadyV => hReadyV,
|
|
hRespV => hRespV,
|
|
hSel => hSelUart
|
|
);
|
|
I_GPIO : ahbGpio
|
|
GENERIC MAP (
|
|
ioNb => ioNb
|
|
)
|
|
PORT MAP (
|
|
hAddr => hAddr,
|
|
hClk => hClk,
|
|
hReset_n => hReset_n,
|
|
hSel => hSelGpio,
|
|
hTrans => hTrans,
|
|
hWData => hWData,
|
|
hWrite => hWrite,
|
|
ioIn => ioIn,
|
|
hRData => hRDataGpio,
|
|
hReady => hReadyGpio,
|
|
hResp => hRespGpio,
|
|
ioEn => ioEn,
|
|
ioOut => ioOut
|
|
);
|
|
I_UART : ahbUart
|
|
GENERIC MAP (
|
|
txFifoDepth => 8,
|
|
rxFifoDepth => 1
|
|
)
|
|
PORT MAP (
|
|
RxD => RxD,
|
|
hAddr => hAddr,
|
|
hClk => hClk,
|
|
hReset_n => hReset_n,
|
|
hSel => hSelUart,
|
|
hTrans => hTrans,
|
|
hWData => hWData,
|
|
hWrite => hWrite,
|
|
TxD => TxD,
|
|
hRData => hRDataUart,
|
|
hReady => hReadyUart,
|
|
hResp => hRespUart
|
|
);
|
|
I_up : nanoProcessor
|
|
GENERIC MAP (
|
|
addressBitNb => ahbAddressBitNb,
|
|
registerBitNb => ahbDataBitNb,
|
|
registerAddressBitNb => registerAddressBitNb,
|
|
programCounterBitNb => programCounterBitNb,
|
|
stackPointerBitNb => stackPointerBitNb,
|
|
instructionBitNb => instructionBitNb,
|
|
scratchpadAddressBitNb => scratchpadAddressBitNb
|
|
)
|
|
PORT MAP (
|
|
clock => clock,
|
|
dataIn => upDataIn,
|
|
en => upEn,
|
|
instruction => instruction,
|
|
int => int,
|
|
reset => reset,
|
|
dataAddress => upAddress,
|
|
dataOut => upDataOut,
|
|
intAck => intAck,
|
|
progCounter => programCounter,
|
|
readStrobe => upReadStrobe,
|
|
writeStrobe => upWriteStrobe
|
|
);
|
|
I_beamer : ahbBeamer
|
|
GENERIC MAP (
|
|
patternAddressBitNb => patternAddressBitNb,
|
|
testOutBitNb => testOutBitNb
|
|
)
|
|
PORT MAP (
|
|
outX => outX,
|
|
hAddr => hAddr,
|
|
outY => outY,
|
|
hWData => hWData,
|
|
selSinCos => selSinCos,
|
|
testOut => testOut,
|
|
hRData => hRDataBeamer,
|
|
hTrans => hTrans,
|
|
hWrite => hWrite,
|
|
hSel => hSelBeamer,
|
|
hReady => hReadyBeamer,
|
|
hResp => hRespBeamer,
|
|
hClk => hClk,
|
|
hReset_n => hReset_n
|
|
);
|
|
I_rom : programRom
|
|
GENERIC MAP (
|
|
addressBitNb => programCounterBitNb,
|
|
dataBitNb => instructionBitNb
|
|
)
|
|
PORT MAP (
|
|
address => programCounter,
|
|
clock => clock,
|
|
en => upEn,
|
|
reset => reset,
|
|
dataOut => instruction
|
|
);
|
|
|
|
END struct;
|
|
|
|
|
|
|
|
|
|
--
|
|
-- VHDL Architecture Board.SoC_ebs3.struct
|
|
--
|
|
-- Created:
|
|
-- by - axel.amand.UNKNOWN (WE7860)
|
|
-- at - 10:21:25 08.05.2023
|
|
--
|
|
-- Generated by Mentor Graphics' HDL Designer(TM) 2019.2 (Build 5)
|
|
--
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
-- LIBRARY Board;
|
|
-- LIBRARY Lattice;
|
|
-- LIBRARY SystemOnChip;
|
|
|
|
ARCHITECTURE struct OF SoC_ebs3 IS
|
|
|
|
-- Architecture declarations
|
|
constant ioNb: positive := 8;
|
|
constant testOutBitNb: positive := 16;
|
|
constant patternAddressBitNb: positive := 9;
|
|
|
|
-- Internal signal declarations
|
|
SIGNAL clk_sys : std_ulogic;
|
|
SIGNAL ioIn : std_ulogic_vector(ioNb-1 DOWNTO 0);
|
|
SIGNAL logic0 : std_ulogic;
|
|
SIGNAL logic1 : std_uLogic;
|
|
SIGNAL reset : std_ulogic;
|
|
SIGNAL resetSynch : std_ulogic;
|
|
SIGNAL resetSynch_N : std_ulogic;
|
|
SIGNAL rxdSynch : std_ulogic;
|
|
SIGNAL selSinCos : std_ulogic;
|
|
SIGNAL selSinCosSynch : std_ulogic;
|
|
SIGNAL testOut : std_ulogic_vector(1 TO testOutBitNb);
|
|
|
|
|
|
-- Component Declarations
|
|
COMPONENT DFF
|
|
PORT (
|
|
CLK : IN std_uLogic ;
|
|
CLR : IN std_uLogic ;
|
|
D : IN std_uLogic ;
|
|
Q : OUT std_uLogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT inverterIn
|
|
PORT (
|
|
in1 : IN std_uLogic ;
|
|
out1 : OUT std_uLogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT pll
|
|
PORT (
|
|
clkIn100M : IN std_ulogic ;
|
|
en75M : IN std_ulogic ;
|
|
en50M : IN std_ulogic ;
|
|
en10M : IN std_ulogic ;
|
|
clk60MHz : OUT std_ulogic ;
|
|
clk75MHz : OUT std_ulogic ;
|
|
clk50MHz : OUT std_ulogic ;
|
|
clk10MHz : OUT std_ulogic ;
|
|
pllLocked : OUT std_ulogic
|
|
);
|
|
END COMPONENT;
|
|
COMPONENT beamerSoc
|
|
GENERIC (
|
|
ioNb : positive := 8;
|
|
testOutBitNb : positive := 16;
|
|
patternAddressBitNb : positive := 9
|
|
);
|
|
PORT (
|
|
TxD : OUT std_ulogic ;
|
|
RxD : IN std_ulogic ;
|
|
outX : OUT std_ulogic ;
|
|
outY : OUT std_ulogic ;
|
|
selSinCos : IN std_ulogic ;
|
|
reset : IN std_ulogic ;
|
|
clock : IN std_ulogic ;
|
|
ioEn : OUT std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
ioOut : OUT std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
ioIn : IN std_ulogic_vector (ioNb-1 DOWNTO 0);
|
|
testOut : OUT std_ulogic_vector (1 TO testOutBitNb)
|
|
);
|
|
END COMPONENT;
|
|
|
|
-- Optional embedded configurations
|
|
-- pragma synthesis_off
|
|
-- FOR ALL : DFF USE ENTITY Board.DFF;
|
|
-- FOR ALL : beamerSoc USE ENTITY SystemOnChip.beamerSoc;
|
|
-- FOR ALL : inverterIn USE ENTITY Board.inverterIn;
|
|
-- FOR ALL : pll USE ENTITY Lattice.pll;
|
|
-- pragma synthesis_on
|
|
|
|
|
|
BEGIN
|
|
-- Architecture concurrent statements
|
|
-- HDL Embedded Text Block 3 eb3
|
|
LED1 <= testOut(1);
|
|
LED2 <= testOut(2);
|
|
spare(testOut'range) <= testOut;
|
|
spare(testOut'high+1 to spare'high) <= (others => '0');
|
|
|
|
-- HDL Embedded Text Block 4 eb4
|
|
logic1 <= '1';
|
|
|
|
-- HDL Embedded Text Block 5 eb5
|
|
logic0 <= '0';
|
|
|
|
|
|
-- Instance port mappings.
|
|
I8 : DFF
|
|
PORT MAP (
|
|
CLK => clk_sys,
|
|
CLR => resetSynch,
|
|
D => RxD,
|
|
Q => rxdSynch
|
|
);
|
|
I9 : DFF
|
|
PORT MAP (
|
|
CLK => clk_sys,
|
|
CLR => resetSynch,
|
|
D => selSinCos,
|
|
Q => selSinCosSynch
|
|
);
|
|
I12 : DFF
|
|
PORT MAP (
|
|
CLK => clock,
|
|
CLR => reset,
|
|
D => logic1,
|
|
Q => resetSynch_N
|
|
);
|
|
I2 : inverterIn
|
|
PORT MAP (
|
|
in1 => reset_N,
|
|
out1 => reset
|
|
);
|
|
I3 : inverterIn
|
|
PORT MAP (
|
|
in1 => resetSynch_N,
|
|
out1 => resetSynch
|
|
);
|
|
I7 : inverterIn
|
|
PORT MAP (
|
|
in1 => selSinCos_n,
|
|
out1 => selSinCos
|
|
);
|
|
I_pll : pll
|
|
PORT MAP (
|
|
clkIn100M => clock,
|
|
en75M => logic0,
|
|
en50M => logic0,
|
|
en10M => logic0,
|
|
clk60MHz => clk_sys,
|
|
clk75MHz => OPEN,
|
|
clk50MHz => OPEN,
|
|
clk10MHz => OPEN,
|
|
pllLocked => OPEN
|
|
);
|
|
I_top : beamerSoc
|
|
GENERIC MAP (
|
|
ioNb => ioNb,
|
|
testOutBitNb => testOutBitNb,
|
|
patternAddressBitNb => patternAddressBitNb
|
|
)
|
|
PORT MAP (
|
|
TxD => TxD,
|
|
RxD => rxdSynch,
|
|
outX => xOut,
|
|
outY => yOut,
|
|
selSinCos => selSinCosSynch,
|
|
reset => resetSynch,
|
|
clock => clk_sys,
|
|
ioEn => OPEN,
|
|
ioOut => OPEN,
|
|
ioIn => ioIn,
|
|
testOut => testOut
|
|
);
|
|
|
|
END struct;
|
|
|
|
|
|
|
|
|