Проектиране и имплементация върху електрически конфигурируеми (програмируеми) fpga чипове на системи с програмно управление



Дата23.12.2016
Размер98.94 Kb.
#11450

Системи с Програмируема Логика Лекция No 12, 2012

Проектиране и имплементация върху електрически конфигурируеми (програмируеми) FPGA - чипове на системи с програмно управление (процесорни системи)
По повод на това, дали читателите все пак са харесали тези лекции:

На купон един от гостите казва на дамата до него:

- Гледам те и се чудя... да пия ли още, или вече ми харесваш достатъчно?

Процесорите(процесорните ядра) са основни устройства в структурата на системите с програмно управление, защото те всъщност изпълняват програмите. В този смисъл една система с програмно управление, реализирана върху чип - PSoC (Programmable System on Chip) съдържа поне един, а напоследък и повече процесори (процесорни ядра). На Фиг.1 е показана структурата на Система върху Чип с програмно управление, с възможности да бъде използвана в областите на обработка на сигнали, обработка на изображения, жични и безжични комуникации. Процесорът на системата е един и е означен с името System CPU (Central Processing Unit). Архитектурата на системата е изградена на базата на обща шина ( на фигурата с име System BUS) – тоест, между процесора и останалите устройства на системата данни и управляваща информация (включително и кодовете на инструкциите от програмата) се предават по общата шина.




Фигура 1

Тъй като съвременните чипове се произвеждат с все по-голяма степен на интеграция, възможностите за имплементиране върху тях на повече от едно процесорни ядра нарастват.

Смисълът на включването на повече процесорни ядра е в това, че повече програми биха могли да се изпълняват паралелно от чипа и с това производителността на системата нараства – ако е с много повече ядра, това нарастване би могло да бъде значително. На следващата, Фиг.2 е показана схема на система върху чип, притежаваща 6 процесорни ядра, свързани в система отново с помощта на обща шина:


Фигура 2
Електрически конфигурируемите (FPGA) чипове от някои фамилии съдържат в структурата си хардуерно реализирани процесорни ядра. На следващата, Фиг.3 е показан топологичен чертеж на FPGA - чип от фамилията Vertex – II Pro с хардуерно реализиран в него 32 – битов процесор (процесорно ядро) Power PC.



Фигура 3
Повечето FPGA – чипове, обаче, не притежават такива хардуерно реализирани процесорни ядра, а върху техните настройваеми блокове могат да бъдат конфигурирани с помощта на развойна система процесорни ядра, наричани софт – процесорни ядра (soft – processor cores). Софт – процесорните ядра са описани най-често текстово (използва се някакъв език за описание на хардуер).
На следващата, Фиг.4 е показана блокова схема, представяща архитектурата на едно просто, 8 – битово софт – процесорно ядро с име KCPSM3. То може да бъде класифицирано като елементарен RISC – процесор:


Фигура 4

Системата инструкции на процесора е представена по-долу:



Следващата диаграма показва начинa на изпълнение във времето и синхронизирането на последователност от инструкциите на процесора, образуващи някаква програма:




Основни блокове (компоненти) на система с програмно управление върху чип са процесорът (процесорно ядро ) и програмната памет, показани на общата блокова схема на Фиг.5



Фигура 5

Следващата, Фиг.6 показва пример за деклариране и включване във VHDL - архитектура, описваща процесорна система върху чип на компонент (блок), представящ процесор (процесорно ядро):





Фигура 6

Ще припомним от предни лекции, че декларацията на компонента (в случая софтпроцесорно ядро) трябва да бъде в декларативната част на VHDL - архитектурата, описваща процесорната система върху чип. Включването на този компонент трябва да бъде поставено в блока на VHDL - архитектурата.


Следващият пример, на Фиг.7, е за деклариране и включване във VHDL - архитектура на компонент, представящ блок с програмна памет, необходим за съхраняване на програмата на процесорното ядро:



Фигура 7
Разбира се, за да функционира пълноценно системата върху чип, необходимо е в списъка от source - модули на проекта да бъде включен и модул, описващ съдържанието на тази програмна памет – всъщност машинният код на програмата, записан в този блок памет. На практика този модул се създава от използвания при проектирането транслатор, четящ от езиково описание на програмата и транслиращ в машинен код програмата за процесорното ядро. Като входни езици най-често се използват С или асемблерен език. По-долу в тази лекция са представени примери на проста програма на асемблерен език и на генерирани за нея модули от транслатор в проект за създаване на процесорна система върху чип.
Графично представена имплементация само на процесорно ядро KCPSM3 (PicoBlaze) и програмна памет върху FPGA – чип (от фамилия Spartan3 на Xilinx) е показана на Фиг.8


Фигура 8

По-долу, на Фиг.9 е показана блокова схема на примерна двупроцесорна (двуядрена) система, използваща процесорно ядро KCPSM3 (PicoBlaze), имплементирана върху FPGA - чип.


