LR/ 0040750 0044251 0003757 00000000000 10151610003 011052 5 ustar kinviboh archi LR/Spec-ASIC-LR.php 0100640 0044251 0003757 00000054064 07754402347 013545 0 ustar kinviboh archi
page_open(array("sess" => "enssat_Session", "auth" => "enssat_Challenge_Crypt_Auth", "perm" => "enssat_Perm", "user" => "enssat_User"));
include "headers.inc";
session_start();
$id_menu="14";
$id_sous_menu="14";
// Méta pour moteur de Recherche
$key_words="";
$title="";
$description="";
//------------------------------
require("site_cst.inc");
require("libMain.inc");
$id_menu="801";
$id_sous_menu="80181";
include "r2d2_functions.inc";
include "menu_top.inc";
?>
affiche_titre("Spécification détaillée
de l'ASIC");
?>
"Lancer de rayons"
I Introduction
L'ASIC "Lancer de rayons" est destiné a accélérer
l'algorithme de lancer de rayons pour la synthèse d'image. Il devra
s'interfacer avec un Transputer T800 qui lui communiquera les données
nécessaires aux calculs, puis lira les résultats. Son rôle
principal sera de calculer une intersection entre une sphère et
un rayon lancé. Ses principales fonctions sont : interfaçage
avec le T800, Unité de Traitement (Multiplieur, Additionneur, Comparaison,
Racine Carrée), et Unité de Contrôle dédiée.
La période d'horloge de fonctionnement ainsi que la contrainte de
temps sont à déterminer.
II Environnement
du circuit
Fig 1. Vue extérieure de l'ASIC
et Synoptique général du circuit |
Fig 2. Environnement du circuit sur la carte
|
III Organisation
générale du circuit
-
Bus de données bidirectionnel 32 bits (D0..D31)
-
Bus d'adresse pour la sélection des registres
internes 3 bits (A0..A2)
-
Signal de contrôle de sélection de boîtier
CS (actif bas)
-
Signal de contrôle de sélection de sens
de transfert R/W (R/W = 1 lecture; R/W = 0 écriture)
-
Signal d'horloge externe
-
Signal de reset général (actif bas)
IV Fonctions
réalisées
Dans le chapitre VI, l'algorithme de lancer de rayon
à implanter sur l'ASIC est fourni.
Cet algorithme contient 7 *, 12 +/-, 1 racine
carrée, 1 calcul de minimum.
Une étude précise de la fonction
de racine carrée devra être faite.
Les données externes sont codées
sur 8 bits (ou 12 bits). Le chemin de données interne sera taillé
pour une minimisation de la surface de silicium sans toutefois dépasser
16 bits (ou 24 bits).
La fonction de décodage sera déduite
du chapitre VI.
Le bloc RF (Register file) devra mémoriser
les données d'E/S à échanger avec l'extérieur.
Les autres données intermédiaires de calculs seront intégrées
dans l'UT.
V Caractéristiques
matérielles
Interface physique
-
Packaging : PLCC 68
-
Brochage : non encore défini
-
Technologie des E/S : CMOS
Chronogrammes et timings
-
Chronogramme de lecture/écriture de l'ASIC
à spécifier.
-
Timing à respecter : les cycles de lecture/écriture
des données se répètent toutes les us.
VI Interface
logicielle
4 registres internes 32 bits sont accessibles de
l'extérieur. Ils sont groupés par paquets de 8 bits selon
le principe suivant :
Adresse Coté
Transputer |
Contenu
(MSB..LSB) |
Taille réelle |
Sens |
@2000 |
Px,Py,Pz |
24 bits |
Écriture |
@2001 |
Dx, Dy, Dz |
24 bits |
Écriture |
@2002 |
Vx, Vy, Vz, r2 |
32 bits |
Écriture |
@2003 |
lambda |
16 bits |
Lecture |
Le coeur de la boucle du programme contenu dans le
processeur hôte sera le suivant :
Écrire (0, 0, Pz, 0, 2000) ;
Pour tous les pixels
Pour tous les objets
Écrire (Dx, Dy, Dz, 0, 2001) ;
Écrire (Vx, Vy, Vz, r2, 2002) ;
Lire (lambda, 2003) ;
Fait
Fait
Remarques : Les lectures correspondent aux résultats
du calcul précédent.
La deuxième écriture déclenchera le départ
de l'UC.
ENTITY lancer_de_rayon
IS
PORT (Px,Py,Pz:IN INTEGER; -- Coordonnes de l'observation
Dx,Dy,Dz:IN INTEGER; -- Vecteur de rayon
Vx,Vy,Vz:IN INTEGER; -- Coordonnes du centre de la sphere
Rcarre:IN INTEGER; -- Carre du rayon de la sphere
lambda:OUT INTEGER ); -- Vecteur de direction calculé
END lancer_de_rayon;
ARCHITECTURE behavioral OF lancer_de_rayon
IS
CONSTANT Tacces : TIME := 150 ns;
CONSTANT tmp : TIME := 3 * Tacces ;
BEGIN
PROCESS
VARIABLE X,Y,Z:integer;
VARIABLE B,C,Delta,RDelta:integer;
VARIABLE l1,l2:integer;
BEGIN
X := 0 - Vx;
Y := 0 - Vy;
Z := Pz - Vz;
B := X * Dx + Y * Dy + Z * Dz;
C := X * X + Y * Y + Z * Z - Rcarre;
Delta := B * B - C;
RDelta := SQRINT(Delta);
l1 := 0 - RDelta - B;
l2 := RDelta - B;
lambda <= MINIMUM(l1,l2);
WAIT FOR tmp;
END PROCESS;
END behavioral ; |
VII Conduite
de projet
Dans ce paragraphe, nous vous donnons quelques indications
concernant le déroulement du projet.
Ce qui vous est fournis ...
Un certain nombre de fichiers vous sont fournis.
Il s'agit des fichiers :
-
d'un package définissant les constantes, types et fonctions utilisables pour ce projet ;
-
une bibliothèque d'opérateurs (multiplieur, additionneur, additionneur/soustracteur, registre, etc)
permettant de construire l'unité de traitement ;
;
-
un modèle d'une machine d'états ;
-
la trame d'une entite de test.
Planning et travail en équipe
Nous donnons ici le planning prévisionnel
qu'il serait bon que vous suiviez afin de terminer dans les temps ce projet.
Le projet se déroule en équipe
de 3 binômes. Le découpage du travail sera réalisé
de la façon suivante :
-
réalisation de l'unité de traitement
(dont le composant racine et le format de codage). Il s'agit ici de réaliser une unioté de
traitement de facon structurelle (spécification du schéma de l'unité de traitement) ;
-
réalisation de l'unité de contrôle. Cette unité sera réalisée selon
le modèle composé de 2 logiques combinatoire et d'un registre d'états. On veillera a respecter strupuleusement
ce modèle afin d'aboutir à une synthèse correcte ;
-
réalisation de l'interface. Cette interface sera réalisée à partir
d'un assemblage de registres que l'on pilotera à partir d'un décodeur ;
|
|
TP |
Séance 1 |
Séance 2 |
Séance 3 |
Séance 4 |
Séance 5 |
Séance 6 |
Séance 7 |
Tâche 1 |
Tutorial, prise en main
Synopsys |
|
|
|
|
|
|
|
|
Tâche 2 |
TD sur machine
|
|
|
|
|
|
|
|
|
Tâche 3 |
Description comportementale de l'ASIC
Description du TestBench
|
|
|
|
|
|
|
|
|
Tâche 4 |
Répartition des taches dans l'équipe
|
|
|
|
|
|
|
|
|
Tâche 5 |
Synthèse de chaque partie de facon indépendante |
|
|
|
|
|
|
|
|
Tâche 6 |
Mise en commun et synthese globale |
|
|
|
|
|
|
|
|
Tab 1 : Plannification du projet lancer de
rayons
Commentaires sur le planning :
-
La tâche 3 est très importante,
elle vous permettra de bien comprendre le foncionnement global du ciruit,
et vous permettra d'avancer plus vite lors du développement de votre partie. De plus,
cette tache vous permettra de vous familiariser avec le langage VHDL.
-
La tâche 4 ne doit pas être prise à la légère.
De la décomposition du travail de chaque binome dans l'équipe découlera
la cohérence globale du projet et du bon fonctionnement final.
Cette partie doit notamment permettre de spécifier clairement l'ensemble des interfaces
entre les différentes unités du circuit.
-
Enfin la tâche6 sera précédée
par une diffusion du travail de chaque binôme vers l'équipe.
Chaque binôme s'attachera ensuite à réaliser la simulation
et la synthèse du système.
Notation
Les points qui seront pris en compte pour la
notation du projet sont les suivants :
-
attitude en projet : 4 pts ;
-
rapport, description du projet, présentation
du travail : 5 pts ;
-
spécifications VHDL cohérentes : 6
pts ;
-
simulations : 3 pts ;
-
surfaces, timing, netlist : 2 pts.
include "menu_bottom.inc";
page_close();
?>
LR/hcmos8d.script 0100640 0044251 0003757 00000001146 07754401324 013670 0 ustar kinviboh archi default_link_library = {"*", dw01.sldb, dw02.sldb, dw03.sldb, dw04.sldb, dw05.sldb, dw07.sldb};
db_hcmos8 = /usr/local4/cadence-97A/DesignKit/HCMOS8D/CORELIB8DLL_HCMOS8D_2.0/SYNOPSYS_DP/bc_1.95V_m40C/CORELIB8DLL.db
link_library = {db_hcmos8} + default_link_library ;
target_library = {db_hcmos8} ;
symbol_library= {/usr/local4/cadence-97A/DesignKit/HCMOS8D/CORELIB8DLL_HCMOS8D_2.0/SYNOPSYS_DP/CORELIB8DLL.sdb} ;
vhdlout_use_packages = {"IEEE.std_logic_1164", "IEEE.std_logic_arith", "CORELIB8DLL.all"};
/* definition du nom de la bibliotheque de reference */
library_reference = "db_hcmos8:CORELIB8DLL";
LR/.synopsys_dc.setup 0100640 0044251 0003757 00000000104 07754401334 014604 0 ustar kinviboh archi include hcmos8d.script
define_design_lib my_work -path ./lib
LR/ASICLR_Comp.vhd 0100640 0044251 0003757 00000004572 07202025231 013524 0 ustar kinviboh archi library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
LIBRARY LR;
USE LR.PackageLR.all;
USE LR.LancerRayon;
ENTITY ASICLR_Comp is
PORT (
DataIn : IN BitVector32 ;
DataOut : OUT BitVector32 ;
Adresses : IN BitVector3 ;
cs : IN bit ;
rw : IN bit ;
clock : IN bit ;
reset : IN bit) ;
END ASICLR_Comp ;
ARCHITECTURE structure OF ASICLR_Comp IS
COMPONENT lancer_de_rayon
PORT ( Px, Py, Pz : IN INTEGER;
Dx, Dy, Dz : IN INTEGER;
Vx, Vy, Vz : IN INTEGER;
Rcarre : IN INTEGER;
lambda : OUT INTEGER;
debut : IN bit);
END COMPONENT ;
SIGNAL Signal_Px : INTEGER := 0;
SIGNAL Signal_Py : INTEGER := 0;
SIGNAL Signal_Pz : INTEGER := 0;
SIGNAL Signal_Dx : INTEGER := 0;
SIGNAL Signal_Dy : INTEGER := 0;
SIGNAL Signal_Dz : INTEGER := 0;
SIGNAL Signal_Vx : INTEGER := 0;
SIGNAL Signal_Vy : INTEGER := 0;
SIGNAL Signal_Vz : INTEGER := 0;
SIGNAL S_Rcarre : INTEGER := 0;
SIGNAL S_Debut : bit := '0';
SIGNAL S_lambda : INTEGER := 0;
for lr0 : lancer_de_rayon
USE entity LR.LancerRayon(comportement);
BEGIN
-- Ce processus transforme un acces bus en signaux Pxyz, Dxyz, Vxyz, R, Lambda
Interface : PROCESS (cs, rw, clock)
VARIABLE ad : INTEGER;
BEGIN
IF cs = '0' AND clock = '1' AND clock'EVENT THEN
ad := CONV_INTEGER(Adresses);
IF (ad = 0) AND (rw = '0') THEN
Signal_Px <= CONV_INTEGER(DataIn(31 DOWNTO 24));
Signal_Py <= CONV_INTEGER(DataIn(23 DOWNTO 16));
Signal_Pz <= CONV_INTEGER(DataIn(15 DOWNTO 8));
S_Debut <= '1';
END IF;
IF (ad = 1) AND (rw = '0') THEN
Signal_Dx <= CONV_INTEGER(DataIn(31 DOWNTO 24));
Signal_Dy <= CONV_INTEGER(DataIn(23 DOWNTO 16));
Signal_Dz <= CONV_INTEGER(DataIn(15 DOWNTO 8));
S_Debut <= '1';
END IF;
IF (ad = 2) AND (rw = '0') THEN
Signal_Vx <= CONV_INTEGER(DataIn(31 DOWNTO 24));
Signal_Vy <= CONV_INTEGER(DataIn(23 DOWNTO 16));
Signal_Vz <= CONV_INTEGER(DataIn(15 DOWNTO 8));
S_Rcarre <= CONV_INTEGER(DataIn(7 DOWNTO 0));
S_Debut <= '1';
END IF;
IF ad = 3 AND rw = '1' THEN
DataOut(31 DOWNTO 16) <= CONV_SIGNED(S_lambda,16) ;
S_Debut <= '0';
END IF;
END IF;
END PROCESS ;
lr0 : lancer_de_rayon PORT MAP (
Signal_Px,
Signal_Py,
Signal_Pz,
Signal_Dx,
Signal_Dy,
Signal_Dz,
Signal_Vx,
Signal_Vy,
Signal_Vz,
S_Rcarre,
S_lambda,
S_Debut);
END structure;
LR/LancerRayon.vhd 0100640 0044251 0003757 00000001612 07202025231 013776 0 ustar kinviboh archi LIBRARY LR;
USE LR.PackageLR.all;
ENTITY LancerRayon IS
PORT ( Px, Py, Pz : IN INTEGER; -- Coordonnes de l'observation
Dx, Dy, Dz : IN INTEGER; -- Vecteur de rayon
Vx, Vy, Vz : IN INTEGER; -- Coordonnes du centre de la sphere
Rcarre : IN INTEGER; -- Carre du rayon de la sphere
lambda : OUT INTEGER; -- distance de l'intersection
debut : IN bit); -- signal de declenchement du calcul
END LancerRayon;
ARCHITECTURE comportement OF LancerRayon IS
BEGIN
PROCESS (debut)
VARIABLE X, Y, Z : INTEGER ;
VARIABLE B, C, Delta : INTEGER ;
VARIABLE RDelta, l1, l2 : INTEGER;
BEGIN
X := 0 - Vx;
Y := 0 - Vy;
Z := Pz - Vz;
B := X * Dx + Y * Dy + Z * Dz;
C := X * X + Y * Y + Z * Z - Rcarre;
Delta := B * B - C;
RDelta := SQRINT(Delta);
l1 := 0 - RDelta - B;
l2 := RDelta - B;
lambda <= MINIMUM(l1,l2);
END PROCESS;
END comportement;
LR/PackageLR.vhd 0100640 0044251 0003757 00000034201 07202025231 013352 0 ustar kinviboh archi library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
PACKAGE PackageLR IS
CONSTANT Tclock : TIME := 30 ns;
CONSTANT Tacces : TIME := 150 ns;
SUBTYPE INT8BITS IS INTEGER RANGE -128 TO 127;
SUBTYPE INT16BITS IS INTEGER RANGE -32768 TO 32767;
SUBTYPE BitVector3 IS signed(2 DOWNTO 0);
SUBTYPE BitVector8 IS signed(7 DOWNTO 0);
SUBTYPE BitVector16 IS signed(15 DOWNTO 0);
SUBTYPE BitVector32 IS signed(31 DOWNTO 0);
FUNCTION SQRVFCG (Valeur : IN INTEGER) RETURN INTEGER ;
FUNCTION SQRINT (Valeur : IN INTEGER) RETURN INTEGER ;
FUNCTION MINIMUM (Valeur1 : IN INTEGER ; Valeur2 : IN INTEGER) RETURN INTEGER ;
END PackageLR ;
PACKAGE BODY PackageLR IS
FUNCTION MINIMUM (Valeur1 : IN INTEGER ; Valeur2 : IN INTEGER) RETURN INTEGER IS
VARIABLE min : INTEGER;
BEGIN
IF (Valeur1 > 0) AND (Valeur2 > 0) THEN
IF (Valeur1 < Valeur2) THEN
min := Valeur1;
ELSE
min := Valeur2;
END IF;
ELSIF (Valeur1 > 0) THEN
min := Valeur1;
ELSIF (Valeur2 > 0) THEN
min := Valeur2;
ELSE
min := 0;
END IF;
RETURN min;
END MINIMUM;
FUNCTION SQRINT (Valeur : IN INTEGER) RETURN INTEGER IS
VARIABLE racine : INTEGER;
BEGIN
case Valeur is
When 0 => Racine := 0 ;
When 1 To 2 => Racine := 1 ;
When 3 To 6 => Racine := 2 ;
When 7 To 12 => Racine := 3 ;
When 13 To 20 => Racine := 4 ;
When 21 To 30 => Racine := 5 ;
When 31 To 42 => Racine := 6 ;
When 43 To 56 => Racine := 7 ;
When 57 To 72 => Racine := 8 ;
When 73 To 90 => Racine := 9 ;
When 91 To 110 => Racine := 10 ;
When 111 To 132 => Racine := 11 ;
When 133 To 156 => Racine := 12 ;
When 157 To 182 => Racine := 13 ;
When 183 To 210 => Racine := 14 ;
When 211 To 240 => Racine := 15 ;
When 241 To 272 => Racine := 16 ;
When 273 To 306 => Racine := 17 ;
When 307 To 342 => Racine := 18 ;
When 343 To 380 => Racine := 19 ;
When 381 To 420 => Racine := 20 ;
When 421 To 462 => Racine := 21 ;
When 463 To 506 => Racine := 22 ;
When 507 To 552 => Racine := 23 ;
When 553 To 600 => Racine := 24 ;
When 601 To 650 => Racine := 25 ;
When 651 To 702 => Racine := 26 ;
When 703 To 756 => Racine := 27 ;
When 757 To 812 => Racine := 28 ;
When 813 To 870 => Racine := 29 ;
When 871 To 930 => Racine := 30 ;
When 931 To 992 => Racine := 31 ;
When 993 To 1056 => Racine := 32 ;
When 1057 To 1122 => Racine := 33 ;
When 1123 To 1190 => Racine := 34 ;
When 1191 To 1260 => Racine := 35 ;
When 1261 To 1332 => Racine := 36 ;
When 1333 To 1406 => Racine := 37 ;
When 1407 To 1482 => Racine := 38 ;
When 1483 To 1560 => Racine := 39 ;
When 1561 To 1640 => Racine := 40 ;
When 1641 To 1722 => Racine := 41 ;
When 1723 To 1806 => Racine := 42 ;
When 1807 To 1892 => Racine := 43 ;
When 1893 To 1980 => Racine := 44 ;
When 1981 To 2070 => Racine := 45 ;
When 2071 To 2162 => Racine := 46 ;
When 2163 To 2256 => Racine := 47 ;
When 2257 To 2352 => Racine := 48 ;
When 2353 To 2450 => Racine := 49 ;
When 2451 To 2550 => Racine := 50 ;
When 2551 To 2652 => Racine := 51 ;
When 2653 To 2756 => Racine := 52 ;
When 2757 To 2862 => Racine := 53 ;
When 2863 To 2970 => Racine := 54 ;
When 2971 To 3080 => Racine := 55 ;
When 3081 To 3192 => Racine := 56 ;
When 3193 To 3306 => Racine := 57 ;
When 3307 To 3422 => Racine := 58 ;
When 3423 To 3540 => Racine := 59 ;
When 3541 To 3660 => Racine := 60 ;
When 3661 To 3782 => Racine := 61 ;
When 3783 To 3906 => Racine := 62 ;
When 3907 To 4032 => Racine := 63 ;
When 4033 To 4160 => Racine := 64 ;
When 4161 To 4290 => Racine := 65 ;
When 4291 To 4422 => Racine := 66 ;
When 4423 To 4556 => Racine := 67 ;
When 4557 To 4692 => Racine := 68 ;
When 4693 To 4830 => Racine := 69 ;
When 4831 To 4970 => Racine := 70 ;
When 4971 To 5112 => Racine := 71 ;
When 5113 To 5256 => Racine := 72 ;
When 5257 To 5402 => Racine := 73 ;
When 5403 To 5550 => Racine := 74 ;
When 5551 To 5700 => Racine := 75 ;
When 5701 To 5852 => Racine := 76 ;
When 5853 To 6006 => Racine := 77 ;
When 6007 To 6162 => Racine := 78 ;
When 6163 To 6320 => Racine := 79 ;
When 6321 To 6480 => Racine := 80 ;
When 6481 To 6642 => Racine := 81 ;
When 6643 To 6806 => Racine := 82 ;
When 6807 To 6972 => Racine := 83 ;
When 6973 To 7140 => Racine := 84 ;
When 7141 To 7310 => Racine := 85 ;
When 7311 To 7482 => Racine := 86 ;
When 7483 To 7656 => Racine := 87 ;
When 7657 To 7832 => Racine := 88 ;
When 7833 To 8010 => Racine := 89 ;
When 8011 To 8190 => Racine := 90 ;
When 8191 To 8372 => Racine := 91 ;
When 8373 To 8556 => Racine := 92 ;
When 8557 To 8742 => Racine := 93 ;
When 8743 To 8930 => Racine := 94 ;
When 8931 To 9120 => Racine := 95 ;
When 9121 To 9312 => Racine := 96 ;
When 9313 To 9506 => Racine := 97 ;
When 9507 To 9702 => Racine := 98 ;
When 9703 To 9900 => Racine := 99 ;
When 9901 To 10100 => Racine := 100 ;
When 10101 To 10302 => Racine := 101 ;
When 10303 To 10506 => Racine := 102 ;
When 10507 To 10712 => Racine := 103 ;
When 10713 To 10920 => Racine := 104 ;
When 10921 To 11130 => Racine := 105 ;
When 11131 To 11342 => Racine := 106 ;
When 11343 To 11556 => Racine := 107 ;
When 11557 To 11772 => Racine := 108 ;
When 11773 To 11990 => Racine := 109 ;
When 11991 To 12210 => Racine := 110 ;
When 12211 To 12432 => Racine := 111 ;
When 12433 To 12656 => Racine := 112 ;
When 12657 To 12882 => Racine := 113 ;
When 12883 To 13110 => Racine := 114 ;
When 13111 To 13340 => Racine := 115 ;
When 13341 To 13572 => Racine := 116 ;
When 13573 To 13806 => Racine := 117 ;
When 13807 To 14042 => Racine := 118 ;
When 14043 To 14280 => Racine := 119 ;
When 14281 To 14520 => Racine := 120 ;
When 14521 To 14762 => Racine := 121 ;
When 14763 To 15006 => Racine := 122 ;
When 15007 To 15252 => Racine := 123 ;
When 15253 To 15500 => Racine := 124 ;
When 15501 To 15750 => Racine := 125 ;
When 15751 To 16002 => Racine := 126 ;
When 16003 To 16256 => Racine := 127 ;
when others => Racine := 0 ;
end case;
RETURN racine;
END SQRINT ;
FUNCTION SQRVFCG (Valeur : IN INTEGER) RETURN INTEGER IS
VARIABLE racine : INTEGER;
BEGIN
case Valeur is
when 0 => racine:= 0 ;
when 1 => racine:= 2 ;
when 2 to 3 => racine:= 3 ;
when 4 to 5 => racine:= 4 ;
when 6 to 7 => racine:= 5 ;
when 8 to 10 => racine:= 6 ;
when 11 to 14 => racine:= 7 ;
when 15 to 18 => racine:= 8 ;
when 19 to 22 => racine:= 9 ;
when 23 to 27 => racine:= 10 ;
when 28 to 33 => racine:= 11 ;
when 34 to 39 => racine:= 12 ;
when 40 to 45 => racine:= 13 ;
when 46 to 52 => racine:= 14 ;
when 53 to 60 => racine:= 15 ;
when 61 to 68 => racine:= 16 ;
when 69 to 76 => racine:= 17 ;
when 77 to 85 => racine:= 18 ;
when 86 to 95 => racine:= 19 ;
when 96 to 105 => racine:= 20 ;
when 106 to 115 => racine:= 21 ;
when 116 to 126 => racine:= 22 ;
when 127 to 138 => racine:= 23 ;
when 139 to 150 => racine:= 24 ;
when 151 to 162 => racine:= 25 ;
when 163 to 175 => racine:= 26 ;
when 176 to 189 => racine:= 27 ;
when 190 to 203 => racine:= 28 ;
when 204 to 217 => racine:= 29 ;
when 218 to 232 => racine:= 30 ;
when 233 to 248 => racine:= 31 ;
when 249 to 264 => racine:= 32 ;
when 265 to 280 => racine:= 33 ;
when 281 to 297 => racine:= 34 ;
when 298 to 315 => racine:= 35 ;
when 316 to 333 => racine:= 36 ;
when 334 to 351 => racine:= 37 ;
when 352 to 370 => racine:= 38 ;
when 371 to 390 => racine:= 39 ;
when 391 to 410 => racine:= 40 ;
when 411 to 430 => racine:= 41 ;
when 431 to 451 => racine:= 42 ;
when 452 to 473 => racine:= 43 ;
when 474 to 495 => racine:= 44 ;
when 496 to 517 => racine:= 45 ;
when 518 to 540 => racine:= 46 ;
when 541 to 564 => racine:= 47 ;
when 565 to 588 => racine:= 48 ;
when 589 to 612 => racine:= 49 ;
when 613 to 637 => racine:= 50 ;
when 638 to 663 => racine:= 51 ;
when 664 to 689 => racine:= 52 ;
when 690 to 715 => racine:= 53 ;
when 716 to 742 => racine:= 54 ;
when 743 to 770 => racine:= 55 ;
when 771 to 798 => racine:= 56 ;
when 799 to 826 => racine:= 57 ;
when 827 to 855 => racine:= 58 ;
when 856 to 885 => racine:= 59 ;
when 886 to 915 => racine:= 60 ;
when 916 to 945 => racine:= 61 ;
when 946 to 976 => racine:= 62 ;
when 977 to 1008 => racine:= 63 ;
when 1009 to 1040 => racine:= 64 ;
when 1041 to 1072 => racine:= 65 ;
when 1073 to 1105 => racine:= 66 ;
when 1106 to 1139 => racine:= 67 ;
when 1140 to 1173 => racine:= 68 ;
when 1174 to 1207 => racine:= 69 ;
when 1208 to 1242 => racine:= 70 ;
when 1243 to 1278 => racine:= 71 ;
when 1279 to 1314 => racine:= 72 ;
when 1315 to 1350 => racine:= 73 ;
when 1351 to 1387 => racine:= 74 ;
when 1388 to 1425 => racine:= 75 ;
when 1426 to 1463 => racine:= 76 ;
when 1464 to 1501 => racine:= 77 ;
when 1502 to 1540 => racine:= 78 ;
when 1541 to 1580 => racine:= 79 ;
when 1581 to 1620 => racine:= 80 ;
when 1621 to 1660 => racine:= 81 ;
when 1661 to 1701 => racine:= 82 ;
when 1702 to 1743 => racine:= 83 ;
when 1744 to 1785 => racine:= 84 ;
when 1786 to 1827 => racine:= 85 ;
when 1828 to 1870 => racine:= 86 ;
when 1871 to 1914 => racine:= 87 ;
when 1915 to 1958 => racine:= 88 ;
when 1959 to 2002 => racine:= 89 ;
when 2003 to 2047 => racine:= 90 ;
when 2048 to 2093 => racine:= 91 ;
when 2094 to 2139 => racine:= 92 ;
when 2140 to 2185 => racine:= 93 ;
when 2186 to 2232 => racine:= 94 ;
when 2233 to 2280 => racine:= 95 ;
when 2281 to 2328 => racine:= 96 ;
when 2329 to 2376 => racine:= 97 ;
when 2377 to 2425 => racine:= 98 ;
when 2426 to 2475 => racine:= 99 ;
when 2476 to 2525 => racine:= 100 ;
when 2526 to 2575 => racine:= 101 ;
when 2576 to 2626 => racine:= 102 ;
when 2627 to 2678 => racine:= 103 ;
when 2679 to 2730 => racine:= 104 ;
when 2731 to 2782 => racine:= 105 ;
when 2783 to 2835 => racine:= 106 ;
when 2836 to 2889 => racine:= 107 ;
when 2890 to 2943 => racine:= 108 ;
when 2944 to 2997 => racine:= 109 ;
when 2998 to 3052 => racine:= 110 ;
when 3053 to 3108 => racine:= 111 ;
when 3109 to 3164 => racine:= 112 ;
when 3165 to 3220 => racine:= 113 ;
when 3221 to 3277 => racine:= 114 ;
when 3278 to 3335 => racine:= 115 ;
when 3336 to 3393 => racine:= 116 ;
when 3394 to 3451 => racine:= 117 ;
when 3452 to 3510 => racine:= 118 ;
when 3511 to 3570 => racine:= 119 ;
when 3571 to 3630 => racine:= 120 ;
when 3631 to 3690 => racine:= 121 ;
when 3691 to 3751 => racine:= 122 ;
when 3752 to 3813 => racine:= 123 ;
when 3814 to 3875 => racine:= 124 ;
when 3876 to 3937 => racine:= 125 ;
when 3938 to 4000 => racine:= 126 ;
when 4001 to 4095 => racine:= 127 ;
when others => racine:=0 ;
end case;
RETURN racine;
END SQRVFCG ;
END PackageLR ;
LR/Test.scr 0100750 0044251 0003757 00000000075 07202025231 012512 0 ustar kinviboh archi vhdlan PackageLR LancerRayon ASICLR_Comp TestASICLR cfg_LR
LR/TestASICLR.vhd 0100640 0044251 0003757 00000003462 10151610070 013401 0 ustar kinviboh archi library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
LIBRARY LR;
USE LR.PackageLR.all;
USE LR.all;
ENTITY testASICLR is
END testASICLR ;
ARCHITECTURE structure OF testASICLR IS
COMPONENT ASICLR_Comp
PORT (
DataIn : IN BitVector32 ;
DataOut : OUT BitVector32 ;
Adresses : IN BitVector3 ;
cs : IN bit ;
rw : IN bit ;
clock : IN bit ;
reset : IN bit) ;
END COMPONENT ;
SIGNAL ...
...
...
...
BEGIN
-----------------------------------------------------------------------
-- PROCESS DE L'HORLOGE
...
-----------------------------------------------------------------------
lr1 : ASICLR_Comp PORT MAP (...);
S_reset <= '0';
Signaux : PROCESS
BEGIN
---------------------------------------------------------------------
-- Ecriture du point d'observation
-- Ce point reste stable pour la suite
...
WAIT FOR Tacces;
---------------------------------------------------------------------
-- Ecriture du vecteur Rayon
... ; -- Dx
... ; -- Dy
... ; -- Dz
...
WAIT FOR Tacces;
-- Ecriture des caracteristiques de la sphere
...; -- Vx
...; -- Vy
...; -- Vz
...; -- Rcarre
...
...
WAIT FOR Tacces;
-- Lecture du resultat
...
WAIT FOR Tacces;
---------------------------------------------------------------------
---------------------------------------------------------------------
-- Ecriture du vecteur Rayon
...
WAIT FOR Tacces;
-- Lecture du resultat
...
WAIT FOR Tacces;
---------------------------------------------------------------------
---------------------------------------------------------------------
-- Ecriture des caracteristiques de la sphere
...
WAIT FOR Tacces;
-- Lecture du resultat
...
WAIT FOR Tacces;
...
...
...
...
END PROCESS;
END structure;
LR/cfg_LR.vhd 0100640 0044251 0003757 00000000445 07202025231 012720 0 ustar kinviboh archi library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
LIBRARY LR;
USE LR.PackageLR.all;
USE LR.all;
library LSI_10K;
use LSI_10K.COMPONENTS.all;
configuration cfg_LR of testASICLR is
for structure
for lr1 : ASICLR_Comp
USE entity LR.ASICLR_Comp(structure);
end for;
end for;
end cfg_LR;
LR/lib/ 0040750 0044251 0003757 00000000000 07754401356 011650 5 ustar kinviboh archi LR/.synopsys_vss.setup 0100640 0044251 0003757 00000000060 07754401334 015032 0 ustar kinviboh archi WORK > my_work
my_work : ./lib
TIMEBASE = ps
LR/ModeleMachineEtats.vhd 0100750 0044251 0003757 00000003272 07760704036 015302 0 ustar kinviboh archi LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY StateMachine IS
GENERIC (
....
....
....
....
)
PORT (
....
....
....
....
Rstb : IN Std_Logic;
Clk : IN Std_Logic );
END StateMachine ;
ARCHITECTURE comportementale OF StateMachine IS
TYPE StateType IS (
E0, E1, E2, E3, ....... , EN);
SIGNAL EtatCourant, EtatSuivant : StateType;
BEGIN
synchrone : PROCESS(Clk, Rstb)
BEGIN
IF Rstb = '0' THEN
EtatCourant <= E0;
ELSIF Clk'event AND Clk = '0' THEN
EtatCourant <= EtatSuivant;
END IF;
END PROCESS synchrone ;
LC1 : PROCESS(EtatCourant)
BEGIN
CASE EtatCourant IS
WHEN E0 =>
IF (transition valide) THEN
EtatSuivant <= E1 ;
ELSE
EtatSuivant <= E0 ;
END IF;
WHEN E1 =>
IF (transition valide) THEN
EtatSuivant <= E2 ;
ELSE
EtatSuivant <= E1 ;
END IF;
WHEN E2 =>
IF (transition valide) THEN
EtatSuivant <= E3 ;
ELSE
EtatSuivant <= E2 ;
END IF;
....
....
....
....
....
....
WHEN OTHERS =>
EtatSuivant <= E0 ;
END CASE;
END PROCESS LC1 ;
LC2 : PROCESS(EtatCourant)
BEGIN
CASE EtatCourant IS
WHEN E0 =>
SignalSortie1 <= '1' ;
SignalSortie2 <= '0' ;
....
....
SignalSortie2 <= '1' ;
WHEN E1 =>
SignalSortie1 <= '1' ;
SignalSortie2 <= '0' ;
....
....
SignalSortie2 <= '1' ;
WHEN E2 =>
SignalSortie1 <= '1' ;
SignalSortie2 <= '0' ;
....
....
SignalSortie2 <= '1' ;
....
....
....
....
....
....
WHEN OTHERS =>
SignalSortie1 <= '0' ;
SignalSortie2 <= '0' ;
....
....
SignalSortie2 <= '0' ;
END CASE;
END PROCESS LC2 ;
END comportementale;
LR/operateurs.vhd 0100640 0044251 0003757 00000030601 07760704043 013770 0 ustar kinviboh archi -----------------------------------------------------------------
-- Fichier contenant les specification VHDL de synthese
-- des operateurs de base :
--
-- reg : registre 16 bits (avec load synchrone et reset asynchrone)
-- mult : multiplieur 8x8 -> 16
-- addsous : additionneur / soustracteur (sans gestion du debordement)
-- tri : tristate 16 bits a commande /OE
-- mux : multiplexeur 16 bits
-- racine : calcul de la racine 16b -> 8b
-----------------------------------------------------------------
-------------------------------------------------------------------------
-- REGISTRE 16 bits *CLOCK ACTIVE SUR FRONT MONTANT
-- *CLEAR ASYNCHRONE ACTIF A '0'
-- *LOAD SYNCHRONE ACTIF A '1'
-------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity reg is
port ( D : in Std_Logic_Vector(15 downto 0);
LOAD : in Std_Logic;
CLRB : in Std_Logic;
CLK : in Std_Logic;
Q : out Std_Logic_Vector(15 downto 0) );
end reg;
architecture reg OF reg is begin
process(CLRB,CLK)
begin
if CLRB='0' then
Q <="0000000000000000"; -- si clear=0 alors Q=0
elsif CLK'event and CLK='1' then -- si front montant sur clk
if LOAD='1' then Q <= D; -- et load=1 alors chargement
end if;
end if;
end process;
end reg;
-------------------------------------------------------------------------
-- MULTIPLIEUR 8 bits -
-- Entrees : A entree sur 8 b -
-- B entree sur 8 b -
-- Sorties : S sortie sur 16 b -
-------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.all;
entity mult is
port ( A : in Std_Logic_Vector(7 downto 0);
B : in Std_Logic_Vector(7 downto 0);
S : out Std_Logic_Vector(15 downto 0) );
end mult;
architecture mult OF mult is
begin
process(A,B)
variable va_A_ext : signed(15 downto 0);
variable va_B_ext : signed(15 downto 0);
variable tmp : signed(31 downto 0);
begin
va_A_ext := conv_signed(signed(A),16);
va_B_ext := conv_signed(signed(B),16);
tmp := va_A_ext * va_B_ext;
S <= std_logic_vector(tmp(15 downto 0));
end process;
end mult;
-------------------------------------------------------------------------
-- ADDITIONNEUR SOUSTRACTEUR -
-- -
-- programme VHDL permettant l'addition/soustraction de A et B -
-- Si commande = 0 alors S=A+B -
-- Si commande = 1 alors S=A-B -
-------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.all;
entity addsous is
port ( A : in Std_Logic_Vector(15 downto 0) ;
B : in Std_Logic_Vector(15 downto 0) ;
COMMANDE : in BIT ;
S : out Std_Logic_Vector(15 downto 0) ) ;
end addsous;
architecture addsous OF addsous is
begin
process(A,B,COMMANDE)
begin
if COMMANDE = '0' then
S <= signed(A) + signed(B);
else
S <= signed(A) - signed(B);
end if;
end process;
end addsous;
---------------------------------------------------------------------
-- TRI-STATE
-- OE D Q
-- 0 X -> Z
-- 1 0 -> 0
-- 1 1 -> 1
----------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity tri is
port ( D : in Std_Logic_Vector(15 downto 0) ;
OE : in Std_Logic ;
Q : out Std_Logic_Vector(15 downto 0) );
end tri;
architecture tri OF tri is begin
process(D,OE)
begin
if OE = '0' then
Q <= "ZZZZZZZZZZZZZZZZ";
else
Q <= D;
end if;
end process;
end tri;
-------------------------------------------------------------------------
-- MULTIPLEXEUR 16 b -
-- Entrees: E0,E1 sur 16 b -
-- Sortie: S du mux sur 16 b -
-- -
-- Table de verite: -
-- COMMANDE | S -
-- 0 | E0 -
-- 1 | E1 -
-------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity mux is
port ( E0 : in Std_Logic_Vector(15 downto 0);
E1 : in Std_Logic_Vector(15 downto 0);
COMMANDE : in Std_Logic;
S : out Std_Logic_Vector(15 downto 0) );
end mux;
architecture mux OF mux is begin
process(E0,E1,COMMANDE)
begin
if COMMANDE='0' then
S <=E0;
else
S <=E1;
end if;
end process;
end mux;
-------------------------------------------------------------------------
-- RACINE 16 b
-- Entrees: Valeur sur 16 b
-- Sortie: S sur 8 b
--
-------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
ENTITY racine IS
PORT (Valeur : IN INTEGER RANGE 0 TO 16383;
Racine : OUT INTEGER RANGE 0 TO 127 );
END racine;
ARCHITECTURE racine of racine IS
BEGIN
PROCESS (Valeur) BEGIN
case Valeur is
When 0 => Racine <= 0 ;
When 1 To 2 => Racine <= 1 ;
When 3 To 6 => Racine <= 2 ;
When 7 To 12 => Racine <= 3 ;
When 13 To 20 => Racine <= 4 ;
When 21 To 30 => Racine <= 5 ;
When 31 To 42 => Racine <= 6 ;
When 43 To 56 => Racine <= 7 ;
When 57 To 72 => Racine <= 8 ;
When 73 To 90 => Racine <= 9 ;
When 91 To 110 => Racine <= 10 ;
When 111 To 132 => Racine <= 11 ;
When 133 To 156 => Racine <= 12 ;
When 157 To 182 => Racine <= 13 ;
When 183 To 210 => Racine <= 14 ;
When 211 To 240 => Racine <= 15 ;
When 241 To 272 => Racine <= 16 ;
When 273 To 306 => Racine <= 17 ;
When 307 To 342 => Racine <= 18 ;
When 343 To 380 => Racine <= 19 ;
When 381 To 420 => Racine <= 20 ;
When 421 To 462 => Racine <= 21 ;
When 463 To 506 => Racine <= 22 ;
When 507 To 552 => Racine <= 23 ;
When 553 To 600 => Racine <= 24 ;
When 601 To 650 => Racine <= 25 ;
When 651 To 702 => Racine <= 26 ;
When 703 To 756 => Racine <= 27 ;
When 757 To 812 => Racine <= 28 ;
When 813 To 870 => Racine <= 29 ;
When 871 To 930 => Racine <= 30 ;
When 931 To 992 => Racine <= 31 ;
When 993 To 1056 => Racine <= 32 ;
When 1057 To 1122 => Racine <= 33 ;
When 1123 To 1190 => Racine <= 34 ;
When 1191 To 1260 => Racine <= 35 ;
When 1261 To 1332 => Racine <= 36 ;
When 1333 To 1406 => Racine <= 37 ;
When 1407 To 1482 => Racine <= 38 ;
When 1483 To 1560 => Racine <= 39 ;
When 1561 To 1640 => Racine <= 40 ;
When 1641 To 1722 => Racine <= 41 ;
When 1723 To 1806 => Racine <= 42 ;
When 1807 To 1892 => Racine <= 43 ;
When 1893 To 1980 => Racine <= 44 ;
When 1981 To 2070 => Racine <= 45 ;
When 2071 To 2162 => Racine <= 46 ;
When 2163 To 2256 => Racine <= 47 ;
When 2257 To 2352 => Racine <= 48 ;
When 2353 To 2450 => Racine <= 49 ;
When 2451 To 2550 => Racine <= 50 ;
When 2551 To 2652 => Racine <= 51 ;
When 2653 To 2756 => Racine <= 52 ;
When 2757 To 2862 => Racine <= 53 ;
When 2863 To 2970 => Racine <= 54 ;
When 2971 To 3080 => Racine <= 55 ;
When 3081 To 3192 => Racine <= 56 ;
When 3193 To 3306 => Racine <= 57 ;
When 3307 To 3422 => Racine <= 58 ;
When 3423 To 3540 => Racine <= 59 ;
When 3541 To 3660 => Racine <= 60 ;
When 3661 To 3782 => Racine <= 61 ;
When 3783 To 3906 => Racine <= 62 ;
When 3907 To 4032 => Racine <= 63 ;
When 4033 To 4160 => Racine <= 64 ;
When 4161 To 4290 => Racine <= 65 ;
When 4291 To 4422 => Racine <= 66 ;
When 4423 To 4556 => Racine <= 67 ;
When 4557 To 4692 => Racine <= 68 ;
When 4693 To 4830 => Racine <= 69 ;
When 4831 To 4970 => Racine <= 70 ;
When 4971 To 5112 => Racine <= 71 ;
When 5113 To 5256 => Racine <= 72 ;
When 5257 To 5402 => Racine <= 73 ;
When 5403 To 5550 => Racine <= 74 ;
When 5551 To 5700 => Racine <= 75 ;
When 5701 To 5852 => Racine <= 76 ;
When 5853 To 6006 => Racine <= 77 ;
When 6007 To 6162 => Racine <= 78 ;
When 6163 To 6320 => Racine <= 79 ;
When 6321 To 6480 => Racine <= 80 ;
When 6481 To 6642 => Racine <= 81 ;
When 6643 To 6806 => Racine <= 82 ;
When 6807 To 6972 => Racine <= 83 ;
When 6973 To 7140 => Racine <= 84 ;
When 7141 To 7310 => Racine <= 85 ;
When 7311 To 7482 => Racine <= 86 ;
When 7483 To 7656 => Racine <= 87 ;
When 7657 To 7832 => Racine <= 88 ;
When 7833 To 8010 => Racine <= 89 ;
When 8011 To 8190 => Racine <= 90 ;
When 8191 To 8372 => Racine <= 91 ;
When 8373 To 8556 => Racine <= 92 ;
When 8557 To 8742 => Racine <= 93 ;
When 8743 To 8930 => Racine <= 94 ;
When 8931 To 9120 => Racine <= 95 ;
When 9121 To 9312 => Racine <= 96 ;
When 9313 To 9506 => Racine <= 97 ;
When 9507 To 9702 => Racine <= 98 ;
When 9703 To 9900 => Racine <= 99 ;
When 9901 To 10100 => Racine <= 100 ;
When 10101 To 10302 => Racine <= 101 ;
When 10303 To 10506 => Racine <= 102 ;
When 10507 To 10712 => Racine <= 103 ;
When 10713 To 10920 => Racine <= 104 ;
When 10921 To 11130 => Racine <= 105 ;
When 11131 To 11342 => Racine <= 106 ;
When 11343 To 11556 => Racine <= 107 ;
When 11557 To 11772 => Racine <= 108 ;
When 11773 To 11990 => Racine <= 109 ;
When 11991 To 12210 => Racine <= 110 ;
When 12211 To 12432 => Racine <= 111 ;
When 12433 To 12656 => Racine <= 112 ;
When 12657 To 12882 => Racine <= 113 ;
When 12883 To 13110 => Racine <= 114 ;
When 13111 To 13340 => Racine <= 115 ;
When 13341 To 13572 => Racine <= 116 ;
When 13573 To 13806 => Racine <= 117 ;
When 13807 To 14042 => Racine <= 118 ;
When 14043 To 14280 => Racine <= 119 ;
When 14281 To 14520 => Racine <= 120 ;
When 14521 To 14762 => Racine <= 121 ;
When 14763 To 15006 => Racine <= 122 ;
When 15007 To 15252 => Racine <= 123 ;
When 15253 To 15500 => Racine <= 124 ;
When 15501 To 15750 => Racine <= 125 ;
When 15751 To 16002 => Racine <= 126 ;
When 16003 To 16383 => Racine <= 127 ;
when others => Racine <= 0 ;
end case;
END PROCESS;
END racine ;