a-styuf 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 (изменено) · Жалоба Предлагаю сделать тему для тех, у кого возникли вопросы при первом знакомстве с софт-микроконтролером 8051 на FPGA фирмы Actel. И вот первые вопросы: Как правильно подключить внутреннюю память FPGA для работы с данны микроконтролером? FPGA A3PE1500. Хочу просто попробовать сдлеать рабочий микроконтроллер для "помигать светодиодами" на отладочнике ProASIC3 STARTER KIT. В хэндбуке сказано, что существует 4 типа памяти, из которых две должен создавать я: XDATA и CODE. Внешней памяти на плате нет, так что хочу использовать память на чипе FPGA. Интересуют настройки ядра 8051s и конфигурация памяти. Если будут какие-нибудь дополнительные вопросы по моему проекту - все расскажу и покажу) Заранее спасибо! Что бы быть немного конкретней: в настройка 8051 я указал память без проверки по сигналу акноледж, выбрал two ports ram без pipe-line. Сколь тактов задержки я должен указать в настройках 8051-го? Изменено 1 апреля, 2013 пользователем styuf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doublekey 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 · Жалоба Делаю как-то так: module core8051 ( input clk, input cpu_nrst, MEM_if MEM_IF ); CORE8051S #( ... .STRETCH_VAL (1), // Number of wait cycles for data memory. .VARIABLE_STRETCH (0), // Use fixed number of cycles for data memory access. .VARIABLE_WAIT (0), // Use fixed number of cycles for program memory access. .WAIT_VAL (1), // Number of wait cycles for program memory .INTRAM_IMPLEMENTATION(0), // Use block RAM for internal RAM implementation. .FAMILY (15) // FPGA faily: ProASIC3. ) CPU_CORE ( ... .CLK (clk), .NSYSRESET(cpu_nrst), .PRESETN (), .WDOGRES (1'b0), .WDOGRESN (), .INT0 (1'b0), .INT1 (1'b0), .MOVX (), // Memory bus .MEMPSACKI(1'b1), .MEMACKI (1'b1), .MEMDATAI (MEM_IF.data), .MEMDATAO (), .MEMADDR (MEM_IF.addr), .MEMPSRD (), .MEMWR (), .MEMRD (), ); endmodule module rom ( input clk, // Clock input. ROM_if ROM_IF, // Programming interface for initialization. MEM_if MEM_IF // System data bus. ); import definitions::*; reg [ROM_DATA_WIDTH - 1:0] mem [ROM_DEPTH - 1:0]; // ROM. reg [ROM_ADDR_WIDTH - 1:0] addr_reg; // Read address register. assign MEM_IF.data = mem[addr_reg]; always_ff @(posedge clk) begin addr_reg <= MEM_IF.addr[ROM_ADDR_WIDTH - 1:0]; if (ROM_IF.we) mem[ROM_IF.addr] <= ROM_IF.data; end endmodule Соответственно, после включения питания специальный автомат грузит программу из внешней EEPROM (I2C/SPI) в эту память и потом снимает reset для ядра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 (изменено) · Жалоба Вот еще бы verilog понимать) В целом ясно, но есть вопросы: почему вы берете stretch и wait time по одному? Это получается у стандартных блоков памяти задержки от выставления адреса до появления данных 2 такта без галочки на pipe-line? Я вроде посимулировал память, что бы понять как роботают two ports ram блоки. Завтра на работе гляну результаты симуляции и сформулирую вопрос точнее. Изменено 1 апреля, 2013 пользователем styuf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doublekey 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 · Жалоба При работе с памятью программ один такт требуется, чтобы защёлкнуть выставленный ядром адрес в rom.addr_reg, плюс задержка на установление данных на выходе памяти ещё один такт, вроде бы так. Во всяком случае у меня с меньшим WAIT_VAL не работало на симуляторе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 2 апреля, 2013 Опубликовано 2 апреля, 2013 (изменено) · Жалоба А к вопросу симуляции 8051го: что нужно увидить при симуляции, что бы понять, что он работает? Прочитав хэндбук по 8051s я не осознал, что я должен увидить на выходе симуляции. Кроме генерации адресов команд и данных? Там написано, что поддерживается только BFM симуляция, на которой нельзя увидеть симуляции с реальным кодом в памяти. Что бы вы посоветовали для уверенности в работоспособности 8051го? И еще - зачем вообще создана галочка pipeline в настройках памяти? Это общий вопрос. Мне приходит в голову только то, что за счет дополнительного конвеера, можно увеличить частоту работы памяти. Но с другой стороны наличие уже двух тригеров на адресе и данных полностью исчерпывают возможности к дополнительному конвееру. Изменено 2 апреля, 2013 пользователем styuf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 2 апреля, 2013 Опубликовано 2 апреля, 2013 (изменено) · Жалоба Добрался я до написания софта. Вопрос такой: какой алгоритм создания .h файлов для различных блоков переферии, например таймера и т.п.? Генерятся ли они автоматически средой или нет? Изменено 2 апреля, 2013 пользователем styuf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 3 апреля, 2013 Опубликовано 3 апреля, 2013 (изменено) · Жалоба Что-бы не быть голословным распишу по порядку свои действия: 1) В Libero SOC я создал проект, включающий в себя ip-ядро 8051s (хэндбук - http://www.actel.com/products/ip/search/detail.aspx?id=648). К нему я прикрутил GPIO, APBCore, Timer, WatchDog. проект верхнего уровня получился такой: -- 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; После чего отсимулировал это дело, и посмотрел, что адрес для памяти инкрементируется. Что бы проверить, что память подключена нормально, решил написать простой проектик на с: #include "stdio.h" #include "header_8051_test.h" #include "SC_8051s_reg51.h" int main( void ) { while( 1 ) { GPIOOut = 0x1; } } Собрал его, и указал на сгенеренный .hex файл, как на файл инициализации CODE-памяти. Теперь постараюсь отсимулировать и посмотреть, идут ли данные из памяти в ядро. Осимулировал, но не произошло то, что я ожидал. Почему-то не загорелся светодиод. Подскажите, почему на симуляции APB шина никак не меняется? Изменено 3 апреля, 2013 пользователем styuf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 4 апреля, 2013 Опубликовано 4 апреля, 2013 · Жалоба :bb-offtopic: А на какой у вас частоте работает 8051? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 4 апреля, 2013 Опубликовано 4 апреля, 2013 · Жалоба 10 МГц, генерируемых PLL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 5 апреля, 2013 Опубликовано 5 апреля, 2013 (изменено) · Жалоба И новый вопрос)! Написал я програмку, запихал её в память CODE. Даже получилось отсимулировать в самой просто симуляции (еще до синтеза). 8051й, как ему и положено, начинает работать и, даже, выставлять правильные сигналы на APB шину (если кому интересно, могу показать результат симуляции). Но вот беда - на симуляциях уровнем выше (или ниже, смотря откуда смотреть :rolleyes: , имеется ввиду те, которые после синтеза или после размещения на кристалле) процессор вообще не подает признаков жизни. И вопрос такой: поддерживает ли Libero полноценную симуляцию процессора или нет? И может кто поделится простым проектом с IP-ядром 8051s, который точно работал. Был бы очень благодарен! Изменено 5 апреля, 2013 пользователем styuf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skv 0 8 апреля, 2013 Опубликовано 8 апреля, 2013 · Жалоба И новый вопрос)! Написал я програмку, запихал её в память CODE. Даже получилось отсимулировать в самой просто симуляции (еще до синтеза). 8051й, как ему и положено, начинает работать и, даже, выставлять правильные сигналы на APB шину (если кому интересно, могу показать результат симуляции). Но вот беда - на симуляциях уровнем выше (или ниже, смотря откуда смотреть :rolleyes: , имеется ввиду те, которые после синтеза или после размещения на кристалле) процессор вообще не подает признаков жизни. И вопрос такой: поддерживает ли Libero полноценную симуляцию процессора или нет? И может кто поделится простым проектом с IP-ядром 8051s, который точно работал. Был бы очень благодарен! Libero поддерживает симуляцию 51-го процессора. А зачем симулировать процессор? Собирать ядро микроконтроллера со стандартными контроллерами (IP 8051s, UART, Таймер, GPIO и т.д.) лучше в SmartDesigner. Проще и быстрее. Накидал модулей, бысренько соединил: 10-15 минут и готово. Затем уже перехожу к написанию своих модулей, добавляю модуль (верхнего уровня если проект получился иерархический) в схему процессорной части в SmartDesign и подключаю к АРВ шине. По опыту могу сказать что с конфигурацией собранной из стандартных модулей проблем не возникало ни разу. Смысла тестировать процессор нет. Для отладки своих модулей лучше использовать АРВ BFM. Я последнее время активно использую АРВ и АНВ BFM симуляцию для отладки своих модулей, подключенных на APB или АНВ шины. А более полную отладку и тестирование модуля делаю уже программно в SoftConsole в дебаггере ПО. Пишу тестовые программы и отлаживаю. На симуляции все не проверишь. Да и ресурсов много надо. Если будет время постараюсь к концу недели собрать тестовый проект с комментариями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 9 апреля, 2013 Опубликовано 9 апреля, 2013 (изменено) · Жалоба Libero поддерживает симуляцию 51-го процессора. А зачем симулировать процессор? Собирать ядро микроконтроллера со стандартными контроллерами (IP 8051s, UART, Таймер, GPIO и т.д.) лучше в SmartDesigner. Проще и быстрее. Накидал модулей, бысренько соединил: 10-15 минут и готово. Затем уже перехожу к написанию своих модулей, добавляю модуль (верхнего уровня если проект получился иерархический) в схему процессорной части в SmartDesign и подключаю к АРВ шине. По опыту могу сказать что с конфигурацией собранной из стандартных модулей проблем не возникало ни разу. Смысла тестировать процессор нет. Для отладки своих модулей лучше использовать АРВ BFM. Я последнее время активно использую АРВ и АНВ BFM симуляцию для отладки своих модулей, подключенных на APB или АНВ шины. А более полную отладку и тестирование модуля делаю уже программно в SoftConsole в дебаггере ПО. Пишу тестовые программы и отлаживаю. На симуляции все не проверишь. Да и ресурсов много надо. Если будет время постараюсь к концу недели собрать тестовый проект с комментариями. По первому пункту: Я понимаю, что в целом тестировать весь процессор смысла нет. Я скорее для себя разбираюсь, как он работает, смотрю на адреса и команды, что, надо сказать, добавляет понимания) Да и проблем со сборкой процессора я не избежал, так что симуляция в целом смысл для меня имела. И симуляцию в конце концов запустить получилось даже после раскладки элементов по кристаллу. А вот насчет правильности работы стандартных блоков, то тут я что-то недопонимаю. У меня сейчас собрана самоя простая конфигурация процессора (8051s, GPIO, APBcore, CODE-RAM, DATA-RAM), который на симуляции работает, а когда прошиваю в fpga, он не работает. Причем не работает нестабильно, как бы это странно не звучало. Я вывел часть шины адреса ны тестовые пины, и адрес как таковой генерится. Причем иногда генерится пачкой после reset-а, а иногда постоянно. Так что тут мне не ясно в чем проблема. Может частота высокая, может еще что-то. И если вы скините мне какой-нить рабочий проект, самый простой, то я буду очень благодарен! Изменено 9 апреля, 2013 пользователем styuf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 11 апреля, 2013 Опубликовано 11 апреля, 2013 · Жалоба Всем спасибо! Прошивка заработала, диодики замигали. Более или менее разобрался. У кого будут вопросы - поделюсь опытом) Всем спасибо! Прошивка заработала, диодики замигали. Более или менее разобрался. У кого будут вопросы - поделюсь опытом) Остался такой вопрос - как правильно организовать прошивку процессора? Что лучше использовать и возможна ли прошивка через стандартный jtag? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StarG 0 24 июня, 2013 Опубликовано 24 июня, 2013 · Жалоба Добрый день. Очень интересно, чем закончилась экзекуция ядра Core8051. Получили ли вы работающий проект? Если да, то не могли бы вы его здесь выложить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a-styuf 0 26 июня, 2013 Опубликовано 26 июня, 2013 · Жалоба Извините за задержку! Экзекуция прошла вполне успешно. В итоге даже запустил програмку, которая светила светодиодами и реагировала на кнопочки. На этом пришлось остановится, така надо было допиливать схему под ральную плату, а не играться с отладочником. Единственное, от чего мне не по душе - отсутствие на отладочнике энергонезависимой памяти. Как следствие прошивку приходилось заливать из под SoftConsole. Недоразабрался я с одним вопросом, непосредственно относящимся к предидущесу абзацу: почему, когда непосредственно инициализирую память в фпга перед прошивкой с помощью tools-ов либеро (то бишь в память программы я заливаю саму программу, сгенерированную компилятором), я не получаю работающей железки. Если кто-то пробовал так делать - дайте знать, буду очень благодарен. -- 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; test_out : out std_logic_vector(31 downto 0) ); end test_8051; architecture ARCH of test_8051 is ---SIGNAL--- signal clock_pll : std_logic := '0'; signal presetn, NSYSRESET : std_logic := '0'; signal int0, int1 : std_logic := '0'; ---APB-SIGNAL signal paddr : STD_LOGIC_VECTOR(23 downto 0):=(OTHERS =>'0'); signal prdata, pwdata, pwdatas : STD_LOGIC_VECTOR(31 downto 0):=(OTHERS =>'0'); signal penable, psel, pready, pslverr : STD_LOGIC; signal paddrs, paddrs0 : STD_LOGIC_VECTOR(23 downto 0):=(OTHERS =>'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):=(OTHERS =>'0'); ---GPIO--signal-- SIGNAL gpio_in, gpio_out : STD_LOGIC_VECTOR(31 downto 0):=(OTHERS =>'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):=(OTHERS =>'0'); signal memaddr : std_logic_vector(15 downto 0):=(OTHERS =>'0'); signal code_rd, data_rd : std_logic_vector(7 downto 0):=(OTHERS =>'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_OE : out std_logic_vector(31 downto 0); 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 DATA_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 => NSYSRESET, PRESETN => presetn, WDOGRES => '0', WDOGRESN => OPEN, INT0 => '0', INT1 => '0', 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') ); test_out(9 downto 0) <= MEMADDR(9 downto 0); NSYSRESET <= NOT resetn; 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_OE => OPEN, 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 ); test_out(17 downto 10) <= paddrs(7 downto 0); test_out(18) <= psels2; led_out(6 downto 0) <= gpio_out(6 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 => memdatao, RD => code_rd, WEN => dbgmempswr, REN => mempsrd, WADDR => memaddr(11 downto 0), RADDR => memaddr(11 downto 0), WCLK => clock_pll, RCLK => clock_pll, RESET => '1' ); test_out(19) <= mempsrd; test_out(27 downto 20) <= code_rd; DATA1_RAM_4096_8 : DATA_RAM_4096_8 port map ( WD => memdatao, RD => data_rd, WEN => memwr, REN => memrd, WADDR => memaddr(11 downto 0), RADDR => memaddr(11 downto 0), WCLK => clock_pll, RCLK => clock_pll, RESET => '1' ); pll_20MHz_0 : pll_20MHz port map ( POWERDOWN => '1', CLKA => clock40, LOCK => led_out(7), GLA => clock_pll ); mem_mux_0 : mem_mux port map ( Data0_port => data_rd, Data1_port => code_rd, Sel0 => mempsrd, Result => memdatai ); --- end ARCH; Это код топ-файла в моем проекте. Все подкомпоненты стандартные, сам я их не правил. Если будут вопросы - спрашивайте! Постараюсь ответить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться