Enoncé: Donner au sens arithmétique le plus grand nombre positif représentable et le plus négatif représentable sur un nombre en virgule fixe signé (
Nombre le plus grand :
Nombre le plus négatif :
Enoncé: Donnez la représentation en complément à 2 format
Si c'est un nombre positif, il n'y a pas de complément à 2 à réaliser.
Pour convertir un nombre négatif, on converti en binaire la valeur positive, puis on lui applique un complément à 2 et on lui ajoute 1.
Enoncé: Donnez la représentation en complément à 2 en virgule fixe
1 bit de signe + 3 bits entier + 12 bits flottant
On remarque que
Enoncé: Donnez le plus grand nombre représentable en format virgule flottante IEEE 754 avec une mantisse normalisée. Donnez uniquement l'expression littérale.
Maximum =
Enoncé: Donnez le plus petit nombre proche de 0
Minimum =
Dynamique =
Enoncé: Soit les représentation numériques suivantes de nombres flottants IEEE 754, donnez la valeur décimale correspondante
Binaire =>
Décimale =>
Binaire =>
Décimale =>
Enoncé: Donnez l'équation de différence générale du filtre
Enoncé: Quel est le format utilisé pour la représentation des coeficients et des échantillons de mesure ?
Ici:
Format des coeficients: 16Q15
Enoncé: Ecrire le programme d'un filtre IIR d'ordre 2
Entrées : DAC (Digital Analogic Converter) => 16Q0
On aura donc des opérations de type =
#define B0 0
#define B1 1
#define B2 2
#define A0 3
#define A1 4
#define A2 5
int IIR_II(int input)
{
long temps;
static signed int x[3] = { 0, 0, 0 };
static signed int y[3] = { 0, 0, 0 };
x[0] = input;
temps += (long)coef[B0] * x[0];
temps += (long)coef[B1] * x[1];
temps += (long)coef[B2] * x[2];
temps -= (long)coef[A1] * y[1];
temps -= (long)coef[A2] * y[2];
temps >>= 15;
y[0] = (short int)temps;
y[2] = y[1];
y[1] = y[0];
x[2] = x[1];
x[1] = x[0];
return y[0];
}
Enoncé: On appelle un filtre FIR, un filtre décrit pr la fonction de transfert suivante :
Ecrire le programme d'un filtre FIR d'ordre N quelconque
#define N
signed in IIR(void)
{
int i = 0;
long temps = 0;
static int init = 0;
static signed int x[N+1];
if (init == 0)
{
for (i = 0; i <= N; ++i)
{
x[i] = 0;
init = 1;
}
}
for (i = 0; i <= N; ++i)
{
temps += ((long)coef[i] * x[i]);
}
temps >>= 15;
if (temps > 32767)
{
temps = 32767;
} else if (temps < -32767)
{
temps = -32767;
}
for (i = N; i > 0; --i)
{
x[i] = x[i - 1];
}
return (short int)temps;
}
a. 1,5625 MSPS (6,25 / 4
)
b. Nous avons deux solutions :
a. MAXCONV1 & MAXCONV permettent de contrôler le nombre de conversions effectuées dans une séquence. On fait
b.
Donner le rôle des registres ADCCHSELSEQ1 & ADCCHSELSEQ2
Ils permettent de sélectionner les voies à convertir.
Donner le contenu de ces registres lorsqu'on souhaite faire la séquence d'acquisitions suivante: voie1, voie3, voie5, voie7, voie0, voie2, voie4, voie6
Séquence: 13570246
ADCCHSELSEQ1: 0x7531
ADCCHSELSEQ2: 0x6420
A l'aide des documentations fournies (fichier DSP280X_Adc.h
), écrire une portion de code C permettant d'initialiser les registres et répondant à la question 3.
AdcRegs.ADCCHSELSEQ1.all = 0x7531;
AdcRegs.ADCCHSELSEQ2.bit.CONV4 = 0;
AdcRegs.ADCCHSELSEQ2.bit.CONV5 = 2;
AdcRegs.ADCCHSELSEQ2.bit.CONV6 = 4;
AdcRegs.ADCCHSELSEQ2.bit.CONV7 = 6;
On désire réaliser un décodeur disposant en entrée d'un vecteur de deux bis et d'un signal de sélection, en sortie d'un vecteur de 4 bits tous de type std_logic
.
Table de vérité:
X: quelconque
entity demux is
port( sel: in std_logic;
A: in std_logic_vector(1 downto 0);
Y: out std_logic_vector(3 downto 0)
);
end demux;
entity demux is
port( sel: in std_logic;
a: in std_logic_vector(1 downto 0);
y: out std_logic_vector(1 downto 0)
);
end demux;
architecture arch1 of demux is
-- Affectation conditionnelle --
begin
j <= "1111" when sel = '1' else
"1110" when A = '00' else
"1101" when A = '01' else
"1011" when A = '10' else
"0111" when A = '11' else
"1111";
end;
architecture arch2 of demux is
-- Affection sélective --
signal sel_a: std_logic_vector(2 downto 0);
begin
with sel_a select
y <= "1110" when "000",
"1101" when "001",
"1011" when "010",
"0111" when "011",
"1111" when others;
sel_a <= sel&a
end;
On désire réaliser un comparateur dont l'entité est décrite ci-dessous:
entity Comparator is
port( A: in std_logic_vector(7 downto 0);
B: in std_logic_vector(7 downto 0);
less: out std_logic;
equal: out std_logic;
greater: out std_logic
);
end Comparator;
architecture arch f Comparator is
-- Affectation conditionnelle --
begin
less <= "1" when A < B else '0';
equal <= "1" when A = B else '0';
greater <= "1" when A > B else '0';
end;
entity genComp is
generic (N: natural := 8);
port ( A,B: in std_logic_vector(N-1 downto 0);
less: out std_logic;
equal: out std_logic;
greater: out std_logic
);
end;
On désire réaliser un registre à décalage à gauche de 8 bits sur front montant d'horloge à entrée et sortie série:
entity Shift_left is
port( clk: in std_logic;
SI: in std_logic;
SO: out std_logic
);
end Shift_left;
architecture arch of shift_left is
signal tmp: std_logic_vector(7 downto 0);
begin
process(clk)
begin
if (clk'event and clk='1')
for i in 0 to 6 loop
tmp(i+1) <= tmp(i);
end loop;
tmp(0) <= SI;
end if;
end;
end process;
SO <= tmp(7);
end;
architecture arch of freg is
begin
process (clock, clear)
begin
if clear='1' then Q <= (others => '0');
elsif clock'event and clock='1' then
if load='1' then
Q <= I;
endif;
endif;
end;
end process;
end;
entity FIR4_Taps is
port( clk: in std_logic;
X: in signed(7 downto 0);
Y: out signed(15 downto 0)
);
end;
architecture arch of FIR4_Taps is
component DFF is
port( Q: out signed(15 downto 0);
clk: in std_logic;
D: in signed(15 downto 0)
);
end component;
-- H[-2,-1,3,4]
signal H0,H1,H2,H3: signed(7 downto 0);
signal MCM0,MCM1,MCM2,MCM3: signed(15 downto 0);
signal add1,add2,add3: signed(15 downto 0);
signal Q1,Q2,Q3: signed(15 downto 0);
begin
H0 <= to_signed(-2,8);
H1 <= to_signed(1,8);
H2 <= to_signed(3,8);
H3 <= to_signed(4,8);
MCM3 <= H3 * X;
MCM2 <= H2 * X;
MCM1 <= H1 * X;
MCM0 <= H0 * X;
add1 <= Q3 + MCM0;
add2 <= Q2 + MCM1;
add3 <= Q1 + MCM2;
dff1: DFF portmap(Q1,clk,MCM3);
dff2: DFF portmap(Q2,clk,add3);
dff3: DFF portmap(Q3,clk,add2);
process(clk)
begin
if (rising_edge(clk))
Y <= add1;
end if;
end;
end process;
end;
On désire réaliser un registre (structure entrant dans la réalisation des filtres) dont l'entité est fournie ci-après :
entity reg is
generic(n: natural :=2);
port( I: in std_logic_vector(n-1 downto 0);
clock: in std_logic;
load: in std_logic;
clear: in std_logic;
Q: out std_logic_vector(n-1 downto 0)
);
end reg;
Le raz est asynchrone et le chargement s'effectue sur un front montant du signal d'horloge clock.
On désire réaliser un mulplieur 2x2 bits produisant un résultat sur 4 bits à partir d'une suite d'additions et de décalages (méthode identique à la méthode manuelle) en utilisant un process et des variables.
Cet exercice vise à réaliser un filtre FIR à 4 cellules réalisé à partir de multiplieur cablés disponibles sur le circuit FPGA.
La description nécessite l'utilisation des bibliothèques suivantes:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
Avec le type:
type SIGNED is array (NATURAL range <>) of STD_LOGIC;
L'implémentation recherchée est donnée ci-contre avec X un vecteur de 8 bits et Y la sortie sur 16 bits.
Note: pour une synchronisation de la sortie avec l'horloge nous utiliserons une vascule supplémentaire (non représentée).
Pour réaliser ce filtre, on dispose d'un composant DFF bascule D-edge
travaillant sur des vecteurs de 16 bits et de la fonction TO_SIGNED
de la bibliothèque IEEE.NUMERIC_STD
ci-dessous:
-- null range array constants
constant NAU: UNSIGNED(0 downto 1) := (others => '0')
constant NAS: SIGNED(0 downto 1) := (others => '1')
-- implementation controls
-- default to emit warnings
constant NO_WARNING: BOOLEAN := FALSE;