System on Chip (SoC)
ELT3
2014-2015
Vahid MEGHDADI
Introduction
Schéma global d’un circuit numérique composé d’un circuit programmable de type
µP et des circuits logiques tout au tours.
Vahid MEGHDADI ENSIL Limoges
Le tout sur un FPGA (SoC)
FPGA
Un microprocesseur est un circuit logique comme les autres, donc tout à fait
intégrable sur le FPGA.
Vahid MEGHDADI ENSIL Limoges
Evolution de FPGA
FPGA uniquement contenant des logiques programmables, tout se
construit avec des logiques disponibles
Ajout de la mémoire embarquée (block RAM)
Ajout de multiplieurs (hard)
Ajout de microprocesseur (hard)
« Power PC » pour série Virtex, « Dual-core ARM Cortex »
pour les plus récents (série 7)
Ajout des CAN et CNA
Vahid MEGHDADI ENSIL Limoges
Microprocesseur embarqué
Deux types de microprocesseur
Hard, le µP est gravé dans le FPGA
Soft, le µP n’est qu’un programme VHDL
Pour les FPGA de Xilinx, MicroBlaze est un µp 32 bits soft
Pour les FPGA de Xilinx, PowerPC est un µp 32 bits hard
Il y a aussi un petit µp 8 bits open source (PicoBlaze) que nous
allons utiliser dans ce cours
Vahid MEGHDADI ENSIL Limoges
Comment utiliser PicoBlaze ?
1. Apprendre son architecture
2. Apprendre son jeu d’instructions
3. L’instancier dans un programme VHDL
4. Lui connecter une mémoire contenant les codes opératoires
5. Ajouter en VHDL toute la logique autour
6. Synthèse, placement et routage de l’ensemble,
Vahid MEGHDADI ENSIL Limoges
Architecture de PicoBlaze
sortie
Entrée
Interface avec
la mémoire
externe
sortie
Entrée
Vahid MEGHDADI ENSIL Limoges
Instanciation
Deux components dans le
programme principal.
Vahid MEGHDADI ENSIL Limoges
Déclaration de PicoBlaze dans le
programme principal
Vahid MEGHDADI ENSIL Limoges
Instanciation
Des paramètres
de configuration
Max 105 MHz
pour spartan 6
Les ports du Les signaux à
PicoBlaze déclarer dans
le P.P.
Vahid MEGHDADI ENSIL Limoges
Déclaration et instanciation de la
mémoire
Des paramètres de
configuration
Les ports de Les signaux à
la mémoire déclarer dans
Vahid MEGHDADI ENSIL le P.P. Limoges
Création de la mémoire de programme
Comment peut-on remplir la mémoire avec les codes opératoires en
même temps que l’on crée tout le circuit ?
Ecrire le programme en langage assembleur dans un fichier
texte
Compiler pour générer les codes opératoires
Ecrire un programme VHDL pour créer une mémoire ROM
contenant les codes opératoires
Instancier la mémoire en même temps que le reste du circuit
Vahid MEGHDADI ENSIL Limoges
Démonstration
Créer une application simple, un chenillard.
Le circuit est le suivant
Vahid MEGHDADI ENSIL Limoges
Entité
entity test_pico6 is
Port ( CLK : in STD_LOGIC;
LED : out STD_LOGIC_VECTOR(7 downto 0));
end test_pico6;
CLK 8 LED
Vahid MEGHDADI ENSIL Limoges
Déclaration Component PicoBlaze
component kcpsm6
generic( hwbuild : std_logic_vector(7 downto 0) := X"00";
interrupt_vector : std_logic_vector(11 downto 0) := X"3FF";
scratch_pad_memory_size : integer := 64);
port ( address : out std_logic_vector(11 downto 0);
instruction : in std_logic_vector(17 downto 0);
bram_enable : out std_logic;
in_port : in std_logic_vector(7 downto 0);
out_port : out std_logic_vector(7 downto 0);
port_id : out std_logic_vector(7 downto 0);
write_strobe : out std_logic;
k_write_strobe : out std_logic;
read_strobe : out std_logic;
interrupt : in std_logic;
interrupt_ack : out std_logic;
sleep : in std_logic;
reset : in std_logic;
clk : in std_logic);
end component;
Vahid MEGHDADI ENSIL Limoges
Déclaration Component Mémoire
component prog_memo
generic ( C_FAMILY : string := "S6";
C_RAM_SIZE_KWORDS : integer := 1;
C_JTAG_LOADER_ENABLE : integer := 0);
Port ( address : in std_logic_vector(11 downto 0);
instruction : out std_logic_vector(17 downto 0);
enable : in std_logic;
rdl : out std_logic;
clk : in std_logic);
end component;
Vahid MEGHDADI ENSIL Limoges
Architecture (µp)
Architecture ...
...
Begin
processor: kcpsm6
generic map ( hwbuild => X"00",
interrupt_vector => X"3FF",
scratch_pad_memory_size => 64)
port map( address => adr,
instruction => instr,
bram_enable => bram_enable,
port_id => open,
write_strobe => we,
k_write_strobe => open,
out_port => data,
read_strobe => open,
in_port => "00000000",
interrupt => '0',
interrupt_ack => open,
sleep => '0',
reset => kcpsm6_reset,
clk => clk);
Vahid MEGHDADI ENSIL Limoges
Architecture (mémoire)
program_rom: prog_memo
generic map( C_FAMILY => "S6",
C_RAM_SIZE_KWORDS => 1,
C_JTAG_LOADER_ENABLE => 1)
port map( address => adr,
instruction => instr,
enable => bram_enable,
rdl => kcpsm6_reset,
clk => clk);
process(clk)
begin
if clk'event and clk = '1' then
if we= '1' then
LED <= data;
end if;
end if;
end process;
Vahid MEGHDADI ENSIL Limoges
Environnement ISE
Vahid MEGHDADI ENSIL Limoges
Elaborer la partie logicielle
Etudier l’architecture (les registres, les connexions, les
drapeaux, les opération, les ports d’entrée/sorties, les
interruptions, etc)
Ecrire le programme utilisant le jeu d’instructions de
PicoBlaze
Assembler pour générer les codes opératoires
Un programme ([Link]) est fourni par Xilinx
Créer une mémoire ROM contenant ces codes
Un utilitaire est fourni par Xilinx
Vahid MEGHDADI ENSIL Limoges
Registres internes
REGBANK A
REGBANK B
STAR Sx,Sy
Deux banques de registre A et B dans chacun 16 registres sur
8 bits : S0, S1, …, SF.
Vahid MEGHDADI ENSIL Limoges
ALU et drapeaux
Deux drapeaux liés à l’ALU : carry et zero
Vahid MEGHDADI ENSIL Limoges
Syntaxe d’instruction
optionnel Si dans
l’instruction il y a
Chargement (load) aussi un deuxième
Logique (and, or, etc) opérande
Arithmétique (+, -)
Décalage/rotation
etc
Commentaire
optionnel
Toutes instructions sauf
« return » possède au
moins un opérande. Remarque: toutes les instructions
C’est aussi la sont exécutées exactement en 2
destination. cycles d’horloge.
Vahid MEGHDADI ENSIL Limoges
Jeu d’instructions
Vahid MEGHDADI ENSIL Limoges
Programme chenillard
LOAD S4,01
Init cmp
debut: LOAD S2,00
loop3: LOAD S1,00
loop2: LOAD S0,00
loop1: SUB S0,01
JUMP NZ,loop1 Decrmt cmp
SUB S1,01
JUMP NZ,loop2
SUB S2,01
JUMP NZ,loop3 non rslt=0
OUTPUT S4,00 ?
RL S4
oui
JUMP debut
Réalisation d’un délai
Loop3 tourne 256 fois, loop2 tourne 256², et loop1 tourne 2563=16 777 216 fois
On peut aussi écrire un sous programme pour obtenir le retard nécessaire.
Vahid MEGHDADI ENSIL Limoges
Exercice: sous programme délai
Créer un sous programme « delai » qui génère un délai de 1 msec sachant que
l’horloge de PicoBlaze est de 100 MHz.
Sachant que chaque instruction dure deux cycles d ’horloge, il faut exécuter
50.000 instructions pour arriver à un délai de 1 msec.
DELAI: REGBANK B (1) Temps d’exécution:
LOAD s0,n1 (1) 1+1+n1.(1+2.n2+2)+1+1=50000
LOOP1: LOAD s1,n2 (n1) n1(3+2.n2)=49996
LOOP2: SUB s1,01 (n1.n2) Avec n1=244, n2=101
JUMP NZ,LOOP2 (n1.n2) => Nombre d’instructions: 50020
SUB s0,01 (n1)
JUMP NZ,LOOP1 (n1)
REGBANK A (1)
Pour obtenir approximativement 1 msec :
RETURN (1)
CALL DELAI
Vahid MEGHDADI ENSIL Limoges
Assembler
Enregistrer le fichier du programme avec extension psm :
nom_du_fichier.psm
Exécuter le fichier kcpsm6
Saisissez le nom du fichier à assembler
Vahid MEGHDADI ENSIL Limoges
La mémoire est générée,
on n’a qu’à l’utiliser
comme un component.
Vahid MEGHDADI ENSIL Limoges
implantation
Synthèse
Assignation des broches
Placement routage
téléchargement
Vahid MEGHDADI ENSIL Limoges
Démonstration Circuit
LOAD S4,01 (0)
debut: LOAD S3,01 (1)
loop3: LOAD S0,01 (2)
loop2: LOAD S1,01 (3)
loop1: SUB S1,01 (4)
JUMP NZ,loop1 (5)
SUB S0,01 (6)
JUMP NZ,loop2 (7)
SUB S3,01 (8)
JUMP NZ,loop3 (9)
OUTPUT S4,00 (10)
RL S4 (11)
JUMP debut (12)
Vahid MEGHDADI ENSIL Limoges
Port de sortie
L’instruction à utiliser est:
output Sx,pp
output Sx,(Sy)
Vahid MEGHDADI ENSIL Limoges
Port de sortie
Décodage complet de l’adresse, possibilité d’avoir 256 ports de sortie
Vahid MEGHDADI ENSIL Limoges
Décodage partiel
Vahid MEGHDADI ENSIL Limoges
Implantation décodage partiel
process(clk)
begin
if clk'event and clk = '1' then
if write_strobe = '1' then
if port_id(0) = '1' then
LED <= out_port;
end if;
if port_id(1) = '1' then
UART <= out_port;
end if;
if port_id(2) = '1' then
output_port_x <= out_port;
end if;
if port_id(3) = '1' then
output_port_y <= out_port;
end if;
end if;
end if;
end process;
Vahid MEGHDADI ENSIL Limoges
Port d’entrée
L’instruction à utiliser :
input Sx,pp
input Sx,(Sy)
Vahid MEGHDADI ENSIL Limoges
Port d’entrée complet
Vahid MEGHDADI ENSIL Limoges
Port d’entrée partiel
in_port
kcpsm6
Process synchrone
port_id
Vahid MEGHDADI ENSIL Limoges
Implantation partiel port d’entrée
process(clk)
begin
if clk'event and clk = '1' then
case port_id(1 downto 0) is
when "00" => in_port <= A; Adresse du port= B"- - - -_- - 00"=X"00"
when "01" => in_port <= B; Adresse du port= B"- - - -_- - 01"=X"01"
when "10" => in_port <= C; Adresse du port= B"- - - -_- - 10"=X"02"
when others => in_port <= D; Adresse du port= B"- - - -_- - 11"=X"03"
end case;
end if;
end process;
in_port
Lire l’état des switch et les afficher sur les LED:
input S0,00 ; ou input S0,F0; ou …
output S0,08 Process synchrone kcpsm6
On a supposé que les switches sont connectés au port
00 et que les LED sont connectées au port 8. port_id
Vahid MEGHDADI ENSIL Limoges
Interruption
Vahid MEGHDADI ENSIL Limoges
Routine d’interruption
Quand l’interruption arrive (un niveau 1 sur l’entrée
« interrupt »)
PicoBlaze termine l’instruction en cours, puis saute à une
adresse prédéfinie (celle que nous avions indiquée au moment
de l’instanciation du KCPSM6).
processor: kcpsm6
generic map ( hwbuild => X"00",
interrupt_vector => X"3FF",
scratch_pad_memory_size => 64)
port map( address => address,
C’est à la charge de programmeur de mettre sa routine à cette
adresse.
Vahid MEGHDADI ENSIL Limoges
Exemple d’interruption
A chaque interruption, incrémenter le registre SF.
processor: kcpsm6
generic map ( hwbuild => X"00",
Instanciation interrupt_vector => X"3FE",
scratch_pad_memory_size => 64)
port map( address => address,…
enable interrupt
...
Option 1 address 3FE
ISR : add SF,01
returni enable
enable interrupt
...
ISR : add SF,01
returni enable
Option 2
address 3FE ; on ne connaît pas la
JUMP ISR ; taille de la routine,
Vahid MEGHDADI ENSIL Limoges
Mise en place du circuit
« Open loop », il est nécessaire de
faire durer la demande de
l’interruption au moins pour deux
cycles d’horloge => pas de circuit
supplémentaire.
process
« Closed-loop », l’interruption est maintenue à ‘1’ jusqu’à ce que le processeur la serve.
Vahid MEGHDADI ENSIL Limoges
Exercice
Créer un timer qui donne une interruption toutes les
secondes à PicoBlaze. La routine d’interruption se charge de
faire clignoter les 8 LED de la carte.
Vahid MEGHDADI ENSIL Limoges
Instanciation KCPSM6
processor: kcpsm6
generic map ( hwbuild => X"00",
interrupt_vector => X"3FF",
scratch_pad_memory_size => 64)
port map( address => address,
instruction => instruction,
bram_enable => bram_enable,
port_id => open,
write_strobe => we,
k_write_strobe => open,
out_port => out_port,
read_strobe => open,
in_port => SW,
interrupt => interrupt,
interrupt_ack => int_ack,
sleep => '0',
reset => kcpsm6_reset,
clk => clk);
Vahid MEGHDADI ENSIL Limoges
Instanciation Timer et outport
TIMER: process(clk)
begin
if clk'event and clk = '1' then
cmp <= cmp + 1;
timer_trig <= '0';
if cmp = 99999999 then
cmp <= 0;
timer_trig <= '1';
end if;
end if;
end process;
output_ports: process(clk)
begin
if clk'event and clk = '1' then
if we = '1' then
LED <= out_port;
end if;
end if;
end process output_ports;
Vahid MEGHDADI ENSIL Limoges
Interruption software
interrupt_control: process(clk)
begin
if clk'event and clk='1' then
if int_ack = '1' then
interrupt <= '0';
else
if timer_trig = '1' then
interrupt <= '1';
else
interrupt <= interrupt;
end if;
end if;
end if;
end process interrupt_control;
Vahid MEGHDADI ENSIL Limoges
Software
ENABLE INTERRUPT
LOAD S1,00
LOOP: JUMP LOOP
ISR: INPUT S0,00
COMPARE S1,00
JUMP Z,INVERS
LOAD S1,00
JUMP AFFICH
INVERS:
LOAD S1,FF
XOR S0,FF
AFFICH:
OUTPUT S0,00
RETURNI ENABLE
ADDRESS 3FF
JUMP ISR
Vahid MEGHDADI ENSIL Limoges
Exercice
On va créer le circuit nécessaire pour simplifier l’ffichage d’une valeur
hexadécimale 4 digits sur les sept-segments de la carte Nexy3. Ainsi le
programme pour afficher la valeur « 1234 » sur les 7-segment serait :
LOAD s0,12
OUTPUT s0,01 ; l’adresse du port pour les 2 MSD
LOAD s0,34
OUTPUT s0,02 ; l’adresse du port pour les 2 LSD
Vahid MEGHDADI ENSIL Limoges
Conception circuit (hardware)
Dans un premier temps l’interface 7-seg : Commande
with-select
process(CLK)
begin
if CLK’event and CLK=‘1’ then
if trig=‘1’ then segment <= segment + 1; end if;
end if;
end process;
Vahid MEGHDADI ENSIL Limoges
Interface avec PicoBlaze
Vahid MEGHDADI ENSIL Limoges
Ajout d’un port UART
En programmation, on vérifie si UART n’est pas "busy" on
lui envoie un octet:
; sous programme UART
UART: INPUT SF,01 ; Busy est à lire sur le port 1
AND SF,01 ; Busy est le LSB
JUMP NZ,UART ; attend tant que Busy = ‘1’
OUTPUT S0,04 ; envoyer à l’interface le carac
RETURN ; ASCII
Pour appeler:
LOAD S0,"A"
CALL UART
Vahid MEGHDADI ENSIL Limoges
Ajout de l’UART
Ici, puisqu’il n’y a qu’une seule entrée sur le port « in_port »:
in_port <= "0000000" & busy;
Vahid MEGHDADI ENSIL Limoges
Ajout d’un timer
On va maintenant mettre en place un timer qui donne une interruption toutes
les secondes. La routine d’interruption va incrémenter un registre 16-bits puis
envoie le contenu à l’interface qui l’affiche sur les 7-segments.
Le hardware a été expliqué plus haut. Le programme sera:
ISR: ADD SA,01
ADDC SB,00
OUTPUT SA,01
OUTPUT SB,02
RETURNI ENABLE
Vahid MEGHDADI ENSIL Limoges
Affichage du timer sur PC
; sous-programme qui transforme une
; donnée numérique 8 bits en deux codes
; ascii pour les deux digits
ISR: ADD SA,01
; "4F" 52 et 65
ADDCY SB,00
; on suppose la donnée 8 bits dans S0
OUTPUT SA,01
; la routine retourne deux codes ascii
OUTPUT SB,02
; dans SE et SF
LOAD S0,SB
HEX2ASCII:
CALL HEX2ASCII
LOAD SF,S0
LOAD S0,SE
LOAD SE,S0
CALL UART
AND SF,0F
LOAD S0,SF
ADD SF,30
CALL UART
COMPARE SF,3A
LOAD S0,SA
JUMP C,DONE1
CALL HEX2ASCII
ADD SF,07
LOAD S0,SE
DONE1: SR0 SE
CALL UART
SR0 SE
LOAD S0,SF
SR0 SE
CALL UART
SR0 SE
ADD SE,30
COMPARE SE,3A
JUMP C,DONE2
ADD SE,07
DONE2: RETURN
Vahid MEGHDADI ENSIL Limoges
Travaux Pratiques
La mise en place de l’architecture abordée en cours
Transporter la partie logicielle HEX2ASCII en hardware
Vahid MEGHDADI ENSIL Limoges