Skip to content
Snippets Groups Projects
Commit 211f353d authored by Valentin RABIER's avatar Valentin RABIER
Browse files

test partie operative

parent 07f74a33
No related branches found
No related tags found
No related merge requests found
...@@ -2,25 +2,39 @@ ...@@ -2,25 +2,39 @@
## Diagramme de la FSM ## Diagramme de la FSM
![Diagramme de la FSM](./img/FSM.png) ![Diagramme de la FSM](./img/img.png)
## Questions ## Questions
### Question filtre 1 : Combien de processus sont utilisés et de quelles natures sont-ils ? Comment les différenciez-vous ? ### Question filtre 1 : Combien de processus sont utilisés et de quelles natures sont-ils ? Comment les différenciez-vous ?
Il y a Le code utilise deux processus distincts : un processus synchrone, déclenché par le signal d'horloge I_clock et le reset asynchrone I_reset, qui met à jour l’état courant avec l’état suivant (SR_nextState et SR_currentState sur la machine). Ce processus implémente le registre d’état de la machine. L’autre processus est combinatoire et calcule SR_nextState en fonction de l’état actuel et des entrées (I_inputSampleValid et I_processingDone) ; il décrit la logique de transition entre états.
On différencie ces processus par leurs sensibilités : le premier réagit à l’horloge (car il stocke un état), tandis que le second ne dépend que des entrées logiques (car il calcule l’évolution sans mémoire explicite).
### Question filtre 2 : La simulation vous permet-elle de valider votre description VHDL ? Justifiez. ### Question filtre 2 : La simulation vous permet-elle de valider votre description VHDL ? Justifiez.
Oui, la simulation permet de valider la description VHDL de l’unité de contrôle, car on observe la séquence de sortie du filtre, et on peut comparer les valeurs obtenues avec la séquence attendue (317, 476, 925, ...). On remarque que celles-ci sont identiques et cela confirme que l’unité de contrôle génère les bons signaux au bon moment pour piloter correctement le filtre séquentiel. La simulation est donc un outil clé pour vérifier le bon fonctionnement logique du système avant toute implémentation matérielle.
### Question filtre 3 : Validez-vous la conception de l’unité de contrôle ? ### Question filtre 3 : Validez-vous la conception de l’unité de contrôle ?
En testant notre code sur Xilinx Artix 7 FPGA, nous pouvons écouter différents sons fortement bruités puis leur appliquer notre filtre. La différence est flagrante et le son se voit nettement amélioré. Nous validons donc le design de l’unité de contrôle car celle-ci orchestre correctement les opérations internes du filtre.
### Question filtre 4 : Combien de processus sont utilisés et de quelles natures sont-ils ? ### Question filtre 4 : Combien de processus sont utilisés et de quelles natures sont-ils ?
On compte 4 processes dans le code OperativeUnit. On peut aussi expliciter leurs utilités:
- Processus shift : qui implémente un registre à décalage pour les échantillons d'entrée. Il est séquentiel car il s’active sur front montant ou sur signal de reset. En cas de I_loadShift = '1', décale les valeurs et insère I_inputSample en tête.
### Question filtre 5 : La simulation vous permet-elle de valider votre description VHDL ? Sinon, quel élément pose problème ? Comment pouvez-vous le corriger ? Justifiez
- processus incr_address : il gère les adresses de lecture pour les registres. Il est séquentiel car sensible à l’horloge et le reset. Il initialise ou charge la somme partielle selon les signaux de contrôle I_initSum et I_loadSum.
- processus sum_acc : il somme les résultats de la multiplication. Il est séquentiel car sensible à l’horloge et le reset.
- processus store_result : Stocke le résultat final de la convolution dans un registre. Il est séquentiel car sensible à l’horloge et le reset.Si I_loadOutput = '1', copie le contenu de SR_sum vers SR_filteredSample.
### Question filtre 5 : La simulation vous permet-elle de valider votre description VHDL ? Sinon, quel élément pose problème ? Comment pouvez-vous le corriger ? Justifiez
La simulation valide partiellement la description VHDL du filtre d’un point de vue logique et calculatoire. Toutefois, l’usage de troncatures dans les calculs peut induire des erreurs numériques non négligeables, notamment une perte de précision ou un bruit de quantification accru. Cela peut compromettre la fidélité du filtre. Pour corriger cela, il conviendrait d’augmenter la précision des signaux intermédiaires ou d’utiliser un arrondi contrôlé. Une comparaison avec un modèle en virgule flottante (type MATLAB) peut aider à évaluer l’impact exact de ces troncatures.
### Question filtre 6 : Validez-vous la conception de l’unité opérative ? Sinon, quel élément pose problème ? Comment pouvez-vous le corriger ? ### Question filtre 6 : Validez-vous la conception de l’unité opérative ? Sinon, quel élément pose problème ? Comment pouvez-vous le corriger ?
This diff is collapsed.
docs/img/FSM.png

