Algumas questões de prova recentes com seus gabaritos
Q1 Uma das formas mais simples e mais usadas de detecção de erros na transmissão de dados
digitais são os códigos de paridade. Estes consistem em acrescentar um bit a uma seqüência de bits
que representam dados úteis, de forma a garantir que o total de bits transmitidos possua sempre um
número de 1´s que combine com a paridade escolhida. Por exemplo, caso se trabalhe com paridade
ímpar, o bit acrescentado a cada seqüência de dados deve ser tal que a quantidade total de bits
transmitidos (mensagem + bit de paridade) possua um número ímpar de 1´s.
Implemente um gerador de paridade ímpar em VHDL. A especificação é a seguinte: o módulo deve
receber a mensagem a transmitir de forma serial em um sinal IN de 1 bit. Um sinal de controle NEND
de 1 bit informa, quando em 0, que o valor na entrada IN é o derradeiro bit de informação útil a ser
transmitido. Uma das saídas do circuito é o sinal OUT, que apresenta, bit a bit, a mensagem a ser
transmitida, acrescida, no momento certo, do bit de paridade. Outra saída é um sinal ENDM, que
indica quando o último bit da mensagem, o bit de paridade está disponível na saída OUT.
Não se esqueça de, após receber o último bit e gerar a paridade, voltar ao estado inicial, onde se
espera nova mensagem. Comece mostrando a interface de entrada e saída do circuito sob a forma de
uma entity VHDL (0,5 pontos). A Figura abaixo mostra um comportamento válido do circuito,
supondo sensibilidade à borda de subida do relógio, sem mostrar o processo de inicialização do
circuito (diagrama começa com circuito no estado inicial, sinal de RESET não mostrado) e supondo
uma mensagem de 5 bits sendo enviada. Mostre, para sua implementação: (1) o diagrama de
transição de estados do sistema, indicando o estado inicial e a codificação de estados escolhida (1,5
pontos); (2) a implementação sob a forma de uma architecture em VHDL. Use os tipos
std_logic e std_logic_vector sempre que estes possam ser aplicados (2,5 pontos).
CK
Relógio
IN
Texto: 00110
NEND
Fim de texto
OUT
Msg c/ paridade: 001101
ENDM
Fim de mensagem
Solução (diagrama de transição sai dierto do VHDL):
--- Source code for the odd parity generator, by Ney Calazans
-library IEEE;
use IEEE.std_logic_1164.all;
entity odd_par_gen is
port (
reset: in STD_LOGIC;
clock: in STD_LOGIC;
inp: in STD_LOGIC;
nend: in STD_LOGIC;
outp: out STD_LOGIC;
endm: out STD_LOGIC);
end odd_par_gen;
architecture odd_par_gen of odd_par_gen is
type states is (par,impar,fpar,fimpar);
signal pr_st,nxt_st : states;
Entradas
signal outp_i, endm_i : std_logic; -- internal values generated
-- by the Mealy implementation
begin
process (clock,reset)
-- state register and output register
begin
if reset='1' then
pr_st <= par;
outp <= '0'; endm <= '0';
elsif clock'event and clock='1' then
pr_st <= nxt_st; outp <= outp_i; endm <= endm_i;
end if;
end process;
process (inp,nend,pr_st) -- next_state and outpur functions
variable inputs : std_logic_vector (1 downto 0);
begin
inputs := inp & nend;
case pr_st is
when par => outp_i <= inp; endm_i <= '0';
case inputs is
when "00" => nxt_st <= fpar;
when "01" => nxt_st <= par;
when "10" => nxt_st <= fimpar;
when "11" => nxt_st <= impar;
when others => null;
end case;
when impar => outp_i <= inp; endm_i <= '0';
case inputs is
when "00" => nxt_st <= fimpar;
when "01" => nxt_st <= impar;
when "10" => nxt_st <= fpar;
when "11" => nxt_st <= par;
when others => null;
end case;
when fpar => outp_i <= '1'; endm_i <= '1';
nxt_st <= par;
when fimpar => outp_i <= '0'; endm_i <= '1';
nxt_st <= par;
when others => null;
end case;
end process;
end odd_par_gen;
O testbench seria (não pedido na questão, reproduz exatamente a forma de onda da questão)
library ieee;
use ieee.std_logic_1164.all;
-- Add your library and packages declaration here ...
entity odd_par_gen_tb is
end odd_par_gen_tb;
architecture TB_ARCHITECTURE of odd_par_gen_tb is
-- Component declaration of the tested unit
component odd_par_gen
port(
reset : in std_logic;
clock : in std_logic;
inp : in std_logic;
nend : in std_logic;
outp : out std_logic;
endm : out std_logic );
end component;
-- Stimulus signals - signals mapped to the input and inout ports of tested entity
signal reset : std_logic;
signal clock : std_logic;
signal inp : std_logic;
signal nend : std_logic;
-- Observed signals - signals mapped to the output ports of tested entity
signal outp : std_logic;
signal endm : std_logic;
-- Add your code here ...
begin
-- Unit Under Test port map
UUT : odd_par_gen
port map
(reset => reset,
clock => clock,
inp => inp,
nend => nend,
outp => outp,
endm => endm );
reset <= '1', '0' after 5ns;
process
begin
clock <= '0', '1' after 10ns;
wait for 20ns;
end process;
inp <= '0', '1' after 35ns, '0' after 75ns, '1' after 95ns,
'0' after 105ns, '1' after 115ns;
nend <= '1', '0' after 85ns, '1' after 95ns;
end TB_ARCHITECTURE;
configuration TESTBENCH_FOR_odd_par_gen of odd_par_gen_tb is
for TB_ARCHITECTURE
for UUT : odd_par_gen
use entity work.odd_par_gen(odd_par_gen);
end for;
end for;
end TESTBENCH_FOR_odd_par_gen;
Q2 Implemente um programa que conte todas as ocorrências de um padrão arbitrário em
uma cadeia de caracteres. A cadeia é um vetor de caracteres ASCII armazenado a partir do
endereço de memória INS, e o término desta cadeia é identificado, como na linguagem C,
pelo caracter ASCII NULL (código 00H). O padrão é um outro vetor de caracteres, terminado
da mesma maneira que a cadeia onde se fará a pesquisa, e armazenado a partir da posição
de memória PAT. O resultado deve ser o número de vezes que PAT ocorre dentro de INS,
armazenado em uma posição de memória vezes.
Por exemplo, se INS contiver ABCDABGTHHHABTT (ou seja, 16 elementos, incluindo
o caracter NULL, não mostrado, que termina a cadeia), e se PAT for o padrão AB (com 2
elementos e terminado por NULL, também não mostrado), o resultado em vezes
(posição de memória) ao final da execução deverá ser 3. [3,5 pontos]
Pede-se:
a) Descreva o algoritmo usando palavras ou um fluxograma [1 ponto].
b) Implemente o programa na linguagem de montagem do processador Cleópatra. Não se
esqueça de mostrar, além do programa, uma área de dados válida a ser usada na
execução. [2,5 pontos].
Solução:
;
;
CONTADOR DE OCORRENCIAS EM STRINGS – resultado = 4
;
.code
LOOP:
L1:
LDA
NOT
ADD
ADD
JZ
INS,I
#01
PATTMP,I
IGUAIS,R
;
verifica se ins[i]==pat[j]
LDA PAT
STA PATTMP
;
equivalente à j=0 (resseta o ponteiro)
LDA
NOT
ADD
ADD
JZ
; verifica NOVAMENTE, pois podia estar
; em curso de comparação e interrompeu (HARD!)
INS,I
#01
PATTMP,I
IGUAIS,R
LDA INS,I
JZ FIM
LDA
ADD
STA
JMP
INS
#01
INS
LOOP,R
IGUAIS:
LDA
ADD
STA
LDA
JZ
JMP
PATTMP
#01
PATTMP
PATTMP,I
INCREM
L1,R
INCREM:
LDA VEZES
ADD #01
STA VEZES
; encontrou null na string
; incrementa indice da string principal
LDA PAT
STA PATTMP
JMP L1,R
FIM:
;
equivalente à j=0 (resseta o ponteiro)
HLT
.endcode
.data
vezes:
INS:
PAT:
PATTMP:
V1:
V2:
.enddata
db
db
db
db
db
db
db
#00
V1
V2
V2
#65h,#34h,#34h,#11h,#27h,#44h,#022h,#02h,#34h,#11h
#0FFH,#0FFH,#0FFH,#0FFH,#34h,#11h,#34h,#11h,#00
#34h,#11h,#00H
Q3 Repita a implementação do programa da Questão 1 para o processador R11. Atente para
o fato de que a memória de dados da R11 é formada de palavras de 16 bits. Para facilitar a
implementação do programa, considere que os dados de todos os vetores estão
desempacotados, isto é, que cada caracter ocupa uma palavra de memória, estando o
caracter em questão no byte inferior, a posição superior sempre contendo 00H. [2,5 pontos]
Pede-se:
a) Implemente o programa na linguagem de montagem do processador R11. Não se
esqueça de mostrar, além do programa, uma área de dados válida a ser usada na
execução.
b) Qual o tamanho do seu programa em bytes?
Solução:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ARQUITETURA R11 - detecção de strings repetidos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.code
LOOP:
XOR
XOR
XOR
XOR
R0,
R1,
R2,
R3,
R0,
R1,
R2,
R3,
R0
R1
R2
R3
;
;
;
;
R0=0
R1 - variável i
R2 - variável j
R3 – vezes temporario
LDLI
LDHI
LDLI
LDHI
R4
R4,
R5
R5,
LD
LD
R6, R4, R1
R7, R5, R2
;
;
INS[I]
PAT[J]
COMP
STMSK
JPMI
R6, R7
#20H
#IGUAIS
;
;
z (n/n'/z/z'/c/c'/z/z')
INS[I] == PAT[J]?
XOR
R2, R2, R2
;
zera variável j
LD
COMP
STMSK
JPMI
R7, R5, R2
R6, R7
#20H
#IGUAIS
;
PAT[J]
;
segundo teste, agora com 'j' zerado
#INS
#INS
#PAT
#PAT
L1:
IGUAIS:
FIM:
COMP
STMSK
JPMI
R6, R0
#20H
#FIM
;
;
INS[I] == null ?
z (n/n'/z/z'/c/c'/z/z')
ADDI
R1,#01H
;
i++
STMSK
JPMI
#0FFH
#LOOP
ADDI
R2,#01H
;
j++
LD
COMP
STMSK
JPMI
R7, R5, R2
R7, R0
#10H
#L1
;
PAT[J]
;
;
z' (n/n'/z/z'/c/c'/z/z')
PAT[J] != null ?
ADDI
XOR
STMSK
JPMI
R3, #01H
R2, R2, R2
#0FFH
#L1
;
;
incrementa vezes
zera variável j
LDLI
LDHI
ST
HALT
R5
R5,
R5,
#VEZES
#VEZES
R3
; GRAVA VEZES
.endcode
; area de dados
.data
vezes:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
db #0000H
INS: db #AA03H, #0012H, #0012H, #0034H, #BB18H, #0012H, #0034H, #CC35H, #DD0ABH,
#EE0CDH, #FF77H, #8153H, #0012H, #0034H, #0012H, #0034H, #5645H, #0000H
PAT: db
#0012H, #0034H, #0000H
.enddata
Q4 Um determinado circuito receptor de dados contém a seguinte interface externa: os sinais
linha, init, clock e ready são fios (1 bit cada). O barramento saída contém 8 bits. A operação
do circuito ocorre conforme descrito abaixo [4 pontos]:
•
linha
Quando não há dados a serem transmitidos, a entrada linha
está com valor constante ‘1’. O circuito RX fica monitorando
linha até que ocorra uma descida para valor lógico ‘0’. Assuma que
init
linha está sincronizada com o clock, e que suas transições
ocorrem na borda de subida do mesmo.
saída
RX
ready
•
clock
Esta primeira descida de linha não é utilizada na palavra que
queremos receber. Na segunda borda de descida do clock, após a descida da linha,
armazena-se o bit 0 da palavra de saída. Procede-se assim até a nona descida do clock,
onde é armazenado o bit 7 de saída.
•
Na décima descida do clock, após a descida da linha, gera-se o sinal ready, o qual indica
existência de dado disponível.
a) Implemente a descrição do circuito em VHDL [2,5 pontos].
b) Complete o diagrama de tempos correspondente ao test_bench abaixo para 210 ns [1,5
pontos].
library ieee;
use ieee.STD_LOGIC_UNSIGNED.all;
use ieee.std_logic_1164.all;
entity serial_tb is
end serial_tb;
architecture TB_ARCHITECTURE of serial_tb is
component serial
port( clock : in std_logic;
init : in std_logic;
linha : in std_logic;
saida : out std_logic_vector(7 downto 0);
ready : out std_logic );
end component;
signal ready, clock, init, linha : std_logic;
signal saida : std_logic_vector(7 downto 0);
type mem_rom is array (0 to 4) of std_logic_vector(7 downto 0);
constant byte : mem_rom := ( x"4E", x"73", x"FF", x"C9", x"5C" );
begin
UUT : serial port map (clock => clock, init => init, linha => linha, saida => saida, ready => ready );
init <= '1', '0' after 4 ns;
process
begin clock<='1', '0' after 5ns;
wait for 10ns;
end process;
process
variable cont : integer := 0;
begin
linha <= '1';
wait for 30 ns;
linha <= '0';
wait for 10 ns;
f1: for cc in 0 to 7 loop
linha <= byte(cont)(cc);
wait for 10 ns;
end loop f1;
cont := cont + 1;
if cont=5 then cont:=0; end if;
end process;
end TB_ARCHITECTURE;
0
10
20
30
40
50
60
70
80
90
100
110
120
Init
clock
linha
saída
ready
Solução:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity serial is
port (
clock, init, linha : in std_logic;
saida: out std_logic_vector(7 downto 0);
ready: out std_logic
);
end serial;
architecture beh of serial is
130
140
150
160
170
180
190
200
210
type type_state is (S0,S1,S2,S3,S4,S5,S6,S7,S8,S9);
signal EA,PE : Type_STATE;
signal byte_rx: std_logic_vector(7 downto 0);
begin
saida <= byte_rx;
process(clock,init)
--- REGISTRADOR ÚNICO PARA ESTADO/REG SAÍDA
begin
if init='1' then
EA <= S0;
byte_rx <= (others => '0');
elsif clock'event and clock='0' then
EA <= PE;
if EA/=S0 and EA/=S9 then
byte_rx <= linha & byte_rx(7 downto 1);
end if;
end if;
end process;
process(EA, linha)
begin
case EA is
when S0 => ready <= '0';
if linha = '0' then PE <= S1; -- detect a start bit
end if;
when S1 => PE <= S2;
when S2 => PE <= S3;
when S3 => PE <= S4;
when S4 => PE <= S5;
when S5 => PE <= S6;
when S6 => PE <= S7;
when S7 => PE <= S8;
when S8 => PE <= S9;
when S9 => PE <= S0; ready <= '1';
end case;
end process;
end beh;
Download

Algumas questões de prova recentes com seus gabaritos