Skip to content

Commit

Permalink
Fix conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
xtarke committed Dec 19, 2023
2 parents 011e011 + 8161965 commit bf12b57
Show file tree
Hide file tree
Showing 6 changed files with 420 additions and 371 deletions.
131 changes: 57 additions & 74 deletions peripherals/hcsr04_ultrassonic_sensor/HCSR04.vhd
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
-------------------------------------------------------------------
-- Name : HCSR04.vhd
-- Author : Suzi Yousif
-- Author : Suzi Yousif, Thiago de Lira
-- Description : Ultrassonic Sensor HC-SR04
-------------------------------------------------------------------
library ieee;
Expand All @@ -12,7 +12,7 @@ entity HCSR04 is
--! Chip selec
MY_CHIPSELECT : std_logic_vector(1 downto 0) := "10";
MY_WORD_ADDRESS : unsigned(7 downto 0) := x"10";
DADDRESS_BUS_SIZE : integer := 32 --! Data bus size
DADDRESS_BUS_SIZE : integer := 32
);

port(
Expand All @@ -26,35 +26,29 @@ entity HCSR04 is
ddata_r : out std_logic_vector(31 downto 0);
d_we : in std_logic;
d_rd : in std_logic;
dcsel : in std_logic_vector(1 downto 0); --! Chip select
dcsel : in std_logic_vector(1 downto 0); --! Chip select
-- ToDo: Module should mask bytes (Word, half word and byte access)
dmask : in std_logic_vector(3 downto 0); --! Byte enable mask

-- hardware input/output signals
echo : in std_logic;
trig : out std_logic;

state_debug : out std_logic_vector(7 downto 0)
Trig : out std_logic
);
end entity HCSR04;

architecture RTL of HCSR04 is
type state_type is (IDLE, TRIG_STATE, SONIC_BURST, ECHO_STATE, REGISTER_STATE);
type state_type is (Idle, Trig_state, Sonic_Burst, Echo_state, Register_state);
signal state : state_type;

signal counter : unsigned (31 downto 0);
signal echo_counter : unsigned (31 downto 0);

signal echo_counter : unsigned (31 downto 0);
signal echo_wait : unsigned (7 downto 0);
signal measure_ms : unsigned (31 downto 0);

-- Simulation constants
-- constant ECHO_TIMEOUT : integer := 100;
-- constant MEASUREMENT_CYCLE : integer := 600;

-- Real hardware constants
-- Cycles to wait for echo signal (CLK = 1MHz, 1ms => 1k)
constant ECHO_TIMEOUT : integer := 1000;
-- Cycles to wait for new measurement cycle (datahsheet) (CLK = 1MHz, 60ms => 60k)
constant MEASUREMENT_CYCLE : integer := 60000;
--
constant ECHO_TIMEOUT : integer := 100;
constant MEASUREMENT_CYCLE : integer := 600;

begin
-- Input register
Expand All @@ -74,77 +68,66 @@ begin
state_transation: process(clk, rst) is
begin
if rst = '1' then
state <= IDLE;
state <= Idle;
echo_wait <= to_unsigned(0, 8);
echo_counter <= to_unsigned(0, 32);

measure_ms <= to_unsigned(0, 32);
Trig <= '0';

counter <= (others => '0');
echo_counter <= (others => '0');
measure_ms <= (others => '0');

elsif rising_edge(clk) then
case state is
when IDLE =>

when Idle =>
Trig <= '0';
echo_counter <= to_unsigned(0, 32);

counter <= (others => '0');
echo_counter <= (others => '0');
state <= TRIG_STATE;

when TRIG_STATE =>
counter <= counter + 1;

if counter > x"0b" then
state <= SONIC_BURST;
counter <= (others => '0');
end if;
state <= Trig_state;

when Trig_state =>

Trig <= '1';

when SONIC_BURST =>

counter <= counter + 1;