115 KiB

This diff is collapsed.
...@@ -45,7 +45,7 @@ entity operativeUnit is ...@@ -45,7 +45,7 @@ entity operativeUnit is
I_incrAddress : in std_logic; -- Control signal to increment register read address I_incrAddress : in std_logic; -- Control signal to increment register read address
I_initSum : in std_logic; -- Control signal to initialize the MAC register I_initSum : in std_logic; -- Control signal to initialize the MAC register
I_loadSum : in std_logic; -- Control signal to load the MAC register; I_loadSum : in std_logic; -- Control signal to load the MAC register;
I_loadY : in std_logic; -- Control signal to load Y register I_loadOutput : in std_logic; -- Control signal to load Y register
O_processingDone : out std_logic; -- Indicate that processing is done O_processingDone : out std_logic; -- Indicate that processing is done
O_filteredSample : out std_logic_vector(15 downto 0) -- filtered sample O_filteredSample : out std_logic_vector(15 downto 0) -- filtered sample
); );
...@@ -86,7 +86,9 @@ begin ...@@ -86,7 +86,9 @@ begin
-- quantized_signal = round(min(max(signal * 2^(q-1), min_val), max_val)) / 2^(q-1); -- quantized_signal = round(min(max(signal * 2^(q-1), min_val), max_val)) / 2^(q-1);
-- end -- end
-- --
-- q=16 -- q=16SETUP MEE_VIVADO_CLASSROOM # sets up the environment (license, PATH)
-- --
-- fLPq= quantize(fLP,q); -- fLPq= quantize(fLP,q);
-- --
...@@ -120,17 +122,18 @@ begin ...@@ -120,17 +122,18 @@ begin
SR_shiftRegister <= (others => (others => '0')); SR_shiftRegister <= (others => (others => '0'));
elsif rising_edge(I_clock) then elsif rising_edge(I_clock) then
if I_loadShift = '1' then if I_loadShift = '1' then
for i in 15 downto 1 loop --for i in 15 downto 1 loop
SR_shiftRegister(i) <= SR_shiftRegister(i-1); -- SR_shiftRegister(i) <= SR_shiftRegister(i-1);
end loop; --end loop;
SR_shiftRegister(0) <= I_inputSample; SR_shiftRegister(1 to 15) <= SR_shiftRegister(0 to 14);
SR_shiftRegister(0) <= signed(I_inputSample);
end if; end if;
end if; end if;
end process shift; end process shift;
-- Process to describe the counter providing the selection adresses -- Process to describe the counter providing the selection adresses
-- of the multiplexers -- of the multiplexers
incr_address : process (I_reset,I_clck) is incr_address : process (I_reset,I_clock) is
begin begin
if I_reset = '1' then -- asynchronous reset (active high) if I_reset = '1' then -- asynchronous reset (active high)
SR_readAddress <= 0; SR_readAddress <= 0;
...@@ -145,10 +148,10 @@ begin ...@@ -145,10 +148,10 @@ begin
-- Signal detecting that the next cycle will be the one -- Signal detecting that the next cycle will be the one
-- providing the last product used to compute the convolution -- providing the last product used to compute the convolution
O_processingDone <= '1' when SR_readAddress = '15' else '0'; O_processingDone <= '1' when SR_readAddress = 14 else '0';
-- Signals connected with multiplexers (SIMPLY inferred with table indices) -- Signals connected with multiplexers (SIMPLY inferred with table indices)
SC_multOperand1 <= SR_shiftedRegister(SR_readAddress); -- 16 bits SC_multOperand1 <= SR_shiftRegister(SR_readAddress); -- 16 bits
SC_multOperand2 <= SR_coefRegister(SR_readAddress); -- 16 bits SC_multOperand2 <= SR_coefRegister(SR_readAddress); -- 16 bits
-- Multiplication of the operands -- Multiplication of the operands
...@@ -170,17 +173,17 @@ begin ...@@ -170,17 +173,17 @@ begin
elsif I_loadSum = '1' then elsif I_loadSum = '1' then
SR_sum <= SC_addResult; SR_sum <= SC_addResult;
end if; end if;
end if;cription end if;
end process sum_acc; end process sum_acc;
-- Register to store the final result if the loadOuput is active -- Register to store the final result if the loadOuput is active
store_result : process (_BLANK_) is store_result : process (I_reset,I_clock) is
begin begin
if I_reset = '1' then if I_reset = '1' then
SR_filteredSample <= (others => '0'); SR_filteredSample <= (others => '0');
elsif rising_edge (I_clock) then elsif rising_edge (I_clock) then
if I_loadY ='1' then if I_loadOutput ='1' then
SR_filteredSample <= SR_filteredSample <= signed(SC_addResult(30 downto 15));
end if; end if;
end if; end if;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment