Olá pessoal,
Nesse tutorial a gente vai falar sobre shift registers, o que são? Para que serve? E ainda montar um projeto com um resultado muito interessante, o resultado vocês podem ver no vídeo abaixo.
- O que é um shift registers?
Shift registers, como o próprio nome propõe, é um circuito digital que possui dados que são armazenados e shifted, ou seja, "substituidos" como se saltassem a cada clock, juntos.
Eu recomendo ao leitor dar uma olhada na página do wikipedia sobre shift registers e conferir todas as imagens e entedê-las.
Esse tipo de circuito é bem útil e usado para os vários propósitos, e em projetos maiores ele pode ser conveniente.
- O nosso projeto
Como de costume, abra o Quartus (aqui estamos utilizando a v. 13.1) e crie um novo projeto.
Figura 1: Criando um novo projeto.
Qualquer maior dificuldades nesse passo, consulte o tutorial 01. Em File > New > VHDL File, crie um arquivo VHDL em branco.
Figura 2: Criando um novo arquivo VHDL.
Agora é só descrever o nosso hardware.
-- declara ao compilador a biblioteca usada
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
-- entidade shift_register
ENTITY shift_register IS
-- listagem de entradas e saidas
PORT(
LEDG: OUT STD_LOGIC_VECTOR (9 downto 0);
SW: IN STD_LOGIC_VECTOR (9 downto 0);
CLOCK_50: IN STD_LOGIC
);
END shift_register;
-- descrever o comportamento do circuito
ARCHITECTURE behavioral OF shift_register IS
-- contador para o tempo (aprx. um quarto de segundo)
SIGNAL temporal: INTEGER RANGE 0 TO 12500000 := 0;
-- inicialmente nenhum LED é ligado.
SIGNAL vetor_temp: STD_LOGIC_VECTOR (9 downto 0) := (OTHERS => '0');
-- indice para deslocar o vetor
SIGNAL i: INTEGER RANGE 0 TO 9 := 0;
BEGIN
-- LEDs possuirao o valor de vetor_temp
LEDG <= vetor_temp;
-- CLOCK_50 na lista de sensibilidade do process
PROCESS (CLOCK_50)
BEGIN
-- na borda de subida do clock
IF rising_edge(CLOCK_50) THEN
-- caso tenha percorrido 1/4 segundo
IF(temporal = 12500000) THEN
-- reseta a variavel
temporal <= 0;
-- desloca os valores
vetor_temp(9 downto 1) <= vetor_temp (8 downto 0);
-- transfere valor da chave compassadamente para o vetor_temp(0)
vetor_temp(0) <= SW(9-i);
-- reseta o indice quando chegar no limite
IF (i = 9) THEN
i <= 0;
ELSE
i <= i + 1;
END IF;
ELSE
-- senao, continua contando (tempo correndo...)
temporal <= temporal + 1;
END IF;
END IF;
END PROCESS;
END behavioral;
Antes de compilar, importamos (ou declaramos) os pinos da placa. Para isso, Assignments -> Import Assignments.
Figura 3: Declarando os pinos da placa.
E finalmente, Processing> Start Compilation.
Nota: qualquer dificuldade em algum desses passos, leia os tutoriais anteriores.
- Existem outras maneiras de fazê-lo?
Claro que sim. Assim como existem várias maneiras de descrever um objeto, existem várias maneiras de descrever um shift register em VHDL. Talvez uma possível solução seria utilizando o for loop e executar a mudança dos valores dentro do loop... seria um ótimo exercício tentar uma outra aproximação para arranjar o shift register.
É isso pessoal, e não esqueçam de ler a página do wikipédia :-) .
Casino Near Me - MapyRO
ResponderExcluirCasinos Near Me · Casino & Hotel 삼척 출장샵 · Casino Queen at The Meadows · Casino and Resort in 강원도 출장샵 Ridgefield, MS. · Casino at Harrah's Cherokee Casino Resort 영천 출장마사지 · 순천 출장샵 Casino at Harrah's 안산 출장마사지