if (counter > to_unsigned(ECHO_TIMEOUT, counter'length)) then
state <= REGISTER_STATE;
counter <= (others => '0');
elsif (echo = '1') then
state <= ECHO_STATE;
if counter > x"10" then
state <= Sonic_Burst;
counter <= (others => '0');
end if;

when ECHO_STATE =>
counter <= counter + 1;

if (echo = '1') then
echo_counter <= echo_counter + 1;
end if;
when Sonic_Burst =>
Trig <= '0';

if (counter > to_unsigned(MEASUREMENT_CYCLE, counter'length)) then
state <= REGISTER_STATE;
counter <= (others => '0');
end if;
counter <= counter + 1;
--if counter > x"0b" then

when REGISTER_STATE =>
measure_ms <= echo_counter;
state <= IDLE;
if echo <= '1' then
state <= Echo_state;
counter <= (others => '0');
end if;

end case;
end if;
end process;
if counter > to_unsigned (ECHO_TIMEOUT,counter'length)then
state <= Register_State;
end if;
--end if;

when Echo_state =>
if (echo = '1') then
echo_counter <= echo_counter + 1;
end if;

moore: process(state)
begin
state_debug <= x"00";
trig <= '0';

case state is
when IDLE =>
state_debug <= x"01";
when TRIG_STATE =>
state_debug <= x"02";
trig <= '1';
when SONIC_BURST =>
state_debug <= x"03";
when ECHO_STATE =>
state_debug <= x"04";
when REGISTER_STATE =>
state_debug <= x"05";
end case;
end process;
counter <= counter + 1;
if counter > to_unsigned (MEASUREMENT_CYCLE,counter'length) then
state <= Register_State;
end if;

when Register_State =>
measure_ms <= echo_counter;
state <= Idle;

end case;
end if;
end process;
end architecture RTL;
64 changes: 29 additions & 35 deletions peripherals/hcsr04_ultrassonic_sensor/README.md
Original file line number Diff line number Diff line change
@@ -1,42 +1,36 @@
# Sensor Ultrassônico HC-SR04

Esta é uma implementação de uso do periférico [HC-SR04](https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf), o qual é um sensor ultrassônica. O funcionamento dele é descrito conforme apresentado no diagrama abaixo. Primeiro é enviado um pulso de *trigger* de 10 us. Posteriormente é recebido um sinal de *echo*, em que sua largura é proporcional à distância do sensor a um objeto específico.

<p align="center">
<img width="80%" height="50%" src="Figures/DiagramaTempo.png">
</p>

Para isso, gerou-se uma [máquina de estados](HCSR04.vhd), representada na figura abaixo.
<p align="center">
<img width="80%" height="30%" src="Figures/FSM.png">
</p>

- Esta é uma implementação de uso do periférico [HC-SR04](https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf), o qual é um sensor ultrassônica. O funcionamento dele é descrito conforme apresentado no diagrama abaixo. Primeiro é enviado um pulso de trigger de 10 us. Posteriormente é recebido um sinal de echo, em que sua largura é proporcional à distância do sensor a um objeto específico.

<kbd>DIAGRAMA DE TEMPO![DiagramaTempo](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/ec08f287-c4fc-4ad3-9d37-afcda94749b8)</kbd>

- Para isso, gerou-se uma máquina de estados, representada na figura abaixo.

<kbd>MAQUINA DE ESTADOS![maquina_de_estados](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/d9e81335-5bad-4bd1-9e12-e6f57d76553d)</kbd>

## Simulação
Para a simulação, gerou-se dois arquivos de teste. Um sem o arquivo de memória [testbench2.vhd](testbench2.vhd) , onde é possível visualizar a mudança dos estados e o contador de pulsos do sinal de entrada *echo*. O outro arquivo é com o uso da arquitetura RiscV [testbench.vhd](testbench.vhd).


- Para a simulação, gerou-se dois arquivos de teste. O arquivo [testbench2.vhd](/peripherals/hcsr04_ultrassonic_sensor) , sendo possível visualizar a mudança dos estados e o contador de pulsos do sinal de entrada echo.

## Montagem do circuito
Este sensor necessita de tensão de entrada de 5V para seu funcionamento adequado. Por isso, para a montagem do circuito, utilizou-se um conversor de nível lógico de 5V a 3V3 bidirecional, conforme apresentado abaixo.

Os pinos *echo* e *trigger* são conectados aos pinos do `ARDUINO_IO 0` e `1`, respectivamente.

<p align="center">
<img width="100%" height="50%" src="Figures/Montagem_Circuito.png">
</p>

- Este sensor necessita de tensão de entrada de 5V para seu funcionamento adequado. Por isso, para a montagem do circuito, utilizou-se um conversor de nível lógico de 5V a 3V3 bidirecional, conforme apresentado abaixo.
- Os pinos echo e trigger são conectados aos pinos do ARDUINO_IO 0 e 1, respectivamente.
<kbd>MONTAGEM DO CIRCUITO![Montagem_Circuito](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/b922cfb7-0732-47e0-84f6-5f686ca8940d)<kbd>

## Resultados da síntese
A figura abaixo foi retirado com o auxílio de um analisador lógico. Nesta, pode ser visto o sinal de *trigger* de 10 us e o sinal de *echo* gerado pelo sensor.
<p align="center">
<img width="100%" height="50%" src="Figures/Analisador.png">
</p>

Para melhor visualização dos resultados na placa, foram utilizados [os displays 7 segmentos](../disp7seg/display_dec.vhd). A saída é equivalente à quantidade de ciclos de 10 us, a qual aumenta com o aumento da distância do objeto.

- A figura abaixo foi retirado com o auxílio de um analisador lógico. Nesta, pode ser visto o sinal de trigger de 10 us e o sinal de echo gerado pelo sensor.
<kbd>SIMULAÇÃO![SIMULAÇÃO](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/53c80034-e160-429f-b757-f160ba7e3769)<kbd>

## Teste Prático
### Distância de 05 cm.
<kbd>![osc_small_onda](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/1ae7c6e8-e484-4fdb-81b3-f5fc703d5f0d)<kbd>

### Distância de 15 cm.
<kbd>![osc_big_onda](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/bfcf183d-06a4-4807-a2d7-b30557ede34b)<kbd>

### Disposição Trig & Echo
<kbd>![osc_2_onda](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/91d3e51a-c8cf-45a9-a008-ebd8bd8690b5)<kbd>

## ToDo
Na síntese, observou-se que após um determinado tempo, ele parava de realizar a contagem e necessitava de *reset*. Por isso, posteriormente é necessário analisar o sinal de *echo* no osciloscópio para verificar uma possível perda de descida deste sinal.
- Na síntese, observou-se que após um determinado tempo, ele parava de realizar a contagem e necessitava de reset. Por isso, posteriormente é necessário analisar o sinal de echo no osciloscópio para verificar uma possível perda de descida deste sinal. Sendo assim, o *Trigger* funciona num período de 10us sendo o período de 60ms do sistema, antes disso o sistema está em *Idle*, após o período de Trigger o sistema está enable e o sinal *Echo* está disponível para captação do sinal para validação do sensor, como pode ser visto na figura a seguir o sistema.


## Referências
* [HC-SR04 Datasheet](https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf)



Loading

0 comments on commit bf12b57

Please sign in to comment.