TODOPIC
Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: ElRival 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!!
-
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.
-
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 ????
-
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 !!! 
-
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.
-
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 !!
-
Pues para eso hay que hacer la conversión a BCD claro
.
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.
-
Tranquilo, muchas gracias de todos modos !!!