Системата включва отделни блокове програмна памет за всеки от процесорите с цел паралелно изпълняване на програмите им. Общата памет за данни е четирипортова, за да не възникват конфликти при едновременни операции по запис и четене, изпълнявани от двете процесорни ядра. Очевидно показаната по-долу процесорна система е с архитектура с обща памет.


Фигура 9
Следва списъкът от VHDL – модулите в проект за развойна среда WebPack, описващи общата блокова структура и структурата и поведението на блоковете, съставящи двуядрената система:

На Фиг.10 е показан графичен вид на имплементацията на двуядрената система върху FPGA - чип Spartan3e500:




Фигура 10

1 – два DCM модула (блокове на чипа за управление на тактовите сигнали), които се използват при проектирането на двете четирипортови памети за данни;

2 – блокове RAM на чипа, използвани за имплементация на паметта за данни на системата;

3 – контролер за достъп до обща шина

4 – процесорно ядро2

5 – процесорно ядро1

Следва диаграмата на входните и изходни файлове за транслатор , генериращ машинен код от входен текст на програма на асемблерен език за софтпроцесорно ядро:



По-долу е представен текстът на проста програма на асемблерен език за процесорно ядро KCPSM3; програмата се изследва и изпълнява върху разwойна платка с FPGA – чип:
;Core2 program for Double_core_system

;

;



CONSTANT waveform_port, 02 ;address of outport for light diodes indication

;

CONSTANT pattern_10101010, AA



;

start: LOAD s3, pattern_10101010

;

drive_wave: OUTPUT s3, waveform_port



XOR s3, FF ;toggle waveform

JUMP drive_wave

Програмата, изпълнявана на едно от процесорните ядра, управлява редичката от светодиоди (LED row) на развойната платка с FPGA – чип, върху който е имплементирана двуядрената система (Фиг.11):


Фигура 11
Листингът от програмата, генериран от транслатора от асемблерен език, изглежда така:

Както и по-горе бе изтъкнато, основният резултат от работата на транслатора е файл (модул за проекта) с VHDL – текст, описващ цифрово устройство - блок памет със съдържание: машинните кодове на програмата. Част от този файл е показан по-долу:

--

-- Definition of a single port ROM for KCPSM3 program defined by procore2.psm



--

-- Generated by KCPSM3 Assembler 20Jun2012-00:24:23.

--

library IEEE;



use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

--


library unisim;

use unisim.vcomponents.all;

--

--

entity procore2 is



Port (address : in std_logic_vector(9 downto 0);

instruction : out std_logic_vector(17 downto 0);

clk : in std_logic);

end procore2;

--

architecture low_level_definition of procore2 is



attribute INIT_00 : string;

attribute INIT_01 : string;

attribute INIT_02 : string;

---------------------------------------

--

-- Attributes to define ROM contents during implementation synthesis.



--

attribute INIT_00 of ram_1024_x_18 : label is "0000000000000000000000000000000000000000000000004001E3FFC30203AA";

attribute INIT_01 of ram_1024_x_18 : label is "0000000000000000000000000000000000000000000000000000000000000000";

attribute INIT_02 of ram_1024_x_18 : label is "0000000000000000000000000000000000000000000000000000000000000000";

----------
Времедиаграми от симулация на изпълнението на програмата са изобразени на Фиг.12. Може да се види последователността от машинните кодове на изпълняваните една след друга инструкции и адресите, от които процесорното ядро ги извлича от програмната памет. Тези кодове и адреси съвпадат с показаните по-горе в листинга на програмата.

Фигура 12

Изпълнявайки програмите си, процесорните ядра под управлението на съответни инструкции трябва да могат да четат и записват данни в останaлите блокове на системата, като за тази цел се използват входни за тях и изходни за тях регистри (често наричани портове) от структурата на системата.

По-долу, на Фиг.13 е показана блокова схема с регистри (портове) за изходни данни от процесорно ядро на процесорна система и примери за програмно управление на извеждането на данни. Процесорното ядро, в резултат на изпълнението на инструкция OUTPUT от програмата, извежда данните на изхода си за данни (OUT_PORT) , а адреса на изходния порт, в който трябва да бъдат записани тези данни – на адресния изход PORT_ID

За управление на записването на данните и определяне на това, в кой от изходните регистри ще се запишат тези данни, се включва в структурата на системата и се използва дешифратор на адресите на процесорното ядро. Той декодира адресите от адресния изход PORT_ID на процесора:





Фигура 13
Най-удобно е дешифраторът да се опише поведенчески (чрез процес) в архитектурата на главния source- модул на проекта, представящ структурата на процесорната система.

Например за описаната по-горе двуядрена система са необходими показаните на Фиг.14 регистри (изходни за едното ядро портове) за предаване на данни и адреси от процесорно ядро Core1 към паметта за данни four-port RAM с изходните портове DIN1, RADDR1, WADDR1:





Фигура 14

Функционирането на дешифраторите, управляващи записването на данни от изхода на процесора out_port1 в регистрите за данни и адреси към паметта, се описва със следния VHDL - процес:

