diff --git a/peripherals/semaforo/BCD_to_7seg_display.vhd b/peripherals/semaforo/BCD_to_7seg_display.vhd new file mode 100644 index 00000000..a58de59c --- /dev/null +++ b/peripherals/semaforo/BCD_to_7seg_display.vhd @@ -0,0 +1,42 @@ +------------------------------------------------------------------- +-- Name : BCD_to_7seg_display.vhd +-- Author : Elvis Fernandes +-- Version : 0.1 +-- Copyright : Departamento de Eletrônica, Florianópolis, IFSC +-- Description : Tarefa 11: subprogramas +-- Date : 11/07/2024 +------------------------------------------------------------------- +--Implemente um pacote que contenha a função especificada abaixo. +--Desenvolva usando a simulação. +--Sintetize e teste no kit DE10-Lite. +--Analise a quantidade de hardware utilizado no resultado da síntese. +--Escreva uma função que faz a conversão de 4-bits BCD para display de 7-segmentos (0 a 0xF). +--Use um vetor (array) constante para definir a tabela. +--Escreve outra função que recebe um número de 8-bits e converte para dois diplays de 7 segmentos. Use a função acima. +--Teste utilizando 2 displays de 7 segmentos e um contador síncrono. +------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; +use work.bcd_to_7seg_pkg.all; + +entity BCD_to_7seg_display is + Port ( + bcd_input : in std_logic_vector(7 downto 0); + seven_seg_output_1 : out std_logic_vector(7 downto 0); -- Alterado para acomodar um display + seven_seg_output_2 : out std_logic_vector(7 downto 0) -- Alterado para acomodar um display + ); +end entity BCD_to_7seg_display; + +architecture Behavioral of BCD_to_7seg_display is +begin + -- Atribui as saídas usando a função convert_8bits_to_dual_7seg + process(bcd_input) + variable result : std_logic_vector(15 downto 0); + begin + result := convert_8bits_to_dual_7seg(bcd_input); + seven_seg_output_1 <= result(15 downto 8); + seven_seg_output_2 <= result(7 downto 0); + end process; +end architecture Behavioral; \ No newline at end of file diff --git a/peripherals/semaforo/BCD_to_7seg_display_tb.vhd b/peripherals/semaforo/BCD_to_7seg_display_tb.vhd new file mode 100644 index 00000000..b961c4d6 --- /dev/null +++ b/peripherals/semaforo/BCD_to_7seg_display_tb.vhd @@ -0,0 +1,59 @@ +------------------------------------------------------------------- +-- Name : BCD_to_7seg_display_tb.vhd +-- Author : Elvis Fernandes +-- Version : 0.1 +-- Copyright : Departamento de Eletrônica, Florianópolis, IFSC +-- Description : Tarefa 11: subprogramas +-- Date : 11/07/2024 +------------------------------------------------------------------- +--Implemente um pacote que contenha a função especificada abaixo. +--Desenvolva usando a simulação. +--Sintetize e teste no kit DE10-Lite. +--Analise a quantidade de hardware utilizado no resultado da síntese. +--Escreva uma função que faz a conversão de 4-bits BCD para display de 7-segmentos (0 a 0xF). +--Use um vetor (array) constante para definir a tabela. +--Escreve outra função que recebe um número de 8-bits e converte para dois diplays de 7 segmentos. Use a função acima. +--Teste utilizando 2 displays de 7 segmentos e um contador síncrono. +------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; +use work.bcd_to_7seg_pkg.all; + + +entity BCD_to_7seg_display_tb is +end BCD_to_7seg_display_tb; + +architecture Behavioral of BCD_to_7seg_display_tb is + -- Declaração dos sinais para o teste + signal bcd_input : std_logic_vector(7 downto 0) := "00000000"; + --signal seven_seg_output : std_logic_vector(15 downto 0); + signal seven_seg_output_1 : std_logic_vector(7 downto 0); -- Alterado para acomodar um display + signal seven_seg_output_2 : std_logic_vector(7 downto 0); -- Alterado para acomodar um display + +begin + + -- Instanciação do componente a ser testado + UUT : entity work.BCD_to_7seg_display + port map ( + bcd_input => bcd_input, + --seven_seg_output => seven_seg_output + seven_seg_output_1 => seven_seg_output_1, + seven_seg_output_2 => seven_seg_output_2 + ); + + -- Processo de simulação + process + begin + -- Teste de cada número BCD de 0 a F + for i in 0 to 15 loop + bcd_input <= std_logic_vector(to_unsigned(i, bcd_input'length)); + wait for 10 ns; -- Atraso para observar o resultado + end loop; + + -- Finalização da simulação + wait; + end process; + +end Behavioral; \ No newline at end of file diff --git a/peripherals/semaforo/README.md b/peripherals/semaforo/README.md new file mode 100644 index 00000000..6c0b89bc --- /dev/null +++ b/peripherals/semaforo/README.md @@ -0,0 +1,198 @@ +# SEMÁFORO +### Esta tarefa envolve a criação de um semáforo em VHDL baseada em máquina de estados com os seguintes funcionalidades: +- Controle dos estados luzes de um semáforo (Red, Yellow e Green); +- Contagem do número de pedestres (apenas no estado Red); +- Contagem do número de carros (apenas nos estados Yellow e Green); +- Exibição das luzes do semáforo, da contagem dos pedestres e carros, bem como do tempo de cada estado do semáforo. +------------------------------------------------------------------- +## 1 ESPECIFICAÇÕES +### 1.1 PORTAS DE ENTRADA + - clk: Porta de entrada (interno) do tipo std_logic responsável pelo clock. + - rst: Porta de entrada (interno) do tipo std_logic responsável pelo rst. + - start: Porta de entrada (chave) do tipo std_logic responsável por iniciar o sistema. + - carro: Porta de entrada (chave) do tipo std_logic responsável pela contagem de carros. + - pedestre: Porta de entrada (chave) do tipo std_logic responsável pela contagem de pessoas. + +### 1.2 PORTAS DE SAÍDA + - r1: Porta de saída (LED) do tipo std_logic responsável sinal vermelho do semáforo. + - y1: Porta de saída (LED) do tipo std_logic responsável sinal amarelo do semáforo. + - g1: Porta de saída (LED) do tipo std_logic responsável sinal verde do semáforo. + - ped_count: Porta de saída (DISPLAY 7 SEGMENTOS) do tipo unsigned responsável pela visualização da contagem de pedestres. + - car_count: Porta de saída (DISPLAY 7 SEGMENTOS) do tipo unsigned responsável pela visualização da contagem de carros. + - time_display: Porta de saída (DISPLAY 7 SEGMENTOS) do tipo unsigned responsável pela visualização do tempo de cada estado. + - visual_display: Porta de saída (DISPLAY 7 SEGMENTOS) do tipo unsigned responsável visualizar os segmentos. + + +### 1.3 ESTADOS + +**STARTT** + - Estado STARTT criado com valor 0, para que ele vá para o estado IDLE imediatamente, garantindo com que o estado RED assuma o valor do estado IDLE; + +**IDLE** + - Estado IDLE para garantir a contagem total do estado RED. + - Sem o estado IDLE, o estado RED utiliza a mesma contagem de tempo IDLE No primeiro ciclo da máquina de estados. + +**RED** + - Deve ser contabilizado o tempo do estado e mostrado no display; + - Deve ser contabilizado quantas pessoas atravessam e mostrado no displaY; + - Não deve ser contabilizado quantas pessoas atravessam e mostrado no display; + - O tempo do estado deve ser decrementado e chegar até 0; + - Quando chegar em 0, o estado é alterado para o próximo estado. + +**YELLOW** + - Deve ser contabilizado o tempo do estado e mostrado no display; + - Não deve ser contabilizado quantas pessoas atravessam; + - Deve ser contabilizado o número de carros que passam e mostrado no display; + - O tempo do estado deve ser decrementado e chegar até 0; + - Quando chegar em 0, o estado é alterado para o próximo estado. + +**GREEN** + - Deve ser contabilizado o tempo do estado e mostrado no display; + - Não deve ser contabilizado quantas pessoas atravessam e mostrado no display; + - Deve ser contabilizado o número de carros que passam e mostrado no display; + - O tempo do estado deve ser decrementado e chegar até 0; + - Quando chegar em 0, o estado é alterado para o próximo estado. + +## 2 PINAGEM + +**Leds** + - LEDR (0) --> r1 + - LEDR (1) --> y1 + - LEDR (2) --> g1 + +**Chaves** + - SW(0) --> start + - SW(1) --> rst + - SW(8) --> carro + - SW(9) --> pedestre + +**Displays** + + - HEX0 --> ped_count. + - HEX1 --> car_count. + - HEX2 --> time_display. + - HEX4 --> segmentos de time_display (15 a 8). + - HEX5 --> segmentos de time_display (7 a 0). + +## 3 FUNCIONAMENTO + + - 1) Simular no modelsim; + - 2) Gravar na placa; + - 3) Colocar rst em nivel ALTO; + - 4) Colocar rst em nivel BAIXO; + - 5) Colocar start em nivel ALTO; + + **No primeiro ciclo da máquina de estados** + - Estado STARTT iniciado. LEDR (0), LEDR (1) e LED (2) acesos; tempo 0 segundos. + - Estado IDLE iniciado. Apenas LEDR (2) aceso; tempo estabelecido pelo estado RED; tempo 15 segundos. + - ESTADO YELLOW inicado. Apenas LEDR (1) aceso; tempo estabelecido pelo estado YELLOW; tempo 15 segundos. + - ESTADO GREEN inicado. Apenas LEDR (0) aceso; tempo estabelecido pelo estado GREEN; tempo 15 segundos. + + **No segundo ciclo da máquina de estados** + - Estado RED iniciado. Apenas LEDR (2) aceso; tempo estabelecido pelo estado RED; tempo 15 segundos. + - Estado YELLOW iniciado. Apenas LEDR (1) aceso; tempo estabelecido pelo estado YELLOW; tempo 15 segundos. + - Estado GREEN iniciado. Apenas LEDR (0) aceso; tempo estabelecido pelo estado GREEN; tempo 15 segundos. + +## 4 SIMULAÇÃO SEMÁFORO + - 1) Abrir o software Modelsim + - 2) cd C:/Users/elvis/OneDrive/Documentos/projeto_final/riscv-multicycle-master/riscv-multicycle-master/peripherals/semaforo + - 3) do tb.do + - 4) Imagens da simulação + +No primeiro ciclo da máquina de estados. +![Simulação](/peripherals/semaforo/simulacao.png) + +A partir do segundo ciclo da máquina de estados. +![Simulação](/peripherals/semaforo/simulacao2.png) + +## 5 SUBPROGRAMAS +Os subprogramas possuem as seguintes especificações: +- Função que faz a conversão de 4-bits BCD para display de 7-segmentos (0 a 0xF). +- Função que recebe um número de 8-bits e converte para dois diplays de 7 segmentos. +- Tabela de conversão de BCD para display de 7 segmentos +- Um vetor (array) constante para definir a tabela. +- Atribuição das saídas usando a função convert_8bits_to_dual_7seg. + +Os arquivos utilizados nos subprogramas são: +- BCD_to_7seg_display.vhd +- bcd_to_7seg_pkg.vhd +- BCD_to_7seg_display_tb.vhd +- do_BCD_to_7seg_display.do + +Simulação dos Subprogramas: + + - 1) Abrir o software Modelsim + - 2) cd C:/Users/elvis/OneDrive/Documentos/projeto_final/riscv-multicycle-master/riscv-multicycle-master/peripherals/semaforo + - 3) do_BCD_to_7seg_display.do + - 4) Imagem da simulação + +![Simulação](/peripherals/semaforo/simulacao3.png) + +## 6 SÍNTESE +O arquivo de síntese é denominado de_10_lite.vhd e é composto de: + +- Pacote de conversão BCD para 7 segmentos (USE work.bcd_to_7seg_pkg.all;) +- Sinais para o semáforo e contadores +- Sinais para os displays de 7 segmentos +- Sinal para o divisor de clock (clk_div) +- Divisor de Clock para gerar um sinal de clock mais lento +- Instância do DUT (Design Under Test) do semáforo +- Processo para converter os valores de contagem para displays de 7 segmentos (ped_count, car_count, time_display, visual_display) +- Atribuição dos valores convertidos aos displays +- Sincronizar o valor de time_display a visual_display_test +- Processo para controlar o displays HEX4 e HEX5 com base no valor de visual_display_test + +Compilação Síntese +- 1) Abrir o software Quartus Prime +- 2) Assignments >> Settings... >> ... >> Apply >> OK +- 3) Adicionar: + - semaforo.vhd + - BCD_to_7seg_display.vhd + - bcd_to_7seg_pkg.vhd + +![Sintese](/peripherals/semaforo/sintese.png) + +- 4) Compilação (control + L): +![Sintese](/peripherals/semaforo/compilacao.png) + +## 7 GRAVAÇÃO + +- Tools >> Programmer >> Start + + ![Sintese](/peripherals/semaforo/programmer.png) + + ## 8 Make - Procedimento Windows + +1 - Abril power shell como administrador e digitar: + +Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) + + +2 - choco install make + +3 - make --version + +GNU Make 4.4.1 +Built for Windows32 +Copyright (C) 1988-2023 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +PS C:\Windows\system32> + +4 - make + +elvis@DESKTOP-FDIHVVJ MINGW64 ~/OneDrive/Documentos/projeto_final/riscv-multicycle-master/riscv-multicycle-master/software +$ make +../compiler/gcc/bin/riscv-none-embed-objcopy -O verilog blink.elf blink.tmp +../compiler/gcc/bin/riscv-none-embed-objdump -h -S blink.elf > "blink.lss" +python hex8tohex32.py blink.tmp > blink32.hex +python hex8tointel.py blink.tmp > quartus_blink.hex +rm blink32.hex + + ![make](/peripherals/semaforo/make.png) + + ## 9 Video - YOUTUBE - Demonstração + + https://www.youtube.com/watch?v=rF7BGWolLLM + diff --git a/peripherals/semaforo/bcd_to_7seg_pkg.vhd b/peripherals/semaforo/bcd_to_7seg_pkg.vhd new file mode 100644 index 00000000..2b84c87d --- /dev/null +++ b/peripherals/semaforo/bcd_to_7seg_pkg.vhd @@ -0,0 +1,79 @@ +------------------------------------------------------------------- +-- Name : bcd_to_7seg_pkg.vhd +-- Author : Elvis Fernandes +-- Version : 0.1 +-- Copyright : Departamento de Eletrônica, Florianópolis, IFSC +-- Description : Tarefa 11: subprogramas +-- Date : 11/07/2024 +------------------------------------------------------------------- +--Implemente um pacote que contenha a função especificada abaixo. +--Desenvolva usando a simulação. +--Sintetize e teste no kit DE10-Lite. +--Analise a quantidade de hardware utilizado no resultado da síntese. +--Escreva uma função que faz a conversão de 4-bits BCD para display de 7-segmentos (0 a 0xF). +--Use um vetor (array) constante para definir a tabela. +--Escreve outra função que recebe um número de 8-bits e converte para dois diplays de 7 segmentos. Use a função acima. +--Teste utilizando 2 displays de 7 segmentos e um contador síncrono. +------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +package bcd_to_7seg_pkg is + -- Tabela de conversão de BCD para display de 7 segmentos + type seg_array is array (natural range 0 to 15) of std_logic_vector(7 downto 0); + + constant bcd_to_7seg_table : seg_array := + (0 => "11000000", -- 0 + 1 => "11111001", -- 1 + 2 => "10100100", -- 2 + 3 => "10110000", -- 3 + 4 => "10011001", -- 4 + 5 => "10010010", -- 5 + 6 => "10000010", -- 6 + 7 => "11111000", -- 7 + 8 => "10000000", -- 8 + 9 => "10010000", -- 9 + 10 => "10001000", -- A + 11 => "10000011", -- B + 12 => "11000110", -- C + 13 => "10100001", -- D + 14 => "10000110", -- E + 15 => "10001110");-- F + + -- Função para converter um número BCD de 4 bits para um display de 7 segmentos + function bcd_to_7seg(bcd_input : std_logic_vector(3 downto 0)) return std_logic_vector; + + -- Tamanho dos vetores de entrada e saída + constant input_width : integer := 8; + constant output_width : integer := 16; + + -- Tipos para os vetores de entrada e saída + subtype input_vector is std_logic_vector(input_width - 1 downto 0); + subtype output_vector is std_logic_vector(output_width - 1 downto 0); + + -- Função para converter um número de 8 bits para dois displays de 7 segmentos + function convert_8bits_to_dual_7seg(input_value : input_vector) return output_vector; +end bcd_to_7seg_pkg; + +package body bcd_to_7seg_pkg is + -- Implementação da função para converter um número BCD de 4 bits para um display de 7 segmentos + function bcd_to_7seg(bcd_input : std_logic_vector(3 downto 0)) return std_logic_vector is + begin + return bcd_to_7seg_table(to_integer(unsigned(bcd_input))); + end function; + + -- Implementação da função para converter um número de 8 bits para dois displays de 7 segmentos + function convert_8bits_to_dual_7seg(input_value : input_vector) return output_vector is + variable result : output_vector; + begin + -- Converte os primeiros 4 bits para o primeiro display de 7 segmentos + result(15 downto 8) := bcd_to_7seg(input_value(7 downto 4)); + + -- Converte os últimos 4 bits para o segundo display de 7 segmentos + result(7 downto 0) := bcd_to_7seg(input_value(3 downto 0)); + + return result; + end function; +end bcd_to_7seg_pkg; \ No newline at end of file diff --git a/peripherals/semaforo/compilacao.png b/peripherals/semaforo/compilacao.png new file mode 100644 index 00000000..8ec58cdd Binary files /dev/null and b/peripherals/semaforo/compilacao.png differ diff --git a/peripherals/semaforo/de10_lite.vhd b/peripherals/semaforo/de10_lite.vhd new file mode 100644 index 00000000..70f2f975 --- /dev/null +++ b/peripherals/semaforo/de10_lite.vhd @@ -0,0 +1,216 @@ +------------------------------------------------------------------- +-- Name : de_10_lite.vhd +-- Author : Elvis Fernandes +-- Version : 0.1 +-- Copyright : Departamento de Eletrônica, Florianópolis, IFSC +-- Description : Projeto Final: síntese semáforo +-- Date : 03/09/2024 +------------------------------------------------------------------- + +LIBRARY ieee; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; + +-- Importando o pacote de conversão BCD para 7 segmentos +USE work.bcd_to_7seg_pkg.all; + +ENTITY de10_lite IS + 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 de10_lite IS + + -- Sinais para o semáforo e contadores + SIGNAL clk : std_logic; -- Sinal de clock + SIGNAL rst : std_logic; -- Sinal de reset + SIGNAL start : std_logic; -- Sinal para a chave de start + SIGNAL pedestre : std_logic; -- Sinal para a chave para contagem de pedestres + SIGNAL carro : std_logic; -- Sinal para a chave para contagem de carros + SIGNAL r1 : std_logic; -- Sinal de saída para o vermelho do primeiro semáforo + SIGNAL y1 : std_logic; -- Sinal de saída para o amarelo do primeiro semáforo + SIGNAL g1 : std_logic; -- Sinal de saída para o verde do primeiro semáforo + SIGNAL ped_count : unsigned(7 DOWNTO 0); -- Sinal de contador de pedestres + SIGNAL car_count : unsigned(7 DOWNTO 0); -- Sinal de contador de carros + SIGNAL time_display : unsigned(7 DOWNTO 0); -- Sinal de contador de tempo de estados do semáforo + + SIGNAL clk_div : std_logic := '0'; + + -- Sinais para os displays de 7 segmentos + SIGNAL hex0_data : std_logic_vector(7 downto 0); + SIGNAL hex1_data : std_logic_vector(7 downto 0); + SIGNAL hex2_data : std_logic_vector(7 downto 0); + SIGNAL visual_display : unsigned(7 DOWNTO 0); -- Sinal para visualizar os segundos finais de tempo de cada estado + SIGNAL hex5_data : std_logic_vector(7 downto 0); + SIGNAL visual_display_test : unsigned(7 downto 0); -- Inicializa o teste com 0 + +BEGIN + + -- Divisor de Clock para gerar um sinal de clock mais lento + PROCESS(MAX10_CLK1_50) + VARIABLE counter : integer := 0; + BEGIN + IF rising_edge(MAX10_CLK1_50) THEN + counter := counter + 1; + IF counter = 50000000 THEN + clk_div <= NOT clk_div; + counter := 0; + END IF; + END IF; + END PROCESS; + + -- Instância do DUT (Design Under Test) + dut : ENTITY work.semaforo + PORT MAP ( + clk => clk_div, + rst => SW(1), + start => SW(0), + pedestre => SW(9), + carro => SW(8), + r1 => LEDR(2), + y1 => LEDR(1), + g1 => LEDR(0), + ped_count => ped_count, + car_count => car_count, + time_display => time_display, + visual_display => visual_display + ); + + -- Convertendo os valores de contagem para displays de 7 segmentos + PROCESS(ped_count, car_count, time_display, visual_display) + BEGIN + -- Display HEX0 mostra ped_count + hex0_data <= convert_8bits_to_dual_7seg(std_logic_vector(ped_count))(7 downto 0); + + -- Display HEX1 mostra car_count + hex1_data <= convert_8bits_to_dual_7seg(std_logic_vector(car_count))(7 downto 0); + + -- Display HEX2 mostra a contagem de tempo de cada estado do semáforo + hex2_data <= convert_8bits_to_dual_7seg(std_logic_vector(time_display))(7 downto 0); + + -- Display HEX5 mostra visual_display + hex5_data <= convert_8bits_to_dual_7seg(std_logic_vector(visual_display))(7 downto 0); + END PROCESS; + + -- Atribuindo os valores convertidos aos displays + HEX0 <= hex0_data; + HEX1 <= hex1_data; + HEX2 <= hex2_data; + HEX3 <= "11111111"; -- (dp,g,f,e,d,c,b,a) apagados + --HEX4 <= "11111111"; -- (dp,g,f,e,d,c,b,a) apagados + --HEX5 <= "10000000"; -- (dp) apagado + --HEX5 <= "11000000"; -- (dp,g) apagados + --HEX5 <= "11100000"; -- (dp,g,f) apagados + --HEX5 <= "11110000"; -- (dp,g,f,e) apagados + --HEX5 <= "11111000"; -- (dp,g,f,e,d) apagados + --HEX5 <= "11111100"; -- (dp,g,f,e,d,c) apagados + --HEX5 <= "11111110"; -- (dp,g,f,e,d,c,b) apagados + --HEX5 <= "11111111"; -- (dp,g,f,e,d,c,b,a) apagados + + --Sincronizando o valor de time_display a visual_display_test a cada subida de clock + PROCESS(clk_div) + BEGIN + IF rising_edge(clk_div) THEN + visual_display_test <= time_display; + END IF; + END PROCESS; + + -- Processo para controlar o displays HEX4 e HEX5 com base no valor de visual_display_test + PROCESS(visual_display_test) + BEGIN + CASE to_integer(unsigned(visual_display_test)) IS + + WHEN 16 => + HEX4 <= "00000000"; -- Todos segmentos acesos (para um visual "15") + WHEN 15 => + HEX4 <= "10000000"; -- Todos segmentos acesos (para um visual "15") + WHEN 14 => + HEX4 <= "11000000"; -- (dp,g) apagados (para um visual "14") + WHEN 13 => + HEX4 <= "11100000"; -- (dp,g,f) apagados (para um visual "13") + WHEN 12 => + HEX4 <= "11110000"; -- (dp,g,f,e) apagados (para um visual "12") + WHEN 11 => + HEX4 <= "11111000"; -- (dp,g,f,e,d) apagados (para um visual "11") + WHEN 10 => + HEX4 <= "11111100"; -- (dp,g,f,e,d,c) apagados (para um visual "10") + WHEN 9 => + HEX4 <= "11111110"; -- (dp,g,f,e,d,c,b) apagados (para um visual "9") + WHEN 8 => + HEX5 <= "00000000"; -- Todos segmentos acesos (para um visual "8") + WHEN 7 => + HEX5 <= "10000000"; -- (dp,g) apagados (para um visual "7") + WHEN 6 => + HEX5 <= "11000000"; -- (dp,g,f) apagados (para um visual "6") + WHEN 5 => + HEX5 <= "11100000"; -- (dp,g,f) apagados (para um visual "5") + WHEN 4 => + HEX5 <= "11110000"; -- (dp,g,f,e) apagados (para um visual "4") + WHEN 3 => + HEX5 <= "11111000"; -- (dp,g,f,e,d) apagados (para um visual "3") + WHEN 2 => + HEX5 <= "11111100"; -- (dp,g,f,e,d,c) apagados (para um visual "2") + WHEN 1 => + HEX5 <= "11111110"; -- (dp,g,f,e,d,c,b) apagados (para um visual "1") + WHEN 0 => + HEX5 <= "11111111"; -- (dp,g,f,e,d,c,b,a) apagados (para um visual "0") + WHEN OTHERS => + HEX4 <= "11111111"; -- (dp,g,f,e,d,c,b,a) apagados (default para "8.") + HEX5 <= "00000000"; -- (dp,g,f,e,d,c,b,a) acesos (default para "8.") + + END CASE; + END PROCESS; + +END ARCHITECTURE; \ No newline at end of file diff --git a/peripherals/semaforo/do_BCD_to_7seg_display.do b/peripherals/semaforo/do_BCD_to_7seg_display.do new file mode 100644 index 00000000..43df1ef9 --- /dev/null +++ b/peripherals/semaforo/do_BCD_to_7seg_display.do @@ -0,0 +1,32 @@ +#Cria biblioteca do projeto +vlib work + +#compila projeto: todos os aquivo. Ordem é importante +vcom bcd_to_7seg_pkg.vhd BCD_to_7seg_display.vhd BCD_to_7seg_display_tb.vhd + +#Simula (work é o diretorio, testbench é o nome da entity) +vsim -voptargs="+acc" -t ns work.BCD_to_7seg_display_tb + +#Mosta forma de onda +view wave + +#Adiciona ondas específicas +add wave -radix binary /bcd_input +#add wave -radix binary /seven_seg_output +add wave -radix binary /seven_seg_output_1 +add wave -radix binary /seven_seg_output_2 +add wave -radix uns /bcd_input +#add wave -radix uns /seven_seg_output +add wave -radix uns /seven_seg_output_1 +add wave -radix uns /seven_seg_output_2 +#add wave -radix HEX /seven_seg_output +add wave -radix HEX /seven_seg_output_1 +add wave -radix HEX /seven_seg_output_2 + + +#Simula até um 100000ns +#run 99840 +run 500 + +wave zoomfull +write wave wave.ps \ No newline at end of file diff --git a/peripherals/semaforo/make.png b/peripherals/semaforo/make.png new file mode 100644 index 00000000..91cf12d0 Binary files /dev/null and b/peripherals/semaforo/make.png differ diff --git a/peripherals/semaforo/programmer.png b/peripherals/semaforo/programmer.png new file mode 100644 index 00000000..80b97be0 Binary files /dev/null and b/peripherals/semaforo/programmer.png differ diff --git a/peripherals/semaforo/semaforo.vhd b/peripherals/semaforo/semaforo.vhd new file mode 100644 index 00000000..6bbbb58f --- /dev/null +++ b/peripherals/semaforo/semaforo.vhd @@ -0,0 +1,190 @@ +------------------------------------------------------------------- +-- Name : semaforo.vhd +-- Author : Elvis Fernandes +-- Version : 0.1 +-- Copyright : Departamento de Eletrônica, Florianópolis, IFSC +-- Description : Projeto Final: Semáforo +-- Date : 30/08/2024 +------------------------------------------------------------------- +--Esta tarefa envolve a criação de um semáforo em VHDL baseada em máquina de estados com os seguintes objetivos: +--Controle dos estados luzes de um semáforo (Red, Yellow e Green); +--Contagem do número de pedestres (apenas no estado Red); +--Contagem do número de carros (apenas nos estados Yellow e Green); +--Exibição das luzes do semáforo, da contagem dos pedestres e carros, do tempo de cada semáforo +------------------------------------------------------------------- +--Pinos de entrada +--clk: sinal de clock. +--rst: sinal de reset. +--start: sinal que sinaliza o início do semáforo. O semáforo é iniciado quando start é nível alto. +--pedestre: sinal que sinaliza o início da contagem de pedestres. O início da contagem é iniciado quando pedestre é nível alto. Se for nível baixo a contagem não deve ser iniciado/contabilizada. +--carro: sinal que sinaliza o início da contagem de carros. O início da contagem é iniciado quando pedestre é nível alto. Se for nível baixo a contagem não deve ser iniciado/contabilizada. +------------------------------------------------------------------- +--Pinos de saída +--r1: sinal que sinaliza o estado red do semáforo +--y1: sinal que sinaliza o estado yellow do semáforo +--g1: sinal que sinaliza o estado green do semáforo +--ped_count: dado de 8 bits que sinaliza a contagem de pedestres +--car_count: dado de 8 bits que sinaliza a contagem de carros +--time_display: dado de 8 bits que sinaliza o tempo do semáforo. A contagem vai de F até 0 +--visual_display: dado de 8 bits que sinaliza os segmentos de tempo de cada semáforo. Para cada número do tempo de semáforo é apagado um segmento do display. Deve ter 1 display para o tempo de F até 9, e um display de 8 até 0. +------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +ENTITY semaforo IS + PORT( + clk : IN std_logic; -- Sinal de clock + rst : IN std_logic; -- Sinal de reset + start : IN std_logic; -- + pedestre : IN std_logic; -- Chave para contagem de pedestres + carro : IN std_logic; -- Chave para contagem de carros + r1 : OUT std_logic; -- Sinal vermelho do semáforo + y1 : OUT std_logic; -- Sinal amarelo do semáforo + g1 : OUT std_logic; -- Sinal verde do semáforo + ped_count : OUT UNSIGNED(7 DOWNTO 0); -- Display para contagem de pedestres + car_count : OUT UNSIGNED(7 DOWNTO 0); -- Display para contagem de carros + time_display : OUT UNSIGNED(7 DOWNTO 0); -- Display para tempo de cada estado + visual_display : OUT UNSIGNED(7 DOWNTO 0) -- Display para visualizar os segmentos do tempo de cada estado + ); +END ENTITY semaforo; + +ARCHITECTURE state_machine OF semaforo IS + + TYPE state IS (STARTT, IDLE, RED, YELLOW, GREEN); + SIGNAL pr_state, nx_state : state; + SIGNAL count : UNSIGNED(7 DOWNTO 0); + SIGNAL count_limit : UNSIGNED(7 DOWNTO 0); + SIGNAL ped_count_sig, car_count_sig : UNSIGNED(7 DOWNTO 0); + +BEGIN + + -- Processo de transição de estados e contagem + PROCESS(rst, clk) + BEGIN + + IF rst = '1' THEN + pr_state <= STARTT; + count <= (others => '0'); + ped_count_sig <= (others => '0'); + car_count_sig <= (others => '0'); + + + ELSIF rising_edge(clk) THEN + + IF count > 0 THEN + IF start = '1' THEN + count <= count - 1; + ELSE + count <= count; + END IF; + ELSE + IF start = '1' THEN + pr_state <= nx_state; + END IF; + count <= count_limit; + END IF; + + IF start = '1' THEN + -- Contagem de pedestres apenas no estado RED + IF pr_state = RED AND pedestre = '1' THEN + ped_count_sig <= ped_count_sig + 1; + car_count_sig <= (others => '0'); + END IF; + + -- Contagem de carros apenas nos estados YELLOW e GREEN + IF (pr_state = YELLOW OR pr_state = GREEN) AND carro = '1' THEN + car_count_sig <= car_count_sig + 1; + ped_count_sig <= (others => '0'); + END IF; + ELSE + ped_count_sig <= ped_count_sig; + car_count_sig <= car_count_sig; + END IF; + END IF; + END PROCESS; + + -- Lógica de transição de estado, contagem de pedestres e carros + PROCESS(pr_state, start, pedestre, carro) + BEGIN + CASE pr_state IS + + --Estado STARTT criado com valor 0, para que ele vá para o estado IDLE imediatamente, garantindo com que o estado RED assuma o valor do estado IDLE + WHEN STARTT => + count_limit <= "00000000"; -- Exemplo: 0 ciclos de clock para o estado STARTT + IF start = '1' THEN + nx_state <= IDLE; + ELSE + nx_state <= STARTT; + END IF; + + --Estado IDLE para garantir a contagem total do estado RED. + --Sem o estado IDLE, o estado RED estava utilizando a mesma contagem de tempo IDLE + WHEN IDLE => + count_limit <= "00001111"; -- Exemplo: 15 ciclos de clock para garantir o tempo do estado RED + IF start = '1' THEN + nx_state <= RED; + ELSE + nx_state <= IDLE; + END IF; + + WHEN RED => + count_limit <= "00001111"; -- Exemplo: 15 ciclos de clock para o estado RED + IF start = '1' THEN + nx_state <= YELLOW; + ELSE + nx_state <= RED; + END IF; + + WHEN YELLOW => + count_limit <= "00001111"; -- Exemplo: 15 ciclos de clock para o estado YELLOW + IF start = '1' THEN + nx_state <= GREEN; + ELSE + nx_state <= YELLOW; + END IF; + + WHEN GREEN => + count_limit <= "00001111"; -- Exemplo: 15 ciclos de clock para o estado GREEN + IF start = '1' THEN + nx_state <= RED; + ELSE + nx_state <= GREEN; + END IF; + END CASE; + END PROCESS; + + ped_count <= ped_count_sig; + car_count <= car_count_sig; + time_display <= count; -- Display mostra o tempo restante do estado atual + + + -- Controle das luzes do semáforo baseado no estado atual + PROCESS(pr_state) + BEGIN + CASE pr_state IS + WHEN STARTT => + r1 <= '0'; + y1 <= '0'; + g1 <= '0'; + WHEN IDLE => + r1 <= '1'; + y1 <= '1'; + g1 <= '1'; + WHEN RED => + r1 <= '1'; + y1 <= '0'; + g1 <= '0'; + WHEN YELLOW => + r1 <= '0'; + y1 <= '1'; + g1 <= '0'; + WHEN GREEN => + r1 <= '0'; + y1 <= '0'; + g1 <= '1'; + END CASE; + END PROCESS; + +END ARCHITECTURE state_machine; diff --git a/peripherals/semaforo/semaforo_testbench.vhd b/peripherals/semaforo/semaforo_testbench.vhd new file mode 100644 index 00000000..61781789 --- /dev/null +++ b/peripherals/semaforo/semaforo_testbench.vhd @@ -0,0 +1,117 @@ +------------------------------------------------------------------- +-- Name : semaforo_testbench.vhd +-- Author : Elvis Fernandes +-- Version : 0.1 +-- Copyright : Departamento de Eletrônica, Florianópolis, IFSC +-- Description : Projeto Final: Semáforo +-- Date : 30/08/2024 +------------------------------------------------------------------- +--Esse testbench deve instanciar a entidade semáforo, deve possuir os seguintes processos bem como os sinais a serem visualizados no software modelsim: +--Processo de clock: realiza o estímulo do sinal de clock +--Processo de reset: realiza o estímulo do sinal de reset +--Processo de start: realiza o estímulo do sinal de start +--Processo de pedestre: realiza o estímulo do sinal de pedestre +--Processo de carro: realiza o estímulo do sinal de carro +------------------------------------------------------------------- +--Sinais a serem visualizados no software modelsim +--clk: sinal de clock +--rst: sinal de reset +--start: sinal de inicio do semáforo +--pedestre: sinal de início de contagem de pedestre +--carro: sinal de início de contagem de pedestre +--r1: sinal do estado red +--y1: sinal do estado yellow +--g1: sinal do estado green +--ped_count: sinal do número de pedestres contabilizados a ser exibido no no display +--car_count: sinal do número de carros contabilizados a ser exibido no no display +--time_display: sinal de tempo de cada estado do semáforo a ser exibido no display +--visual_display: sinal de segmento de tempo de cada estado do semáforo a ser exibido em cada display +------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity semaforo_testbench is +end entity semaforo_testbench; + +architecture stimulus of semaforo_testbench is + signal clk : std_logic; -- Sinal de clock + signal rst : std_logic; -- Sinal de reset + signal start : std_logic; -- Sinal para a chave de start + signal pedestre : std_logic; -- Sinal para a chave para contagem de pedestres + signal carro : std_logic; -- Sinal para a chave para contagem de carros + signal r1 : std_logic; -- Sinal de saída para o vermelho do primeiro semáforo + signal y1 : std_logic; -- Sinal de saída para o amarelo do primeiro semáforo + signal g1 : std_logic; -- Sinal de saída para o verde do primeiro semáforo + signal ped_count : unsigned(7 DOWNTO 0); -- Sinal de contador de pedestres + signal car_count : unsigned(7 DOWNTO 0); -- Sinal de contador de carros + signal time_display : unsigned(7 DOWNTO 0); -- Sinal de contador de tempo de estados do semáforo + signal visual_display : unsigned(7 DOWNTO 0); -- Sinal para visualizar os segundos finais de tempo de cada estado + + +begin + + -- Instância do DUT do semaforo + dut : entity work.semaforo + port map( + clk => clk, + rst => rst, + start => start, + pedestre => pedestre, + carro => carro, + r1 => r1, + y1 => y1, + g1 => g1, + ped_count => ped_count, + car_count => car_count, + time_display => time_display, + visual_display => visual_display + ); + + -- Geração do clock de 10 ns (50 MHz) + stimulus_process_clk : process + begin + clk <= '0'; + wait for 5 ns; + clk <= '1'; + wait for 5 ns; + end process stimulus_process_clk; + + -- Processo para resetar o sistema + stimulus_process_reset : process + begin + rst <= '1'; -- Ativa reset + wait for 10 ns; + rst <= '0'; -- Libera reset após 10 ns + wait; + end process stimulus_process_reset; + + -- Processo para controlar o sinal start + start_process : process + begin + start <= '0'; + wait for 30 ns; -- Espera 30 ns antes de ativar o start + start <= '1'; + wait; + end process start_process; + + -- Processo para controlar o sinal da contagem de pedestres + pedestre_process : process + begin + pedestre <= '0'; + wait for 30 ns; -- Espera 30 ns antes de ativar o sinal de pedestres + pedestre <= '1'; + wait; + end process pedestre_process; + + -- Processo para controlar o sinal da contagem de carros + carro_process : process + begin + carro <= '0'; + wait for 30 ns; -- Espera 30 ns antes de ativar o sinal de carros + carro <= '1'; + wait; + end process carro_process; + +end architecture stimulus; diff --git a/peripherals/semaforo/simulacao.png b/peripherals/semaforo/simulacao.png new file mode 100644 index 00000000..ef615987 Binary files /dev/null and b/peripherals/semaforo/simulacao.png differ diff --git a/peripherals/semaforo/simulacao2.png b/peripherals/semaforo/simulacao2.png new file mode 100644 index 00000000..24d07f2f Binary files /dev/null and b/peripherals/semaforo/simulacao2.png differ diff --git a/peripherals/semaforo/simulacao3.png b/peripherals/semaforo/simulacao3.png new file mode 100644 index 00000000..3d68e730 Binary files /dev/null and b/peripherals/semaforo/simulacao3.png differ diff --git a/peripherals/semaforo/sintese.png b/peripherals/semaforo/sintese.png new file mode 100644 index 00000000..716fa19b Binary files /dev/null and b/peripherals/semaforo/sintese.png differ diff --git a/peripherals/semaforo/tb.do b/peripherals/semaforo/tb.do new file mode 100644 index 00000000..8098a1bd --- /dev/null +++ b/peripherals/semaforo/tb.do @@ -0,0 +1,34 @@ +#Cria biblioteca do projeto +vlib work + +#compila projeto: todos os aquivo. Ordem é importante +vcom semaforo.vhd semaforo_testbench.vhd + +#Simula (work é o diretorio, semaforo_testbench é o nome da entity) +vsim -voptargs="+acc" -t ns work.semaforo_testbench + +#Mosta forma de onda +view wave + +#Adiciona ondas específicas +add wave -radix binary /clk +add wave -radix binary /rst +add wave -radix binary /start +add wave -radix binary /pedestre +add wave -radix binary /carro +add wave -radix binary /r1 +add wave -radix binary /y1 +add wave -radix binary /g1 +add wave -radix uns /ped_count +add wave -radix uns /car_count +add wave -radix uns /time_display +#add wave -radix uns /visual_display +add wave /dut/pr_state + + + +#Simula até um 500ns +run 2500 + +wave zoomfull +write wave wave.ps \ No newline at end of file