Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 11.81 KB | None | 0 0
  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE IEEE.STD_LOGIC_ARITH.ALL;
  4. USE IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6. ENTITY Calculadora IS
  7.   port (
  8.     -- Clocks
  9.    
  10.     CLOCK_24,                                      -- 24 MHz
  11.     CLOCK_27,                                      -- 27 MHz
  12.     CLOCK_50,                                      -- 50 MHz
  13.     EXT_CLOCK : in std_logic;                      -- External Clock
  14.  
  15.     -- Buttons and switches
  16.    
  17.     KEY : in std_logic_vector(3 downto 0);         -- Push buttons
  18.     SW  : in std_logic_vector(9 downto 0);         -- DPDT switches
  19.  
  20.     -- LED displays
  21.  
  22.     HEX0, HEX1, HEX2, HEX3             -- 7-segment displays
  23.        : out std_logic_vector(6 downto 0);
  24.     LEDG : out std_logic_vector(7 downto 0);       -- Green LEDs
  25.     LEDR : out std_logic_vector(9 downto 0);      -- Red LEDs
  26.  
  27.     -- RS-232 interface
  28.  
  29.     UART_TXD : out std_logic;                      -- UART transmitter  
  30.     UART_RXD : in std_logic;                       -- UART receiver
  31.  
  32.     -- SDRAM
  33.    
  34.     DRAM_DQ : inout std_logic_vector(15 downto 0); -- Data Bus
  35.     DRAM_ADDR : out std_logic_vector(11 downto 0); -- Address Bus    
  36.     DRAM_LDQM,                                     -- Low-byte Data Mask
  37.     DRAM_UDQM,                                     -- High-byte Data Mask
  38.     DRAM_WE_N,                                     -- Write Enable
  39.     DRAM_CAS_N,                                    -- Column Address Strobe
  40.     DRAM_RAS_N,                                    -- Row Address Strobe
  41.     DRAM_CS_N,                                     -- Chip Select
  42.     DRAM_BA_0,                                     -- Bank Address 0
  43.     DRAM_BA_1,                                     -- Bank Address 0
  44.     DRAM_CLK,                                      -- Clock
  45.     DRAM_CKE : out std_logic;                      -- Clock Enable
  46.  
  47.     -- FLASH
  48.    
  49.     FL_DQ : inout std_logic_vector(7 downto 0);      -- Data bus
  50.     FL_ADDR : out std_logic_vector(21 downto 0);  -- Address bus
  51.     FL_WE_N,                                         -- Write Enable
  52.     FL_RST_N,                                        -- Reset
  53.     FL_OE_N,                                         -- Output Enable
  54.     FL_CE_N : out std_logic;                         -- Chip Enable
  55.  
  56.     -- SRAM
  57.    
  58.     SRAM_DQ : inout std_logic_vector(15 downto 0); -- Data bus 16 Bits
  59.     SRAM_ADDR : out std_logic_vector(17 downto 0); -- Address bus 18 Bits
  60.     SRAM_UB_N,                                     -- High-byte Data Mask
  61.     SRAM_LB_N,                                     -- Low-byte Data Mask
  62.     SRAM_WE_N,                                     -- Write Enable
  63.     SRAM_CE_N,                                     -- Chip Enable
  64.     SRAM_OE_N : out std_logic;                     -- Output Enable          
  65.    
  66.     -- SD card interface
  67.    
  68.     SD_DAT,                     -- SD Card Data
  69.     SD_DAT3,                    -- SD Card Data 3
  70.     SD_CMD : inout std_logic;   -- SD Card Command Signal
  71.     SD_CLK : out std_logic;     -- SD Card Clock
  72.  
  73.     -- USB JTAG link
  74.    
  75.     TDI,                        -- CPLD -> FPGA (data in)
  76.     TCK,                        -- CPLD -> FPGA (clk)
  77.     TCS : in std_logic;         -- CPLD -> FPGA (CS)
  78.     TDO : out std_logic;        -- FPGA -> CPLD (data out)
  79.  
  80.     -- I2C bus
  81.    
  82.     I2C_SDAT : inout std_logic; -- I2C Data
  83.     I2C_SCLK : out std_logic;   -- I2C Clock
  84.  
  85.     -- PS/2 port
  86.  
  87.     PS2_DAT,                    -- Data
  88.     PS2_CLK : in std_logic;     -- Clock
  89.  
  90.     -- VGA output
  91.    
  92.     VGA_HS,                                             -- H_SYNC
  93.     VGA_VS: out std_logic;                               -- V_SYNC
  94.     VGA_R,                                              -- Red[3:0]
  95.     VGA_G,                                              -- Green[3:0]
  96.     VGA_B : out std_logic_vector(3 downto 0);           -- Blue[3:0]
  97.    
  98.     -- Audio CODEC
  99.    
  100.     AUD_ADCLRCK : inout std_logic;                      -- ADC LR Clock
  101.     AUD_ADCDAT : in std_logic;                          -- ADC Data
  102.     AUD_DACLRCK : inout std_logic;                      -- DAC LR Clock
  103.     AUD_DACDAT : out std_logic;                         -- DAC Data
  104.     AUD_BCLK : inout std_logic;                         -- Bit-Stream Clock
  105.     AUD_XCK : out std_logic;                            -- Chip Clock
  106.    
  107.     -- General-purpose I/O
  108.    
  109.     GPIO_0,                                      -- GPIO Connection 0
  110.     GPIO_1 : inout std_logic_vector(35 downto 0); -- GPIO Connection 1  
  111.    
  112.     --teclado
  113.     keyboard_clk, keyboard_data, clock_50MHz ,
  114.     reset, read : IN STD_LOGIC;
  115.     scan_code : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
  116.     scan_ready : OUT STD_LOGIC
  117.    
  118.    
  119.     );
  120. END Calculadora;
  121.  
  122. ARCHITECTURE comportamental OF Calculadora IS
  123. --talvez vire uma maquina de estados, usada quando se aperta o igual
  124. TYPE operacao IS (ENTER, SOMA, SUBTRACAO, MULTIPLICACAO, DIVISAO);
  125. SIGNAL OPERACAOKB: operacao := ENTER;
  126.  
  127. SIGNAL VALOR_ANTERIOR:INTEGER:=0;
  128. SIGNAL VALOR_ATUAL:INTEGER:=0;
  129. SIGNAL Resultado:INTEGER:=0;
  130.  
  131.  
  132. --seria a TeclaDigitada do teclado
  133. SIGNAL TeclaDigitada: STD_LOGIC_VECTOR (3 DOWNTO 0):=KEY;
  134. --esse valor de saida sera convertido num process para os displays
  135. SIGNAL saida: INTEGER:=0;
  136.  
  137. --nao vou acender led nenhum pra memoria
  138. SIGNAL memoria:INTEGER:=0;
  139. --quando o valor for muito alto, esse signal fica positivo, indicando um buffer overflow
  140. SIGNAL erro: BIT:='0';
  141.  
  142. --signal section (teclado)
  143. SIGNAL INCNT : STD_LOGIC_VECTOR( 3 DOWNTO 0 );
  144. SIGNAL SHIFTIN : STD_LOGIC_VECTOR( 8 DOWNTO 0 );
  145. SIGNAL CodigoTeclado : STD_LOGIC_VECTOR( 8 DOWNTO 0 );
  146. SIGNAL READ_CHAR, clock_enable : STD_LOGIC;
  147. SIGNAL INFLAG, ready_set : STD_LOGIC;
  148. SIGNAL keyboard_clk_filtered : STD_LOGIC;
  149. SIGNAL filter : STD_LOGIC_VECTOR( 7 DOWNTO 0 );
  150.  
  151.  
  152. BEGIN
  153.     PROCESS(CLOCK_50, TeclaDigitada, CodigoTeclado) BEGIN
  154.     --uma variavel auxiliar para fazer as contas
  155.     --a saida recebe ela
  156.    
  157.  
  158.    
  159.         IF CLOCK_50'EVENT AND CLOCK_50='1' THEN
  160.         --detectar tecla digitada (numero, numero da tecla, scan_code)
  161. -- 0  -  99   -  70
  162. -- 1  -  93   -  69
  163. -- 2  -  98   -  72
  164. -- 3  -  103  -  7A
  165. -- 4  -  76   -  E0 70
  166. -- 5  -  97   -  73
  167. -- 6  -  102  -  74
  168. -- 7  -  91   -  6C
  169. -- 8  -  96   -  75
  170. -- 9  -  101  -  7D
  171. -- +  -  106  -  79
  172. -- -  -  105  -  7B
  173. -- *  -  100  -  7C
  174. -- /  -  95   -  E0 4A
  175. -- E  -  108  -  5A
  176.  
  177.         -- Processa tecla digitada
  178.         CASE TeclaDigitada IS
  179.             WHEN "0000" => VALOR_ATUAL <= VALOR_ATUAL*10;
  180.             WHEN "0001" => VALOR_ATUAL <= VALOR_ATUAL*10 + 1;
  181.             WHEN "0010" => VALOR_ATUAL <= VALOR_ATUAL*10 + 2;
  182.             WHEN "0011" => VALOR_ATUAL <= VALOR_ATUAL*10 + 3;
  183.             WHEN "0100" => VALOR_ATUAL <= VALOR_ATUAL*10 + 4;
  184.             WHEN "0101" => VALOR_ATUAL <= VALOR_ATUAL*10 + 5;
  185.             WHEN "0110" => VALOR_ATUAL <= VALOR_ATUAL*10 + 6;
  186.             WHEN "0111" => VALOR_ATUAL <= VALOR_ATUAL*10 + 7;
  187.             WHEN "1000" => VALOR_ATUAL <= VALOR_ATUAL*10 + 8;
  188.             WHEN "1001" => VALOR_ATUAL <= VALOR_ATUAL*10 + 9;
  189.  
  190.             WHEN "1010"  => OPERACAOKB<=SOMA;
  191.                             VALOR_ANTERIOR<=VALOR_ATUAL;
  192.                             VALOR_ATUAL<=0;
  193.             WHEN "1011"  => OPERACAOKB<=SUBTRACAO;
  194.                             VALOR_ANTERIOR<=VALOR_ATUAL;
  195.                             VALOR_ATUAL<=0;
  196.             WHEN "1100"  => OPERACAOKB<=MULTIPLICACAO;
  197.                             VALOR_ANTERIOR<=VALOR_ATUAL;
  198.                             VALOR_ATUAL<=0;
  199.             WHEN "1101"  => OPERACAOKB<=DIVISAO;
  200.                             VALOR_ANTERIOR<=VALOR_ATUAL;
  201.                             VALOR_ATUAL<=0;
  202.             WHEN "1111"  => -- Tecla =, faz operações
  203.                 CASE OPERACAOKB IS
  204.                 WHEN SOMA =>
  205.                     RESULTADO <= VALOR_ATUAL+VALOR_ANTERIOR;
  206.                     VALOR_ATUAL <= 0;
  207.                     VALOR_ANTERIOR <= 0;
  208.                 WHEN SUBTRACAO =>
  209.                     RESULTADO <= VALOR_ATUAL - VALOR_ANTERIOR;
  210.                     VALOR_ATUAL <= 0;
  211.                     VALOR_ANTERIOR <= 0;
  212.                 WHEN MULTIPLICACAO =>
  213.                     RESULTADO <= VALOR_ATUAL * VALOR_ANTERIOR;
  214.                     VALOR_ATUAL <= 0;
  215.                     VALOR_ANTERIOR <= 0;
  216.                 WHEN DIVISAO =>
  217.                     RESULTADO <= VALOR_ATUAL / VALOR_ANTERIOR;
  218.                     VALOR_ATUAL <= 0;
  219.                     VALOR_ANTERIOR <= 0;
  220.                 WHEN OTHERS => RESULTADO <= RESULTADO;
  221.                 END CASE;
  222.             WHEN OTHERS => VALOR_ATUAL <= VALOR_ATUAL;
  223.         END CASE;
  224.            
  225.             IF RESULTADO<=9999 THEN
  226.                 saida<=RESULTADO;
  227.             ELSE
  228.                 saida<=0;
  229.             END IF;
  230.         END IF;
  231.     END PROCESS;
  232.    
  233.    
  234. PROCESS (saida)
  235.     VARIABLE valor:INTEGER;
  236.     VARIABLE um: INTEGER;
  237.     VARIABLE c: INTEGER;
  238.     VARIABLE d: INTEGER;
  239.     VARIABLE u: INTEGER;
  240. BEGIN
  241.     --separa o numero em casas decimais
  242.     valor := saida;
  243.     um:= valor / 1000;
  244.    
  245.     valor := valor - um*1000;
  246.     c := valor / 100;
  247.  
  248.     valor := valor - c*100;
  249.     d := valor /10;
  250.    
  251.     valor := valor - d*10;
  252.     u := valor;
  253.     --acende os displays de acordo com os numeros
  254.     -- unidades de milhar - display 0
  255.     IF (um=1) THEN
  256.         HEX0<="1001111";
  257.     ELSIF (um=2) THEN
  258.         HEX0<="0010010";
  259.     ELSIF (um=3) THEN
  260.         HEX0<="0000110";
  261.     ELSIF (um=4) THEN
  262.         HEX0<="1001100";
  263.     ELSIF (um=5) THEN
  264.         HEX0<="0100100";
  265.     ELSIF (um=6) THEN
  266.         HEX0<="0100000";
  267.     ELSIF (um=7) THEN
  268.         HEX0<="0001111";
  269.     ELSIF (um=8) THEN
  270.         HEX0<="0000000";
  271.     ELSIF (um=9) THEN
  272.         HEX0<="0000100";
  273.     ELSIF (um=0) THEN
  274.         HEX0<="0000001";
  275.     END IF;
  276.     --centenas - display 1
  277.     IF (c=1) THEN
  278.         HEX1<="1001111";
  279.     ELSIF (c=2) THEN
  280.         HEX1<="0010010";
  281.     ELSIF (c=3) THEN
  282.         HEX1<="0000110";
  283.     ELSIF (c=4) THEN
  284.         HEX1<="1001100";
  285.     ELSIF (c=5) THEN
  286.         HEX1<="0100100";
  287.     ELSIF (c=6) THEN
  288.         HEX1<="0100000";
  289.     ELSIF (c=7) THEN
  290.         HEX1<="0001111";
  291.     ELSIF (c=8) THEN
  292.         HEX1<="0000000";
  293.     ELSIF (c=9) THEN
  294.         HEX1<="0000100";
  295.     ELSIF (c=0) THEN
  296.         HEX1<="0000001";
  297.     END IF;
  298.     --dezena - display 2
  299.     IF (d=1) THEN
  300.         HEX2<="1001111";
  301.     ELSIF (d=2) THEN
  302.         HEX2<="0010010";
  303.     ELSIF (d=3) THEN
  304.         HEX2<="0000110";
  305.     ELSIF (d=4) THEN
  306.         HEX2<="1001100";
  307.     ELSIF (d=5) THEN
  308.         HEX2<="0100100";
  309.     ELSIF (d=6) THEN
  310.         HEX2<="0100000";
  311.     ELSIF (d=7) THEN
  312.         HEX2<="0001111";
  313.     ELSIF (d=8) THEN
  314.         HEX2<="0000000";
  315.     ELSIF (d=9) THEN
  316.         HEX2<="0000100";
  317.     ELSIF (d=0) THEN
  318.         HEX2<="0000001";
  319.     END IF;
  320.     --unidade - display 3
  321.     IF (u=1) THEN
  322.         HEX3<="1001111";
  323.     ELSIF (u=2) THEN
  324.         HEX3<="0010010";
  325.     ELSIF (u=3) THEN
  326.         HEX3<="0000110";
  327.     ELSIF (u=4) THEN
  328.         HEX3<="1001100";
  329.     ELSIF (u=5) THEN
  330.         HEX3<="0100100";
  331.     ELSIF (u=6) THEN
  332.         HEX3<="0100000";
  333.     ELSIF (u=7) THEN
  334.         HEX3<="0001111";
  335.     ELSIF (u=8) THEN
  336.         HEX3<="0000000";
  337.     ELSIF (u=9) THEN
  338.         HEX3<="0000100";
  339.     ELSIF (u=0) THEN
  340.         HEX3<="0000001";
  341.     END IF;
  342. END PROCESS;
  343.  
  344.  
  345. PROCESS ( read, ready_set )
  346.     BEGIN
  347.     IF read = '1' THEN
  348.         scan_ready <= '0';
  349.     ELSIF ready_set'EVENT AND ready_set = '1' THEN
  350.         scan_ready <= '1';
  351.     END IF;
  352.     END PROCESS;
  353.    
  354.     --This process filters the raw clock signal coming from the
  355.     -- keyboard using a shift register and two AND gates
  356.     Clock_filter:
  357.     PROCESS
  358.     BEGIN
  359.     WAIT UNTIL clock_50MHz'EVENT AND clock_50MHz = '1';
  360.         clock_enable <= NOT clock_enable;
  361.     IF clock_enable = '1' THEN
  362.         filter ( 6 DOWNTO 0 ) <= filter( 7 DOWNTO 1 ) ;
  363.         filter( 7 ) <= keyboard_clk;
  364.         IF filter = "11111111" THEN
  365.             keyboard_clk_filtered <= '1';
  366.         ELSIF filter = "00000000" THEN
  367.             keyboard_clk_filtered <= '0';
  368.         END IF;
  369.     END IF;
  370.     END PROCESS Clock_filter;
  371.    
  372.     --This process reads in serial scan code data coming from the keyboard
  373.     PROCESS
  374.     BEGIN
  375.     WAIT UNTIL (KEYBOARD_CLK_filtered'EVENT AND KEYBOARD_CLK_filtered = '1');
  376.         IF RESET = '0' THEN
  377.             INCNT <= "0000";
  378.             READ_CHAR <= '0';
  379.         ELSE
  380.             IF KEYBOARD_DATA = '0' AND READ_CHAR = '0' THEN
  381.                 READ_CHAR <= '1';
  382.                 ready_set <= '0';
  383.             ELSE
  384.     -- Shift in next 8 data bits to assemble a scan code
  385.                 IF READ_CHAR = '1' THEN
  386.                     IF INCNT < "1001" THEN
  387.                         INCNT <= INCNT + 1;
  388.                         SHIFTIN( 7 DOWNTO 0 ) <= SHIFTIN( 8 DOWNTO 1 );
  389.                         SHIFTIN( 8 ) <= KEYBOARD_DATA;
  390.                         ready_set <= '0';
  391.     -- End of scan code character, so set flags and exit loop
  392.                     ELSE
  393.                         scan_code <= SHIFTIN( 7 DOWNTO 0 );
  394.                         CodigoTeclado <= SHIFTIN;
  395.                         READ_CHAR <='0';
  396.                         ready_set <= '1';
  397.                         INCNT <= "0000";
  398.                     END IF;
  399.                 END IF;
  400.             END IF;
  401.         END IF;
  402.     END PROCESS;
  403.  
  404.  
  405. END comportamental;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement