Autor Tema: TEMÓMETRO  (Leído 3754 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ElRival

  • PIC10
  • *
  • Mensajes: 16
TEMÓMETRO
« en: 02 de Febrero de 2006, 13:10:00 »
Hola a todos otra vez.... Bueno, estoy intentando hacer un termómetro con la fpga(spartan3 de 200mil puertas), y que me muestre la temperatura en una pantalla LCD, en la pantalla ya conseguí con vuestra ayuda poner mensajes y más o menos controlarla...

Pero ahora bien , el problema es el siguiente si quiero mostrar la temperatura en el display necesito procesar los datos que me llegan del convertidor A/D(8 bits), se me ha ocurrido una manera , pero es poco elegante, que sería hacer una memoria y dependiendo de la entrada de los 8bits entonces sacar los cuatro dígitos en la pantalla, que serían pj  28.5 , contando el "." como dígito. Pero a mi me gustaría hacerlo con un algoritmo de convertir los datos directamente sin hacer ninguna memoria para ahorrar puertas, ¿A alguien se le ocurre alguna manera de como hacerlo?

Muchas gracias de antemano!!

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: TEMÓMETRO
« Respuesta #1 en: 03 de Febrero de 2006, 05:16:00 »
Buenas de nuevo.

Hacer la conversion que dices es simplemente multiplicar por un número entero. Esta FPGA tiene multiplicadores hardware de 18 bits. Con uno solo que utilices te sobra para multiplicar un múmero de 8 bits por otro.

Si tienes el programa xilinx ISE, entre sus muchas utilidades, trae un asistente(core generator) para hacer módulos de todo tipo, incluidos los multiplicadores.

Si no tienes este programa, puedes buscar por la red que hay unos cuantos multiplicadores hardware.

Si tienes alguna duda, ya sabes.

Desconectado ElRival

  • PIC10
  • *
  • Mensajes: 16
RE: TEMÓMETRO
« Respuesta #2 en: 06 de Febrero de 2006, 04:40:00 »
Hola otra vez.... he generado un multiplicador, con el core generator.... de una entrada de 8 bits y multiplicado por una constante (diez) y me genera este código que me resulta un poco raro......



LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

Library XilinxCoreLib;
ENTITY multiplier IS
   port (
   clk: IN std_logic;
   a: IN std_logic_VECTOR(7 downto 0);
   q: OUT std_logic_VECTOR(11 downto 0));
END multiplier;

ARCHITECTURE multiplier_a OF multiplier IS

component wrapped_multiplier
   port (
   clk: IN std_logic;
   a: IN std_logic_VECTOR(7 downto 0);
   q: OUT std_logic_VECTOR(11 downto 0));
end component;

-- Configuration specification
   for all : wrapped_multiplier use entity XilinxCoreLib.mult_gen_v7_0(behavioral)
      generic map(
         c_a_type => 1,
         c_mem_type => 2,
         c_has_sclr => 0,
         c_reg_a_b_inputs => 1,
         c_has_q => 1,
         c_has_o => 0,
         bram_addr_width => 9,
         c_v2_speed => 0,
         c_baat => 1,
         c_output_hold => 0,
         c_b_constant => 1,
         c_has_loadb => 0,
         c_has_b => 0,
         c_use_luts => 1,
         c_has_rdy => 0,
         c_has_nd => 0,
         c_pipeline => 0,
         c_has_a_signed => 0,
         c_b_type => 1,
         c_sqm_type => 0,
         c_standalone => 1,
         c_enable_rlocs => 0,
         c_b_value => "1010",
         c_mult_type => 2,
         c_has_aclr => 0,
         c_has_swapb => 0,
         c_has_load_done => 0,
         c_out_width => 12,
         c_mem_init_prefix => "mem",
         c_b_width => 4,
         c_a_width => 8,
         c_has_rfd => 0,
         c_sync_enable => 1,
         c_has_ce => 0,
         c_stack_adders => 1);
BEGIN

U0 : wrapped_multiplier
      port map (
         clk => clk,
         a => a,
         q => q);
END multiplier_a;

-- synopsys translate_on





Y cuando lo sintetizo me da error, así que estoy un poco perdido !! Podeis ayudarme por favor ????

Desconectado ElRival

  • PIC10
  • *
  • Mensajes: 16
RE: TEMÓMETRO
« Respuesta #3 en: 06 de Febrero de 2006, 05:26:00 »
Bueno , lo he hecho de forma más bestia y este si que funciona.....

-----------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;  
use IEEE.numeric_std.all;        
use IEEE.std_logic_unsigned.all;
USE IEEE.std_logic_arith.all;   

entity Multiplicador is
   port (
      clk : in std_logic ;
      op1 : in std_logic_vector(7 downto 0);
      result : out std_logic_vector(11 downto 0));
end Multiplicador;                    

architecture Combinacional of Multiplicador is
begin

process(clk,op1)
begin                                          
   result <= op1 * "1010";
end process ;
end Combinacional;
-----------------------------------------------------------

Que os parece ????


Pero ahora tengo otro problema.... os explico.... quiero hacer el termómetro que os digo ,entonces el resultado del C A/D , está entre 0 y 255, 0 será para 0º y 255 para 50º, y quiero perder la menos resolución posible.... Entonces , si hacemos una regla de 3 tenemos que  255/x=50 y por tanto deberemos dividir todo entre 5.1, o lo que es lo mismo multiplicar por 10 y dividir entre 51 .  Entonces el multiplicador va genial, pero cuando hago lo mismo y pongo el signo " /" me dice que ese operador no puede ir ahi.

Supongo que será pq no se admiten decimales, pero es que es eso lo que yo quiero, tener decimales para que la temperatura sea precisa. Así que estoy un poco perdido !!!

Ayuda por favor !!! locoloco

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: TEMÓMETRO
« Respuesta #4 en: 06 de Febrero de 2006, 19:05:00 »
Bueno, el core generator te genera este código y además varios archivos que debes incluir en el directorio de tu proyecto. Estos archivos, los entiende el sintetizador de xilinx "XST" y te generará el multiplicador perfectamente.

De todas formas, puedes utilizar el 2º método. Para ello multiplica el resultado de la conversion por 197. De esta forma, cuando el termómetro entrege 255, el resultado de multiplicar será de 255*197=50235, y desprecias las 3 últimas cifras.

Así te ahorras la división. De todas formas, mira la frecuencia máxima de operación que te da el multiplicador este, porque suelen ser bastante lentorros y consumir demasiados recursos.

Desconectado ElRival

  • PIC10
  • *
  • Mensajes: 16
RE: TEMÓMETRO
« Respuesta #5 en: 07 de Febrero de 2006, 10:35:00 »
Ok!!! Muchas gracias, bueno , hasta aquí todo bien, pero como le digo ahora que 50 en binario, es para la pantalla lcd....un cinco y un cero ??? Es el problema que os planteo en otro post, como a partir de   un numero en binario como sería el "100000" (32) por ejemplo, como podriamos obtener un "3" y un "2" por separado

Gracias !!

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: TEMÓMETRO
« Respuesta #6 en: 07 de Febrero de 2006, 11:13:00 »
Pues para eso hay que hacer la conversión a BCD claroSonrisa Gigante.

Es una pena que no sepas verilog, porque el módulo de opencores esta bastante bien y es muy eficiente. Si tubiera tiempo te lo traducia a VHDL pero mañana empiezo en el curro y no voy a poder hasta el finde. Si tienes paciencia, te lo puedo ver el sábado por la mañana. Sino, buscate un manual de verilog e intenta comprender algo del conversor ese.

Desconectado ElRival

  • PIC10
  • *
  • Mensajes: 16
RE: TEMÓMETRO
« Respuesta #7 en: 07 de Febrero de 2006, 11:35:00 »
Tranquilo, muchas gracias de todos modos !!!


 

anything