Tarefa 1. Projectar um circuito para fazer contas aritméticas:
R1 = Op1 + Op2;
R2 = Op1 - Op2;
R3 = Op1 * Op2;
R4 = Op1 / Op2;
Onde:
Op1 tem tamanho de 4 bits (use interruptores 3 downto 0 da placa)
Op2 tem tamanho de 4 bits (use interruptores 7 downto 4 da placa)
R1 deve aparecer nos displays quando carregar no botão0 da placa
R2 deve aparecer nos displays quando carregar no botão1 da placa
R3 deve aparecer nos displays quando carregar no botão2 da placa
R4 deve aparecer nos displays quando carregar no botão3 da placa
LED(7 downto 0) deve mostrar os resultados em código binário
SDR 2009
1
VHDL suporta 1) adição (+), subtracção (-) e multiplicação (*).
VHDL não suporta a divisão (/). Para implementar a divisão Op1(4 bits)/Op2(4 bits)
pode utilizar tabelas ou instruções condicionais do tipo if e case ou subtracção
múltipla
8 bits
4 + 4 = 8 bits
4 + 4 = 8 bits
Exemplos:
sum <= ("0000"&(Op1(3 downto 0)))+("0000"&(Op2(3 downto 0)));
difference <= ("0000"&(Op1(3 downto 0)))-("0000"&(Op2(3 downto 0)))
when ("0000"&(Op1(3 downto 0)))>=("0000"&(Op2(3 downto 0))) else
("0000"&(Op2(3 downto 0)))-("0000"&(Op1(3 downto 0)));
sign
<= std_logic_vector(to_unsigned(character'pos(' '), 8))
when ("0000"&(Op1(3 downto 0)))>=("0000"&(Op2(3 downto 0))) else
std_logic_vector(to_unsigned(character'pos('-'), 8));
sumMSB <= "0011" & ROM(conv_integer(sum))(7 downto 4);
sumLSB <= "0011" & ROM(conv_integer(sum))(3 downto 0);
DifLSB <= "0011" & ROM(conv_integer(difference))(3 downto 0);
dígito mais significativo
SDR 2009
2
dígito menos significativo
Download

Tarefa para aula