diff --git a/peripherals/hcsr04_ultrassonic_sensor/HCSR04.vhd b/peripherals/hcsr04_ultrassonic_sensor/HCSR04.vhd index 2d1f2144..56f7d2db 100644 --- a/peripherals/hcsr04_ultrassonic_sensor/HCSR04.vhd +++ b/peripherals/hcsr04_ultrassonic_sensor/HCSR04.vhd @@ -1,6 +1,6 @@ ------------------------------------------------------------------- -- Name : HCSR04.vhd --- Author : Suzi Yousif +-- Author : Suzi Yousif, Thiago de Lira -- Description : Ultrassonic Sensor HC-SR04 ------------------------------------------------------------------- library ieee; @@ -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( @@ -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 @@ -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; diff --git a/peripherals/hcsr04_ultrassonic_sensor/README.md b/peripherals/hcsr04_ultrassonic_sensor/README.md index db309884..f2b40794 100644 --- a/peripherals/hcsr04_ultrassonic_sensor/README.md +++ b/peripherals/hcsr04_ultrassonic_sensor/README.md @@ -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. - -

- -

- -Para isso, gerou-se uma [máquina de estados](HCSR04.vhd), representada na figura abaixo. -

- -

- +- 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. + +DIAGRAMA DE TEMPO![DiagramaTempo](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/ec08f287-c4fc-4ad3-9d37-afcda94749b8) + +- Para isso, gerou-se uma máquina de estados, representada na figura abaixo. + +MAQUINA DE ESTADOS![maquina_de_estados](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/d9e81335-5bad-4bd1-9e12-e6f57d76553d) + ## 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. - -

- -

- +- 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. +MONTAGEM DO CIRCUITO![Montagem_Circuito](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/b922cfb7-0732-47e0-84f6-5f686ca8940d) + ## 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. -

- -

- -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. +SIMULAÇÃO![SIMULAÇÃO](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/53c80034-e160-429f-b757-f160ba7e3769) + +## Teste Prático +### Distância de 05 cm. +![osc_small_onda](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/1ae7c6e8-e484-4fdb-81b3-f5fc703d5f0d) + +### Distância de 15 cm. +![osc_big_onda](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/bfcf183d-06a4-4807-a2d7-b30557ede34b) + +### Disposição Trig & Echo +![osc_2_onda](https://github.com/lirahc/hcsr04_pld_ultrassonic/assets/49963038/91d3e51a-c8cf-45a9-a008-ebd8bd8690b5) + ## 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) - - diff --git a/peripherals/hcsr04_ultrassonic_sensor/sint_old/de10_lite/de0_lite.vhd b/peripherals/hcsr04_ultrassonic_sensor/sint_old/de10_lite/de0_lite.vhd index 60505fe4..454945ed 100644 --- a/peripherals/hcsr04_ultrassonic_sensor/sint_old/de10_lite/de0_lite.vhd +++ b/peripherals/hcsr04_ultrassonic_sensor/sint_old/de10_lite/de0_lite.vhd @@ -1,6 +1,6 @@ ------------------------------------------------------------------- -- Name : de0_lite.vhd --- Author : Suzi Yousif +-- Author : -- Version : 0.1 -- Copyright : Departamento de Eletrônica, Florianópolis, IFSC -- Description : Projeto base DE10-Lite @@ -12,259 +12,325 @@ use ieee.numeric_std.all; use work.decoder_types.all; entity de0_lite is - generic ( - --! Num of 32-bits memory words - IMEMORY_WORDS : integer := 1024; --!= 4K (1024 * 4) bytes - DMEMORY_WORDS : integer := 1024 --!= 2k (512 * 2) bytes - ); - port ( - ---------- CLOCK ---------- - ADC_CLK_10: in std_logic; - MAX10_CLK1_50: in std_logic; - MAX10_CLK2_50: in std_logic; - - ----------- SDRAM ------------ - DRAM_ADDR: out std_logic_vector (12 downto 0); - DRAM_BA: out std_logic_vector (1 downto 0); - DRAM_CAS_N: out std_logic; - DRAM_CKE: out std_logic; - DRAM_CLK: out std_logic; - DRAM_CS_N: out std_logic; - DRAM_DQ: inout std_logic_vector(15 downto 0); - DRAM_LDQM: out std_logic; - DRAM_RAS_N: out std_logic; - DRAM_UDQM: out std_logic; - DRAM_WE_N: out std_logic; - - ----------- SEG7 ------------ - HEX0: out std_logic_vector(7 downto 0); - HEX1: out std_logic_vector(7 downto 0); - HEX2: out std_logic_vector(7 downto 0); - HEX3: out std_logic_vector(7 downto 0); - HEX4: out std_logic_vector(7 downto 0); - HEX5: out std_logic_vector(7 downto 0); - - ----------- KEY ------------ - KEY: in std_logic_vector(1 downto 0); - - ----------- LED ------------ - LEDR: out std_logic_vector(9 downto 0); - - ----------- SW ------------ - SW: in std_logic_vector(9 downto 0); - - ----------- VGA ------------ - VGA_B: out std_logic_vector(3 downto 0); - VGA_G: out std_logic_vector(3 downto 0); - VGA_HS: out std_logic; - VGA_R: out std_logic_vector(3 downto 0); - VGA_VS: out std_logic; - - ----------- Accelerometer ------------ - GSENSOR_CS_N: out std_logic; - GSENSOR_INT: in std_logic_vector(2 downto 1); - GSENSOR_SCLK: out std_logic; - GSENSOR_SDI: inout std_logic; - GSENSOR_SDO: inout std_logic; - - ----------- Arduino ------------ - ARDUINO_IO: inout std_logic_vector(15 downto 0); - ARDUINO_RESET_N: inout std_logic - ); + generic ( + --! Num of 32-bits memory words + IMEMORY_WORDS : integer := 1024; --!= 4K (1024 * 4) bytes + DMEMORY_WORDS : integer := 1024 --!= 2k (512 * 2) bytes + ); + port ( + ---------- CLOCK ---------- + ADC_CLK_10: in std_logic; + MAX10_CLK1_50: in std_logic; + MAX10_CLK2_50: in std_logic; + + ----------- SDRAM ------------ + DRAM_ADDR: out std_logic_vector (12 downto 0); + DRAM_BA: out std_logic_vector (1 downto 0); + DRAM_CAS_N: out std_logic; + DRAM_CKE: out std_logic; + DRAM_CLK: out std_logic; + DRAM_CS_N: out std_logic; + DRAM_DQ: inout std_logic_vector(15 downto 0); + DRAM_LDQM: out std_logic; + DRAM_RAS_N: out std_logic; + DRAM_UDQM: out std_logic; + DRAM_WE_N: out std_logic; + + ----------- SEG7 ------------ + HEX0: out std_logic_vector(7 downto 0); + HEX1: out std_logic_vector(7 downto 0); + HEX2: out std_logic_vector(7 downto 0); + HEX3: out std_logic_vector(7 downto 0); + HEX4: out std_logic_vector(7 downto 0); + HEX5: out std_logic_vector(7 downto 0); + + ----------- KEY ------------ + KEY: in std_logic_vector(1 downto 0); + + ----------- LED ------------ + LEDR: out std_logic_vector(9 downto 0); + + ----------- SW ------------ + SW: in std_logic_vector(9 downto 0); + + ----------- VGA ------------ + VGA_B: out std_logic_vector(3 downto 0); + VGA_G: out std_logic_vector(3 downto 0); + VGA_HS: out std_logic; + VGA_R: out std_logic_vector(3 downto 0); + VGA_VS: out std_logic; + + ----------- Accelerometer ------------ + GSENSOR_CS_N: out std_logic; + GSENSOR_INT: in std_logic_vector(2 downto 1); + GSENSOR_SCLK: out std_logic; + GSENSOR_SDI: inout std_logic; + GSENSOR_SDO: inout std_logic; + + ----------- Arduino ------------ + ARDUINO_IO: inout std_logic_vector(15 downto 0); + ARDUINO_RESET_N: inout std_logic + ); end entity; + + architecture rtl of de0_lite is + -- Clocks and reset + signal clk : std_logic; + signal rst : std_logic; + signal clk_50MHz : std_logic; + -- PLL signals + signal locked_sig : std_logic; + + -- Instruction bus signals + signal idata : std_logic_vector(31 downto 0); + signal iaddress : unsigned(15 downto 0); + signal address : std_logic_vector (9 downto 0); + + -- Data bus signals + signal daddress : unsigned(31 downto 0); + signal ddata_r : std_logic_vector(31 downto 0); + signal ddata_w : std_logic_vector(31 downto 0); + signal ddata_r_mem : std_logic_vector(31 downto 0); + signal dmask : std_logic_vector(3 downto 0); + signal dcsel : std_logic_vector(1 downto 0); + signal d_we : std_logic; + signal d_rd : std_logic; + signal d_sig : std_logic; + + -- SDRAM signals + signal ddata_r_sdram : std_logic_vector(31 downto 0); + + -- CPU state signals + signal state : cpu_state_t; + signal div_result : std_logic_vector(31 downto 0); + + -- I/O signals + signal gpio_input : std_logic_vector(31 downto 0); + signal gpio_output : std_logic_vector(31 downto 0); + + -- Peripheral data signals + signal ddata_r_gpio : std_logic_vector(31 downto 0); + signal ddata_r_timer : std_logic_vector(31 downto 0); + signal ddata_r_periph : std_logic_vector(31 downto 0); + signal ddata_r_segments : std_logic_vector(31 downto 0); + signal ddata_r_uart : std_logic_vector(31 downto 0); + signal ddata_r_adc : std_logic_vector(31 downto 0); + signal ddata_r_i2c : std_logic_vector(31 downto 0); + signal ddata_r_dig_fil : std_logic_vector(31 downto 0); + signal ddata_r_stepmot : std_logic_vector(31 downto 0); + signal ddata_r_lcd : std_logic_vector(31 downto 0); + signal ddata_r_nn_accelerator : std_logic_vector(31 downto 0); + signal ddata_r_fir_fil : std_logic_vector(31 downto 0); + signal ddata_r_spwm : std_logic_vector(31 downto 0); + signal ddata_r_crc : std_logic_vector(31 downto 0); + signal ddata_r_key : std_logic_vector(31 downto 0); + signal ddata_r_hcsr04 : std_logic_vector(31 downto 0); + + -- Interrupt Signals + signal interrupts : std_logic_vector(31 downto 0); + signal gpio_interrupts : std_logic_vector(6 downto 0); + signal timer_interrupt : std_logic_vector(5 downto 0); + signal ifcap : std_logic; -- + + -- I/O signals + signal input_in : std_logic_vector(31 downto 0); - signal clk : std_logic; - signal rst : std_logic; - - -- Instruction bus signals - signal idata : std_logic_vector(31 downto 0); - signal iaddress : integer range 0 to IMEMORY_WORDS-1 := 0; - signal address : std_logic_vector (9 downto 0); - - -- Data bus signals - signal daddress : integer range 0 to DMEMORY_WORDS-1; - signal ddata_r : std_logic_vector(31 downto 0); - signal ddata_w : std_logic_vector(31 downto 0); - signal dmask : std_logic_vector(3 downto 0); - signal dcsel : std_logic_vector(1 downto 0); - signal d_we : std_logic := '0'; - - signal ddata_r_mem : std_logic_vector(31 downto 0); - signal d_rd : std_logic; - - -- I/O signals - signal ddata_r_gpio : std_logic_vector(31 downto 0); - - -- PLL signals - signal locked_sig : std_logic; - - -- CPU state signals - signal state : cpu_state_t; - signal d_sig : std_logic; - signal gpio_input : std_logic; - signal gpio_output : std_logic; - - -- Display variables - type displays_type is array (0 to 5) of std_logic_vector(3 downto 0); - type displays_out_type is array (0 to 5) of std_logic_vector(7 downto 0); - signal displays : displays_type; - signal displays_out : displays_out_type; - begin - pll_inst: entity work.pll - port map( - areset => '0', - inclk0 => ADC_CLK_10, - c0 => clk, - locked => locked_sig - ); - - -- Dummy out signals - rst <= SW(9); - LEDR(9) <= SW(9); - - -- IMem shoud be read from instruction and data buses - -- Not enough RAM ports for instruction bus, data bus and in-circuit programming - instr_mux: entity work.instructionbusmux - generic map( - IMEMORY_WORDS => IMEMORY_WORDS, - DMEMORY_WORDS => DMEMORY_WORDS - ) - port map( - d_rd => d_rd, - dcsel => dcsel, - daddress => daddress, - iaddress => iaddress, - address => address - ); - - -- 32-bits x 1024 words quartus RAM (dual port: portA -> riscV, portB -> In-System Mem Editor - iram_quartus_inst: entity work.iram_quartus - port map( - address => address, - byteena => "1111", - clock => clk, - data => (others => '0'), - wren => '0', - q => idata - ); - - -- Data Memory RAM - dmem: entity work.dmemory - generic map( - MEMORY_WORDS => DMEMORY_WORDS - ) - port map( - rst => rst, - clk => clk, - data => ddata_w, - address => daddress, - we => d_we, - csel => dcsel(0), - dmask => dmask, - signal_ext => d_sig, - q => ddata_r_mem - ); - - -- Adress space mux ((check sections.ld) -> Data chip select: - -- 0x00000 -> Instruction memory - -- 0x20000 -> Data memory - -- 0x40000 -> Input/Output generic address space - -- ( ... ) -> ( ... ) - datamux: entity work.databusmux - port map( - dcsel => dcsel, - idata => idata, - ddata_r_mem => ddata_r_mem, - ddata_r_gpio => ddata_r_gpio, - ddata_r => ddata_r - ); - - -- Softcore instatiation - myRisc: entity work.core - generic map( - IMEMORY_WORDS => IMEMORY_WORDS, - DMEMORY_WORDS => DMEMORY_WORDS - ) - port map( - clk => clk, - rst => rst, - iaddress => iaddress, - idata => idata, - daddress => daddress, - ddata_r => ddata_r, - ddata_w => ddata_w, - d_we => d_we, - d_rd => d_rd, - d_sig => d_sig, - dcsel => dcsel, - dmask => dmask, - state => state - ); - - HCSR04_inst: entity work.HCSR04 - generic map( - MY_CHIPSELECT => "10", - MY_WORD_ADDRESS => x"10" - ) - port map( - clk => clk, - rst => SW(8), - daddress => daddress, - ddata_w => ddata_w, - ddata_r => ddata_r_gpio, - d_we => d_we, - d_rd => d_rd, - dcsel => dcsel, - dmask => dmask, - echo => gpio_input, - Trig => gpio_output - ); - - -- Connect input hardware to gpio data - gpio_input <= ARDUINO_IO(0); - - -- Connect gpio data to output hardware - ARDUINO_IO(1) <= gpio_output; - - -- Display - hex_gen : for i in 0 to 5 generate - hex_dec : entity work.display_dec - port map( - data_in => displays(i), - disp => displays_out(i) - ); - end generate; - - HEX0 <= displays_out(0); - HEX1 <= displays_out(1); - HEX2 <= displays_out(2); - HEX3 <= displays_out(3); - HEX4 <= displays_out(4); - HEX5 <= displays_out(5); - - display : process (clk, rst) is - begin - if rst = '1' then - for i in 0 to 5 loop - displays(i) <= (others => '0'); - end loop; - elsif rising_edge(clk) then - if (d_we = '1') and (dcsel = "10")then - if to_unsigned(daddress, 32)(8 downto 0) = x"02" then -- OUT_SEGS - displays(0) <= ddata_w(3 downto 0); - displays(1) <= ddata_w(7 downto 4); - displays(2) <= ddata_w(11 downto 8); - displays(3) <= ddata_w(15 downto 12); - displays(4) <= ddata_w(19 downto 16); - displays(5) <= ddata_w(23 downto 20); - end if; - end if; - end if; - end process display; - + -- Reset + rst <= SW(9); + LEDR(9) <= SW(9); + + -- Clocks + pll_inst : entity work.pll + port map( + areset => '0', + inclk0 => MAX10_CLK1_50, + c0 => clk, + c1 => clk_50MHz, + locked => locked_sig + ); + + -- 32-bits x 1024 words quartus RAM (dual port: portA -> riscV, portB -> In-System Mem Editor + iram_quartus_inst: entity work.iram_quartus + port map( + address => address, + byteena => "1111", + clock => clk, + data => (others => '0'), + wren => '0', + q => idata + ); + + -- IMem shoud be read from instruction and data buses + -- Not enough RAM ports for instruction bus, data bus and in-circuit programming + instr_mux: entity work.instructionbusmux + port map( + d_rd => d_rd, + dcsel => dcsel, + daddress => daddress, + iaddress => iaddress, + address => address + ); + + -- Data Memory RAM + dmem: entity work.dmemory + generic map( + MEMORY_WORDS => DMEMORY_WORDS + ) + port map( + rst => rst, + clk => clk, + data => ddata_w, + address => daddress, + we => d_we, + csel => dcsel(0), + dmask => dmask, + signal_ext => d_sig, + q => ddata_r_mem + ); + + -- Adress space mux ((check sections.ld) -> Data chip select: + -- 0x00000 -> Instruction memory + -- 0x20000 -> Data memory + -- 0x40000 -> Input/Output generic address space + -- ( ... ) -> ( ... ) + datamux: entity work.databusmux + port map( + dcsel => dcsel, + idata => idata, + ddata_r_mem => ddata_r_mem, + ddata_r_periph => ddata_r_periph, + ddata_r_sdram =>ddata_r_sdram, + ddata_r => ddata_r + ); + + -- Softcore instatiation + myRiscv : entity work.core + port map( + clk => clk, + rst => rst, + clk_32x => clk_50MHz, + iaddress => iaddress, + idata => idata, + daddress => daddress, + ddata_r => ddata_r, + ddata_w => ddata_w, + d_we => d_we, + d_rd => d_rd, + d_sig => d_sig, + dcsel => dcsel, + dmask => dmask, + interrupts=>interrupts, + state => state + ); + + -- IRQ lines + interrupts(24 downto 18) <= gpio_interrupts(6 downto 0); + interrupts(30 downto 25) <= timer_interrupt; + + io_data_bus_mux: entity work.iodatabusmux + port map( + daddress => daddress, + ddata_r_gpio => ddata_r_gpio, + ddata_r_segments => ddata_r_segments, + ddata_r_uart => ddata_r_uart, + ddata_r_adc => ddata_r_adc, + ddata_r_i2c => ddata_r_i2c, + ddata_r_timer => ddata_r_timer, + ddata_r_periph => ddata_r_periph, + ddata_r_dif_fil => ddata_r_dig_fil, + ddata_r_stepmot => ddata_r_stepmot, + ddata_r_lcd => ddata_r_lcd, + ddata_r_fir_fil => ddata_r_fir_fil, + ddata_r_nn_accelerator => ddata_r_nn_accelerator, + ddata_r_spwm => ddata_r_spwm, + ddata_r_crc => ddata_r_crc, + ddata_r_key => ddata_r_key + ); + + generic_gpio: entity work.gpio + port map( + clk => clk, + rst => rst, + daddress => daddress, + ddata_w => ddata_w, + ddata_r => ddata_r_gpio, + d_we => d_we, + d_rd => d_rd, + dcsel => dcsel, + dmask => dmask, + input => gpio_input, + output => gpio_output, + gpio_interrupts => gpio_interrupts + ); + + -- Timer instantiation + timer : entity work.Timer + generic map( + prescaler_size => 16, + compare_size => 32 + ) + port map( + clock => clk, + reset => rst, + daddress => daddress, + ddata_w => ddata_w, + ddata_r => ddata_r_timer, + d_we => d_we, + d_rd => d_rd, + dcsel => dcsel, + dmask => dmask, + timer_interrupt => timer_interrupt, + ifcap => ifcap -- + ); + + generic_displays : entity work.led_displays + port map( + clk => clk, + rst => rst, + daddress => daddress, + ddata_w => ddata_w, + ddata_r => ddata_r_segments, + d_we => d_we, + d_rd => d_rd, + dcsel => dcsel, + dmask => dmask, + hex0 => HEX0, + hex1 => HEX1, + hex2 => HEX2, + hex3 => HEX3, + hex4 => HEX4, + hex5 => HEX5, + hex6 => open, + hex7 => open + ); + + HCSR04_inst: entity work.HCSR04 + generic map( + MY_CHIPSELECT => "10", + MY_WORD_ADDRESS => x"10" + ) + port map( + clk => clk, + rst => rst, + daddress => daddress, + ddata_w => ddata_w, + ddata_r => ddata_r_hcsr04, + d_we => d_we, + d_rd => d_rd, + dcsel => dcsel, + dmask => dmask, + --echo => ARDUINO_IO(0), + echo => d_we, + Trig => ARDUINO_IO(1) + ); + + -- Connect input hardware to gpio data + gpio_input(3 downto 0) <= SW(3 downto 0); + LEDR(7 downto 0) <= gpio_output(7 downto 0); + end; diff --git a/peripherals/hcsr04_ultrassonic_sensor/testbench.do b/peripherals/hcsr04_ultrassonic_sensor/testbench.do index 449ae027..0bbf6f50 100644 --- a/peripherals/hcsr04_ultrassonic_sensor/testbench.do +++ b/peripherals/hcsr04_ultrassonic_sensor/testbench.do @@ -33,8 +33,8 @@ vcom ../../core/core.vhd vcom ../../core/txt_util.vhdl vcom ../../core/trace_debug.vhd vcom testbench.vhd - -vsim -t ns work.coretestbench +vsim -voptargs="+acc" -t ns work.coretestbench +#vsim -t ns work.coretestbench view wave add wave -radix binary -label clk /clk diff --git a/peripherals/hcsr04_ultrassonic_sensor/testbench2.do b/peripherals/hcsr04_ultrassonic_sensor/testbench2.do index 840aaaf4..7dcf2da2 100644 --- a/peripherals/hcsr04_ultrassonic_sensor/testbench2.do +++ b/peripherals/hcsr04_ultrassonic_sensor/testbench2.do @@ -13,8 +13,8 @@ vlib work vcom HCSR04.vhd testbench2.vhd #Simula (work é o diretorio, testbench é o nome da entity) -vsim -voptargs="+acc" -t ns work.hcsr04_testbench - +#vsim -t ns work.testbenchlira +vsim -voptargs="+acc" -t ns work.testbenchlira #Mosta forma de onda view wave @@ -27,10 +27,9 @@ add wave -label rst /rst add wave -label echo /echo add wave -label Trig /Trig add wave -label state -radix unsigned /HCSR04_inst/state -add wave -label counter -radix unsigned /HCSR04_inst/counter add wave -label measure_ms -radix unsigned /HCSR04_inst/measure_ms add wave -label echo_counter -radix unsigned /HCSR04_inst/echo_counter - +add wave -label echo_wait -radix unsigned /HCSR04_inst/echo_wait run 10 ms diff --git a/peripherals/hcsr04_ultrassonic_sensor/testbench2.vhd b/peripherals/hcsr04_ultrassonic_sensor/testbench2.vhd index 877f3321..792b3721 100644 --- a/peripherals/hcsr04_ultrassonic_sensor/testbench2.vhd +++ b/peripherals/hcsr04_ultrassonic_sensor/testbench2.vhd @@ -1,6 +1,6 @@ --------------------------------------------------------------------- -- Name : testbench2.vhd --- Author : Suzi Yousif +-- Author : Thiago de Lira -- Description : A simple testbench for Ultrassonic Sensor HC-SR04. -- This test was made to check the state machine and -- the variable 'measure_ms'. @@ -11,13 +11,13 @@ library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; -entity hcsr04_testbench is -end entity hcsr04_testbench; +entity testbenchlira is +end entity testbenchlira; -architecture RTL of hcsr04_testbench is +architecture RTL of testbenchlira is signal clk : std_logic; signal rst : std_logic; - signal daddress : unsigned(31 downto 0); + signal daddress :unsigned(31 downto 0); signal ddata_r : std_logic_vector(31 downto 0); signal ddata_w : std_logic_vector(31 downto 0); signal dmask : std_logic_vector(3 downto 0); @@ -28,6 +28,8 @@ architecture RTL of hcsr04_testbench is -- I/O signals signal echo : std_logic; signal Trig : std_logic; + + begin HCSR04_inst : entity work.HCSR04 @@ -47,10 +49,15 @@ begin dmask => dmask, echo => echo, Trig => Trig + ); clock_driver : process constant period : time := 10000 ns; + + -- Simulation constants + constant ECHO_TIMEOUT : integer := 1000; + constant MEASUREMENT_CYCLE : integer := 60000; begin clk <= '0'; wait for period / 2; @@ -65,8 +72,8 @@ begin rst <= '0'; wait; end process reset; + -- echo <= '0', '1' after 800000 ns, '0' after 850000 ns; + echo <= '0', '1' after 800000 ns, '0' after 1070000 ns; - echo <= '0', '1' after 600000 ns, '0' after 950000 ns; - -- echo <= '1';--, '1' after 600000 ns, '0' after 950000 ns; end architecture RTL;