C1outps_forFPBloRAM: process(clk)

begin


if clk'event and clk='1' then

if write_strobe1='1' then

if port_id1 = x"71" then

DIN1 <= out_port1;

end if;

if port_id1 = x"72" then



WADDR1(13 downto 8) <= out_port1(5 downto 0);

end if;


if port_id1 = x"73" then

WADDR1(7 downto 0) <= out_port1;

end if;

if port_id1 = x"74" then



RADDR1(13 downto 8) <= out_port1(5 downto 0);

end if;


if port_id1 = x"75" then

RADDR1(7 downto 0) <= out_port1;

end if;

end if;


end if;

end process;


Прочитайки горния текст, развойната среда ще синтезира необходимите дешифратори между процесорното ядро и паметта за данни в структурата на двуядрената система.
Четенето на входни данни от процесорно ядро в структурата на реална процесорна система най-често изисква избор от повече от един източници (регистри, наричани входни портове за ядрото). Този избор се осъществява чрез мултиплексори, управлявани от адрес за входен порт, от който порт трябва да се чете в момента. Адресът е генериран от процесора под управлението на съответна инструкция (с име INPUT) за четене от входен порт, която процесорът изпълнява в момента. Блокова схема с регистри за входни данни за процесорна система и примери за програмно управление на четенето на данни чрез инструкции INPUT е показана по-долу, на Фиг.15:



Фигура 15

Процесът, показан по-долу, описва фунционирането на мултиплексерите на входа за данни (с име in_port1) на процесорно ядро Core1 на двуядрената система. Управлението на тези мултиплексери се извършва от адресите, генерирани от адрото на адресния му изход port_id1 под управление на съответните инструкции INPUT от програмата за Core1.


----------------------------------------------------------------------------------------------------

-- core1 input ports for read from SpeedCache, FPortBloRAM and Bus

-- core1 addresses -> x"80" (read DATA from SpeedCache)

-- -> x"76" (read DATA from FPortRAM)

-- -> x"64" (read DATA from Bus)

--------------------------------------------------------------------------------------------------

input_nets1: process(clk)

begin


if clk'event and clk='1' then

if port_id1(7) = '1' then

in_port1 <= DOUT1;

elsif port_id1 =x"76" then

in_port1 <= DOUT1BloRAM;

elsif port_id1 =x"64" then

in_port1 <= Core1BusInput;

end if;


end if;

end process;


Четейки този текст, развойната среда ще синтезира в структурата на процесорната система съответните управляващи мултиплексери между входните портове (DOUT1, DOUTBloRAM, Core1BusInput) и входа за данни на процесорното ядро in_port1.

Процесорните системи върху чип, особено когато фунционират като вградени системи (embedded systems – вградени в обектите, които управляват или от които извличат информация), често трябва да обработват входни за тях сигнали в реално време. Тогава те трябва да могат да реагират на промените на входните за тях сигнали, което често се реализира чрез механизма на прекъсванията – входни сигнали да могат да прекъсват изпълняването на програмите на процесорните ядра и да стартират други програми, чрез които системата реагира, “обработва” тези прекъсвания. Блокови схеми на подсистеми за прекъсване в процесорни системи с ядрото KCPSM3 са показани по-долу, на Фиг.16:






Фигура 16

Втората схема е с контролер на прекъсванията, който може да приема прекъсвания от повече от един сигнали (входове за прекъсване), като при едновременно активирани повече от един сигнали в един момент, решава по кой от сигналите да осъществи прекъсване, като запомни и подаде по-късно към процесорното ядро и останалите сигнали за прекъсване.


Двуядрената система върху чип, давана за пример в тази лекция (Фиг.9), приема прекъсване за процесорно ядро Core2 при завъртане на ротационния превключвател на развойната платка (показана по-горе). Освен това, контролерите за прекъсване, включени в структурата на системата, дават възможност на всяко от ядрата да генерира сигнал за прекъсване към другото ядро, ако трябва да го извести, че ще му предаде съобщение чрез общата памет за данни.

Примерна фонова програма и програма, обработваща прекъсване за процесорна система:




Времедиаграми на сигналите, участващи в процеса на прекъсване, са показани по-долу:









Каталог: KST all -> Semesters -> semestar%207 -> NEW -> SistemiProgamiremaLogika
SistemiProgamiremaLogika -> Лекция №2, 2012 Системи с Програмируема Логика
SistemiProgamiremaLogika -> Лекция №1, 2012 Интегрални Схеми. Основни елементи и технологии. Чипове за Системи с Програмируема Логика
SistemiProgamiremaLogika -> Езикови преводи От български на английски
SistemiProgamiremaLogika -> Лекция №1, 2012 Интегрални Схеми. Основни елементи и технологии. Чипове за Системи с Програмируема Логика
SistemiProgamiremaLogika -> Проектиране на Управляващо устройство за светофари като краен автомат с помощта на развойна среда (Webpack) и входно hdl – описание


Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница