Что-бы не быть голословным распишу по порядку свои действия:
1) В Libero SOC я создал проект, включающий в себя ip-ядро 8051s (хэндбук -
http://www.actel.com/products/ip/search/detail.aspx?id=648). К нему я прикрутил GPIO, APBCore, Timer, WatchDog. проект верхнего уровня получился такой:
CODE
-- test_8051.vhd
----------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity test_8051 is
PORT(
clock40 : in std_logic;
resetn : in std_logic;
led_out : out std_logic_vector(7 downto 0);
TCK : in std_logic;
TDI : in std_logic;
TMS : in std_logic;
TDO : out std_logic;
TRSTN : in std_logic
);
end test_8051;
architecture ARCH of test_8051 is
---SIGNAL---
signal clock_pll : std_logic := '0';
signal presetn : std_logic := '0';
signal int0, int1 : std_logic := '0';
---APB-SIGNAL
signal paddr : STD_LOGIC_VECTOR(23 downto 0);
signal prdata, pwdata, pwdatas : STD_LOGIC_VECTOR(31 downto 0);
signal penable, psel, pready, pslverr : STD_LOGIC;
signal paddrs, paddrs0 : STD_LOGIC_VECTOR(23 downto 0);
signal psels0, psels1, psels2, psels3, psels4, psels5, psels6, psels7, psels8, psels9, psels10, psels11, psels12, psels13, psels14, psels15 : STD_LOGIC;
signal pslverrs0, pslverrs1, pslverrs2, pslverrs3, pslverrs4, pslverrs5, pslverrs6, pslverrs7, pslverrs8, pslverrs9, pslverrs10, pslverrs11, pslverrs12, pslverrs13, pslverrs14, pslverrs15 : STD_LOGIC;
signal preadys0, preadys1, preadys2, preadys3, preadys4, preadys5, preadys6, preadys7, preadys8, preadys9, preadys10, preadys11, preadys12, preadys13, preadys14, preadys15 : STD_LOGIC;
SIGNAL pwrite, pwrites, penables: STD_LOGIC;
signal prdatas0, prdatas1, prdatas2, prdatas3, prdatas4, prdatas5, prdatas6, prdatas7, prdatas8, prdatas9, prdatas10, prdatas11, prdatas12,
prdatas13, prdatas14, prdatas15 : STD_LOGIC_VECTOR (31 downto 0);
---GPIO--signal--
SIGNAL gpio_in, gpio_out : STD_LOGIC_VECTOR(31 downto 0);
---watchdog-signal--
signal wdogres, wdogresn : STD_LOGIC;
---memory-signal---
signal dbgmempswr, mempsrd, memwr, memrd : STD_LOGIC;
signal memdatai, memdatao : std_logic_vector(7 downto 0);
signal memaddr : std_logic_vector(15 downto 0);
signal code_rd, data_rd : std_logic_vector(7 downto 0);
---
---COMPONENTS---
COMPONENT Core_8051 is
port(
CLK : in std_logic;
NSYSRESET : in std_logic;
PRESETN : out std_logic;
WDOGRES : in std_logic;
WDOGRESN : out std_logic;
INT0 : in std_logic;
INT1 : in std_logic;
MOVX : out std_logic;
---JTAG
TCK : in std_logic;
TMS : in std_logic;
TDI : in std_logic;
TDO : out std_logic;
TRSTN : in std_logic;
BREAKIN : in std_logic;
BREAKOUT : out std_logic;
TRIGOUT : out std_logic;
AUXOUT : out std_logic;
--- APB interface
PADDR : out std_logic_vector(11 downto 0);
PWDATA : out std_logic_vector(31 downto 0);
PRDATA : in std_logic_vector(31 downto 0);
PWRITE : out std_logic;
PENABLE : out std_logic;
PSEL : out std_logic;
PREADY : in std_logic;
PSLVERR : in std_logic;
---
DBGMEMPSWR : out std_logic; ---CODE memory write enable
MEMPSACKI : in std_logic; ---CODE acknowlege
MEMACKI : in std_logic; ---XDATA acknowlege
MEMPSRD : out std_logic; ---CODE memory read enable
MEMWR : out std_logic; ---XDATA memory write enable
MEMRD : out std_logic; ---XDATA memory read enable
MEMDATAI : in std_logic_vector(7 downto 0); ---CODE and XDATA memory input bus
MEMDATAO : out std_logic_vector(7 downto 0); ---CODE and XDATA memory output bus
MEMADDR : out std_logic_vector(15 downto 0);---CODE and XDATA memory address bus
MEMBANK : in std_logic_vector(3 downto 0)
);
end COMPONENT;
COMPONENT APBcore is
-- Port list
port(
-- Inputs
PADDR : in std_logic_vector(23 downto 0);
PENABLE : in std_logic;
PRDATAS0 : in std_logic_vector(31 downto 0);
PRDATAS1 : in std_logic_vector(31 downto 0);
PRDATAS10 : in std_logic_vector(31 downto 0);
PRDATAS11 : in std_logic_vector(31 downto 0);
PRDATAS12 : in std_logic_vector(31 downto 0);
PRDATAS13 : in std_logic_vector(31 downto 0);
PRDATAS14 : in std_logic_vector(31 downto 0);
PRDATAS15 : in std_logic_vector(31 downto 0);
PRDATAS2 : in std_logic_vector(31 downto 0);
PRDATAS3 : in std_logic_vector(31 downto 0);
PRDATAS4 : in std_logic_vector(31 downto 0);
PRDATAS5 : in std_logic_vector(31 downto 0);
PRDATAS6 : in std_logic_vector(31 downto 0);
PRDATAS7 : in std_logic_vector(31 downto 0);
PRDATAS8 : in std_logic_vector(31 downto 0);
PRDATAS9 : in std_logic_vector(31 downto 0);
PREADYS0 : in std_logic;
PREADYS1 : in std_logic;
PREADYS10 : in std_logic;
PREADYS11 : in std_logic;
PREADYS12 : in std_logic;
PREADYS13 : in std_logic;
PREADYS14 : in std_logic;
PREADYS15 : in std_logic;
PREADYS2 : in std_logic;
PREADYS3 : in std_logic;
PREADYS4 : in std_logic;
PREADYS5 : in std_logic;
PREADYS6 : in std_logic;
PREADYS7 : in std_logic;
PREADYS8 : in std_logic;
PREADYS9 : in std_logic;
PSEL : in std_logic;
PSLVERRS0 : in std_logic;
PSLVERRS1 : in std_logic;
PSLVERRS10 : in std_logic;
PSLVERRS11 : in std_logic;
PSLVERRS12 : in std_logic;
PSLVERRS13 : in std_logic;
PSLVERRS14 : in std_logic;
PSLVERRS15 : in std_logic;
PSLVERRS2 : in std_logic;
PSLVERRS3 : in std_logic;
PSLVERRS4 : in std_logic;
PSLVERRS5 : in std_logic;
PSLVERRS6 : in std_logic;
PSLVERRS7 : in std_logic;
PSLVERRS8 : in std_logic;
PSLVERRS9 : in std_logic;
PWDATA : in std_logic_vector(31 downto 0);
PWRITE : in std_logic;
-- Outputs
PADDRS : out std_logic_vector(23 downto 0);
PADDRS0 : out std_logic_vector(23 downto 0);
PENABLES : out std_logic;
PRDATA : out std_logic_vector(31 downto 0);
PREADY : out std_logic;
PSELS0 : out std_logic;
PSELS1 : out std_logic;
PSELS10 : out std_logic;
PSELS11 : out std_logic;
PSELS12 : out std_logic;
PSELS13 : out std_logic;
PSELS14 : out std_logic;
PSELS15 : out std_logic;
PSELS2 : out std_logic;
PSELS3 : out std_logic;
PSELS4 : out std_logic;
PSELS5 : out std_logic;
PSELS6 : out std_logic;
PSELS7 : out std_logic;
PSELS8 : out std_logic;
PSELS9 : out std_logic;
PSLVERR : out std_logic;
PWDATAS : out std_logic_vector(31 downto 0);
PWRITES : out std_logic
);
end COMPONENT;
COMPONENT WatchDog is
-- Port list
port(
-- Inputs
PADDR : in std_logic_vector(4 downto 2);
PCLK : in std_logic;
PENABLE : in std_logic;
PRESETn : in std_logic;
PSEL : in std_logic;
PWDATA : in std_logic_vector(31 downto 0);
PWRITE : in std_logic;
WDOGRESn : in std_logic;
-- Outputs
PRDATA : out std_logic_vector(31 downto 0);
WDOGRES : out std_logic
);
end COMPONENT;
COMPONENT GPIO is
-- Port list
port(
-- Inputs
GPIO_IN : in std_logic_vector(31 downto 0);
PADDR : in std_logic_vector(7 downto 0);
PCLK : in std_logic;
PENABLE : in std_logic;
PRESETN : in std_logic;
PSEL : in std_logic;
PWDATA : in std_logic_vector(31 downto 0);
PWRITE : in std_logic;
-- Outputs
GPIO_OUT : out std_logic_vector(31 downto 0);
INT : out std_logic_vector(31 downto 0);
PRDATA : out std_logic_vector(31 downto 0);
PREADY : out std_logic;
PSLVERR : out std_logic
);
end COMPONENT;
COMPONENT Timer is
-- Port list
port(
-- Inputs
PADDR : in std_logic_vector(4 downto 2);
PCLK : in std_logic;
PENABLE : in std_logic;
PRESETn : in std_logic;
PSEL : in std_logic;
PWDATA : in std_logic_vector(31 downto 0);
PWRITE : in std_logic;
-- Outputs
PRDATA : out std_logic_vector(31 downto 0);
TIMINT : out std_logic
);
end COMPONENT;
COMPONENT RAM_4096_8 is
port( WD : in std_logic_vector(7 downto 0);
RD : out std_logic_vector(7 downto 0);
WEN : in std_logic;
REN : in std_logic;
WADDR : in std_logic_vector(11 downto 0);
RADDR : in std_logic_vector(11 downto 0);
WCLK : in std_logic;
RCLK : in std_logic;
RESET : in std_logic
);
end COMPONENT;
COMPONENT pll_20MHz is
port( POWERDOWN : in std_logic;
CLKA : in std_logic;
LOCK : out std_logic;
GLA : out std_logic
);
end COMPONENT;
COMPONENT mem_mux is
port( Data0_port : in std_logic_vector(7 downto 0);
Data1_port : in std_logic_vector(7 downto 0);
Sel0 : in std_logic;
Result : out std_logic_vector(7 downto 0)
);
end COMPONENT;
---
begin
---DECLARATION-COMPONENT----------------------------------------------------------------------------------------------------
Core_8051_0 : Core_8051
port map(
CLK => clock_pll,
NSYSRESET => resetn,
PRESETN => presetn,
WDOGRES => wdogres,
WDOGRESN => wdogresn,
INT0 => int0,
INT1 => int1,
MOVX => OPEN,
---JTAG
TCK => TCK,
TMS => TMS,
TDI => TDI,
TDO => TDO,
TRSTN => TRSTN,
BREAKIN => '0',
BREAKOUT => OPEN,
TRIGOUT => OPEN,
AUXOUT => OPEN,
--- APB MASTER interface
PADDR => paddr(11 downto 0),
PWDATA => pwdata,
PRDATA => prdata,
PWRITE => pwrite,
PENABLE => penable,
PSEL => psel,
PREADY => pready,
PSLVERR => pslverr,
---
DBGMEMPSWR => dbgmempswr, ---CODE memory write enable
MEMPSACKI => '1', ---CODE acknowlege
MEMACKI => '1', ---XDATA acknowlege
MEMPSRD => mempsrd, ---CODE memory read enable
MEMWR => memwr, ---XDATA memory write enable
MEMRD => memrd, ---XDATA memory read enable
MEMDATAI => memdatai, ---CODE and XDATA memory input bus
MEMDATAO => memdatao, ---CODE and XDATA memory output bus
MEMADDR => memaddr,---CODE and XDATA memory address bus
MEMBANK => (OTHERS => '0')
);
APBcore_0 : APBcore
port map(
--Master
--in
PADDR => paddr,
PENABLE => penable,
PWDATA => pwdata,
PWRITE => pwrite,
PSEL => psel,
--out
PRDATA => prdata,
PSLVERR => pslverr,
PREADY => pready,
--Slave
-- Inputs
PRDATAS0 => prdatas0,
PRDATAS1 => prdatas1,
PRDATAS10 => prdatas10,
PRDATAS11 => prdatas11,
PRDATAS12 => prdatas12,
PRDATAS13 => prdatas13,
PRDATAS14 => prdatas14,
PRDATAS15 => prdatas15,
PRDATAS2 => prdatas2,
PRDATAS3 => prdatas3,
PRDATAS4 => prdatas4,
PRDATAS5 => prdatas5,
PRDATAS6 => prdatas6,
PRDATAS7 => prdatas7,
PRDATAS8 => prdatas8,
PRDATAS9 => prdatas9,
PREADYS0 => preadys0,
PREADYS1 => preadys1,
PREADYS10 => preadys10,
PREADYS11 => preadys11,
PREADYS12 => preadys12,
PREADYS13 => preadys13,
PREADYS14 => preadys14,
PREADYS15 => preadys15,
PREADYS2 => preadys2,
PREADYS3 => preadys3,
PREADYS4 => preadys4,
PREADYS5 => preadys5,
PREADYS6 => preadys6,
PREADYS7 => preadys7,
PREADYS8 => preadys8,
PREADYS9 => preadys9,
PSLVERRS0 => pslverrs0,
PSLVERRS1 => pslverrs1,
PSLVERRS10 => pslverrs10,
PSLVERRS11 => pslverrs11,
PSLVERRS12 => pslverrs12,
PSLVERRS13 => pslverrs13,
PSLVERRS14 => pslverrs14,
PSLVERRS15 => pslverrs15,
PSLVERRS2 => pslverrs2,
PSLVERRS3 => pslverrs3,
PSLVERRS4 => pslverrs4,
PSLVERRS5 => pslverrs5,
PSLVERRS6 => pslverrs6,
PSLVERRS7 => pslverrs7,
PSLVERRS8 => pslverrs8,
PSLVERRS9 => pslverrs9,
-- Outputs
PADDRS => paddrs,
PADDRS0 => paddrs0,
PENABLES => penables,
PSELS0 => psels0,
PSELS1 => psels1,
PSELS10 => psels10,
PSELS11 => psels11,
PSELS12 => psels12,
PSELS13 => psels13,
PSELS14 => psels14,
PSELS15 => psels15,
PSELS2 => psels2,
PSELS3 => psels3,
PSELS4 => psels4,
PSELS5 => psels5,
PSELS6 => psels6,
PSELS7 => psels7,
PSELS8 => psels8,
PSELS9 => psels9,
PWDATAS => pwdatas,
PWRITES => pwrites
);
WatchDog_0 : WatchDog
port map(
-- Inputs
PCLK => clock_pll,
WDOGRESn => wdogresn,
PRESETn => presetn,
WDOGRES => wdogres,
--APB
PADDR => paddrs(4 downto 2),
PENABLE => penables,
PRDATA => prdatas14,
PSEL => psels14,
PWDATA => pwdatas,
PWRITE => pwrites
);
GPIO_0 : GPIO
port map(
-- Inputs
GPIO_IN => gpio_in,
PCLK => clock_pll,
-- Outputs
GPIO_OUT => gpio_out,
INT => OPEN,
PRESETN => presetn,
--APB
PADDR => paddrs(7 downto 0),
PENABLE => penables,
PSEL => psels2,
PWDATA => pwdatas,
PWRITE => pwrites,
PRDATA => prdatas2,
PREADY => preadys2,
PSLVERR => pslverrs2
);
led_out <= gpio_out(7 downto 0);
Timer_0 : Timer
port map(
-- Inputs
PCLK => clock_pll,
PRESETn => presetn,
-- Outputs
TIMINT => int0,
--APB
PENABLE => penables,
PADDR => paddrs(4 downto 2),
PRDATA => prdatas0,
PSEL => psels0,
PWDATA => pwdatas,
PWRITE => pwrites
);
CODE_RAM_4096_8 : RAM_4096_8
port map
( WD => memdatai,
RD => code_rd,
WEN => dbgmempswr,
REN => mempsrd,
WADDR => memaddr(11 downto 0),
RADDR => memaddr(11 downto 0),
WCLK => clock_pll,
RCLK => clock_pll,
RESET => presetn
);
DATA_RAM_4096_8 : RAM_4096_8
port map
( WD => memdatai,
RD => data_rd,
WEN => memwr,
REN => memrd,
WADDR => memaddr(11 downto 0),
RADDR => memaddr(11 downto 0),
WCLK => clock_pll,
RCLK => clock_pll,
RESET => presetn
);
pll_20MHz_0 : pll_20MHz
port map
( POWERDOWN => '1',
CLKA => clock40,
LOCK => OPEN,
GLA => clock_pll
);
mem_mux_0 : mem_mux
port map
( Data0_port => code_rd,
Data1_port => data_rd,
Sel0 => memrd,
Result => memdatao
);
---
end ARCH;
После чего отсимулировал это дело, и посмотрел, что адрес для памяти инкрементируется. Что бы проверить, что память подключена нормально, решил написать простой проектик на с:
CODE
#include "stdio.h"
#include "header_8051_test.h"
#include "SC_8051s_reg51.h"
int main( void )
{
while( 1 )
{
GPIOOut = 0x1;
}
}
Собрал его, и указал на сгенеренный .hex файл, как на файл инициализации CODE-памяти.
Теперь постараюсь отсимулировать и посмотреть, идут ли данные из памяти в ядро.
Осимулировал, но не произошло то, что я ожидал. Почему-то не загорелся светодиод.
Нажмите для просмотра прикрепленного файлаПодскажите, почему на симуляции APB шина никак не меняется?