library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.ALL; -- para conversão -- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all; entity Periph_LCD is Port ( clk48 : in std_logic; -- relógio de 48 MHz rst : in std_logic; -- reset(activo a '0') DIP_in : in std_logic_vector(7 downto 0); --estado dos interruptores But_in : in std_logic_vector(3 downto 0); --dados provenientes dos botões Led_out : out std_logic_vector(3 downto 0); --dados a visualizar nos LEDs em linha Ind_led_out : out std_logic; --dados a visualizar no LED individual linha : out std_logic; --linha do display LCD ('0' - linha de cima, '1' - linha de baixo) address : out std_logic_vector(3 downto 0); --número do caracter dentro duma linha (de 0 a 15) ASCII : out std_logic_vector(7 downto 0); --código ASCII do caracter a guardar no endereço "address" na memória do LCD LCD_cs : out std_logic); --chip select da memória do LCD (activo a '0') end Periph_LCD; architecture Behavioral of Periph_LCD is signal state : natural range 0 to 31; signal linha_l : std_logic; signal address_l : std_logic_vector(3 downto 0); signal ASCII_l : std_logic_vector(7 downto 0); signal idx : integer range 0 to 3; signal DIP_left, DIP_right : std_logic_vector (3 downto 0); --os operandos em binário signal op1, op2 : std_logic_vector (4 downto 0); --os operandos em BCD signal result_BCD : std_logic_vector (11 downto 0); --o resultado da operação em BCD signal div_res, result : std_logic_vector (7 downto 0); --o resultado em binário signal sinal_op, sinal_res : character; -- o caracter que representa a operação ('+', '-', '*', '/') e o sinal do resultado (' ', '-') begin --geração dos operandos em binário --conversão dos operandos em binário para BCD --geração do sinal de operação --geração do resultado (para além da divisão) em binário -- divisão --conversão do resultado em binário para BCD --geração do sinal do resultado index_ger: process(clk48, rst) begin if rst = '0' then idx <= 0; elsif rising_edge(clk48) then if idx = 3 then idx <= 0; else idx <= idx + 1; end if; end if; end process index_ger; RAM_write_cycle: process(clk48, rst) begin if rst= '0' then LCD_cs <= '1'; state <= 0; elsif rising_edge(clk48) then case idx is when 0 => LCD_cs <= '1'; when 1 => LCD_cs <= '0'; -- activo when 2 => LCD_cs <= '1'; state <= state + 1; when 3 => null; end case; end if; end process RAM_write_cycle; RAM_write: process(clk48, rst) begin if rst = '0' then null; elsif rising_edge(clk48) then case state is -- escrever o 1º operando when 0 => --digito mais significativo linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= "0011000" & op1(4); when 1 => --digito menos significativo linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= "0011" & op1(3 downto 0); when 2 | 4 | 7 | 9 | 14 to 15 => linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= x"20"; --código ASCII do espaço --escrever o sinal da operação when 3 => linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= conv_std_logic_vector (character'pos(sinal_op), 8); -- escrever o 2º operando when 5 => --digito mais significativo linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= "0011000" & op2(4); when 6 => --digito menos significativo linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= "0011" & op2(3 downto 0); --escrever o sinal '=' when 8 => linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= conv_std_logic_vector(character'pos('='), 8); --escrever o sinal do resultado when 10 => linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= conv_std_logic_vector(character'pos(sinal_res), 8); -- escrever o resultado when 11 => --digito mais significativo linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= "0011" & result_BCD(11 downto 8); when 12 => --digito do meio linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= "0011" & result_BCD(7 downto 4); when 13 => --digito menos significativo linha_l <= '0'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= "0011" & result_BCD(3 downto 0); when others => linha_l <= '1'; address_l <= conv_std_logic_vector(state, 4); ASCII_l <= x"20"; --código ASCII do espaço end case; end if; end process RAM_write; ASCII <= ASCII_l; address <= address_l; linha <= linha_l; Led_out <= But_in; --enviar para os LEDs em linha o estado dos botões Ind_led_out <= DIP_in(7); --enviar para o LED individual o estado do interruptor direito end Behavioral;