Skip to content
Snippets Groups Projects
Commit 76c3f098 authored by Juliette DUMAS's avatar Juliette DUMAS
Browse files

TP2 audio

parent fe579534
Branches main
No related tags found
No related merge requests found
......@@ -7,19 +7,38 @@
## 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 ?
Nous avons utilisé 2 process. Un synchrone sur la clock qui gère le changement de l'état_présent à l'état_futur. L'autre qui calcule l'état futur en fonction de l'état présent et des conditions de transition/ des entrées.
### 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, nous avons bien la séquence attendue à l'issue du filtre et les changement d'états de la FSM sont logiques.
### Question filtre 3 : Validez-vous la conception de l’unité de contrôle ?
Oui.
### Question filtre 4 : Combien de processus sont utilisés et de quelles natures sont-ils ?
Il y a 4 process pour gérer chacun des registres, ils sont synchrones.
### 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 permet de valider une partie du comportement mais ne s'intéresse pas à la taille des outputs. Nous avons eu des problème lors de la synthèse. Nous avons alors du corriger la taille de SR_Y en prenant bien en compte la gestion de l'arrondit et en ne prenant que les bits de poids fort + le bit de signes. exemple ci dessous.
if I_loadY ='1' then
if SR_sum(6)= '1' then
SR_Y <= SR_sum(14 downto 7)+"00000001";
else
SR_Y <= SR_sum(14 downto 7);
end if;
end if;
### Question filtre 6 : Validez-vous la conception de l’unité opérative ? Sinon, quel élément pose problème ? Comment pouvez-vous le corriger ?
Oui,c'est identique au test précédent.
docs/img/FSM.png

115 KiB | W: | H:

docs/img/FSM.png

124 KiB | W: | H:

docs/img/FSM.png
docs/img/FSM.png
docs/img/FSM.png
docs/img/FSM.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -49,36 +49,65 @@ architecture archi_operativeUnit of controlUnit is
begin
process (_BLANK_) is
-- initialisation de l'état
process (I_reset,I_clock) is
begin
if I_reset = '1' then -- asynchronous reset (active high)
SR_presentState <= _BLANK_
SR_presentState <= WAIT_SAMPLE ;
elsif rising_edge(I_clock) then -- rising clock edge
_BLANK_
SR_presentState <= SR_futurState ;
end if;
end process;
process (_BLANK_) is
-- transition
process (SR_presentState,I_inputSampleValid,I_processingDone) is
begin
case SR_presentState is
when WAIT_SAMPLE =>
_BLANK_
if I_inputSampleValid = '1' then
SR_futurState <= STORE ;
else
SR_futurState <= WAIT_SAMPLE ;
end if;
when STORE =>
SR_futurState <= PROCESSING_LOOP ;
when PROCESSING_LOOP =>
if I_processingDone = '1' then
SR_futurState <= OUTPUT ;
else
SR_futurState <= PROCESSING_LOOP ;
end if;
when OUTPUT =>
SR_futurState <= WAIT_END_SAMPLE;
when WAIT_END_SAMPLE =>
if I_inputSampleValid = '0' then
SR_futurState <= WAIT_SAMPLE;
else
SR_futurState <= WAIT_END_SAMPLE ;
end if;
when others => null;
end case;
end process;
O_loadShift <= '1' when _BLANK_ ;
O_initAddress <= '1' when _BLANK_ ;
O_incrAddress <= '1' when _BLANK_ ;
O_initSum <= '1' when _BLANK_ ;
O_loadSum <= '1' when _BLANK_ ;
O_loadY <= '1' when _BLANK_ ;
O_FilteredSampleValid <= '1' when _BLANK_ ;
O_loadShift <= '1' when SR_presentState = STORE else '0' ;
O_initAddress <= '1' when SR_presentState = STORE else '0' ;
O_incrAddress <= '1' when SR_presentState = PROCESSING_LOOP else '0';
O_initSum <= '1' when SR_presentState = STORE else '0';
O_loadSum <= '1' when SR_presentState = PROCESSING_LOOP else '0' ;
O_loadY <= '1' when SR_presentState = OUTPUT else '0' ;
O_FilteredSampleValid <= '1' when SR_presentState = OUTPUT else '0' ;
end architecture archi_operativeUnit;
......@@ -85,42 +85,62 @@ begin
to_signed(2, 8)
);
shift : process (_BLANK_) is
shift : process (I_clock,I_reset) is
begin -- process shift
if I_reset = '1' then -- asynchronous reset (active high)
SR_shiftRegister <= (others => (others => '0'));
elsif _BLANK_
elsif rising_edge (I_clock) then
if I_loadShift ='1' then
SR_shiftRegister(0 to 14) <= SR_shiftRegister(1 to 15);
SR_shiftRegister(15) <= signed(I_inputSample);
end if;
end if;
end process shift;
end process shift;
incr_address : process (_BLANK_) is
incr_address : process (I_reset,I_clock) is
begin
if I_reset = '1' then -- asynchronous reset (active high)
SR_readAddress <= 0;
elsif _BLANK_
elsif rising_edge (I_clock) then
if I_incrAddress ='1' then
SR_readAddress <= SR_readAddress + 1;
elsif I_initAddress ='1' then
SR_readAddress <= 0;
end if;
end if;
end process incr_address;
O_processingDone <= '1' when _BLANK_ ;
O_processingDone <= '1' when SR_readAddress = 15 ;
SC_multOperand1 <= _BLANK_ ; -- 8 bits
SC_multOperand2 <= _BLANK_ ; -- 8 bits
SC_MultResult <= _BLANK_ ; -- 16 bits
SC_multOperand1 <= SR_shiftRegister(SR_readAddress) ; -- 8 bits
SC_multOperand2 <= SR_coefRegister( SR_readAddress); -- 8 bits
SC_MultResult <= SC_multOperand1*SC_multOperand2 ; -- 16 bits
SC_addResult <= resize(SC_MultResult, SC_addResult'length) + SR_sum;
sum_acc : process (_BLANK_) is
sum_acc : process (I_reset,I_clock) is
begin
if I_reset = '1' then -- asynchronous reset (active high)
SR_sum <= (others => '0');
elsif _BLANK_
elsif rising_edge (I_clock) then
if I_loadSum ='1' then
SR_sum <= SC_addResult;
elsif I_initSum ='1' then
SR_sum <= (others => '0');
end if;
end if;
end process sum_acc;
store_result : process (_BLANK_) is
store_result : process (I_clock) is
begin
_BLANK_
if rising_edge (I_clock) then
if I_loadY ='1' then
if SR_sum(6)= '1' then
SR_Y <= SR_sum(14 downto 7)+"00000001";
else
SR_Y <= SR_sum(14 downto 7);
end if;
end if;
end if;
end process store_result;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment