Serializar bits desde el pin de entrada / salida con VHDL

1

El siguiente código lee 40 bits de datos enviados en serie desde un sensor de temperatura / humedad DHT-11 y almacena los datos en una matriz de 5 bytes de RAM.

El código es:

// Return values:

// DHTLIB_OK              0 => OK
// DHTLIB_ERROR_CHECKSUM -1 => Checksum error
// DHTLIB_ERROR_TIMEOUT  -2 => Timeout


int read(int pin)
{

    uint8_t bits[5]; // BUFFER TO RECEIVE
    uint8_t cnt = 7; // bit counter 0..7
    uint8_t idx = 0; // buffer index

    // EMPTY BUFFER
    for (int i=0; i<5; i++) bits[i] = 0;

    // REQUEST SAMPLE
    pinMode(pin, OUTPUT);    // set pin for output    
    digitalWrite(pin, LOW);  // write '0'
    delay(18);               // delay 18ms
    digitalWrite(pin, HIGH); // write '1'
    delayMicroseconds(40);   // delay 40 microseconds

    pinMode(pin, INPUT);     // set pin for input

    // ACKNOWLEDGE or TIMEOUT
    unsigned int loopCnt = 10000; 
    while(digitalRead(pin) == LOW)
        if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

    loopCnt = 10000;
    while(digitalRead(pin) == HIGH)
        if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

    // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
    for (int i=0; i<40; i++)
    {
        loopCnt = 10000;
        while(digitalRead(pin) == LOW)
            if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

        unsigned long t = micros();  // this function returns the timestamp in microseconds

        loopCnt = 10000;
        while(digitalRead(pin) == HIGH)
            if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

        if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
        if (cnt == 0)   // next byte?
        {
            cnt = 7;    // restart at MSB
            idx++;      // next byte!
        }
        else cnt--;
    }

    // WRITE TO RIGHT VARS
              // as bits[1] and bits[3] are allways zero they are omitted in formulas.
    humidity    = bits[0]; 
    temperature = bits[2]; 

    uint8_t sum = bits[0] + bits[2];  

    if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;
    return DHTLIB_OK;
}

Estoy empezando a desarrollar FPGA, pero no puedo detectar algunos conceptos de VHDL, como el poling un pin de un FPGA. Para las pruebas, estoy usando un Xilinx Spartan 3E con un reloj de 50 MHz.

La función C que devuelve un int (Ok, error de suma de comprobación o error de tiempo de espera).

El código VHDL equivalente no hace eso, por supuesto, sino que almacena el int en una variable.

¿Puedes ayudarme a convertir el código anterior a VHDL?

    
pregunta Anders Dijskstra

2 respuestas

4

Si estás luchando por captar los conceptos de VHDL, ¡no empieces con ese tipo de proyecto!

Comience más pequeño.

Primero, destella un LED a 1Hz. Ahora construye una simulación para el mismo código. Normalmente, primero construyes la simulación, pero sé que la mayoría de las personas realmente quieren ver algún hardware funcionando lo antes posible.

Ahora conecte un interruptor de botón a la FPGA y utilícelo para detener e iniciar el parpadeo del LED. No te olvides de rebatirlo. Primero simule, luego demuestre en hardware.

Una vez que haya realizado esas dos tareas, tendrá más idea acerca de VHDL y podrá hacer preguntas más pequeñas sobre la tarea que desea completar, en lugar de simplemente descargar una carga de código C y solicitar que se convierta en VHDL.

    
respondido por el Martin Thompson
0

Estoy de acuerdo con la respuesta de @Martin Thompson, pero me gustaría agregarla:

VHDL no es un lenguaje informático como "C" o "java". No puede convertir código secuencial al lenguaje de descripción de hardware.

Por supuesto, puede describir una pieza de hardware que hace la misma función que el código publicado. Pero en cualquier caso, no será un "código VHDL ejecutándose en el FPGA".

Si desea optar por HLD, le sugiero que comience por comprender los aspectos fundamentales de la codificación HDL. Recursos muy agradables y gratuitos están disponibles en la WEB. Los principales fabricantes de FPGA ofrecen cursos en línea de forma gratuita en sus sitios web. Este es un buen punto de partida.

Antes de que incluso intentes construir algo, te sugiero que trates de olvidar todo lo que sabes sobre el lenguaje informático y comiences a rascarlo pensando "hardware". E.G .: Todo lo que describo corre en paralelo. etc ...

    
respondido por el Blup1980

Lea otras preguntas en las etiquetas