Brainer: ADC clock

tors nov 13, 2008 (Anders Enggaard)

Her kommer vanen tro en lille udfordring med lidt hovedbrud til FPGA folket. Den stammer fra et projekt, hvor det nok er nemmest at forestille sig et “hovedkort” med en FPGA på, som kan kobles sammen med to forskellige “indstikskort” med A/D convertere på. Det første indstikskort går fint nok – der skal samles serielle data op på rising edge:

SHIFT_REG_UP:PROCESS (ADC_CLK)
BEGIN
  IF ( rising_edge( ADC_CLK) ) THEN
    SHIFT_REGISTER(23 downto 1) <= SHIFT_REGISTER(22 downto 0);
    SHIFT_REGISTER(0) <= <= ADC_DATA_IN;
  END IF;
END PROCESS SHIFT_REG_UP;

Men så kommer det andet indstikskort ind i billedet. Her skal data også samles op serielt, men på falling edge. Og selvfølgelig skal det stadig fungere med det første indstikskort også (via et signal, som vælger indstikskort, kaldet “ADC_SEL” i den ny kode her):

ADC_DATA_IN_MUX <= ADC_DATA_IN when ( ADC_SEL = '0' ) else ADC_DATA_IN_REG;
SHIFT_REG_UP:PROCESS (ADC_CLK)
BEGIN
  IF ( rising_edge( ADC_CLK) ) THEN
    SHIFT_REGISTER(23 downto 1) <= SHIFT_REGISTER(22 downto 0);
    SHIFT_REGISTER(0) <= ADC_DATA_IN_MUX;
  END IF;
END PROCESS SHIFT_REG_UP;
CATCH_1_BIT_DOWN:PROCESS (ADC_CLK)
BEGIN
  IF ( falling_edge( ADC_CLK) ) THEN
    ADC_DATA_IN_REG <= ADC_DATA_IN;
  END IF;
END PROCESS CATCH_1_BIT_DOWN;

Det ser måske meget tilforladeligt ud – MEN der er et alvorligt problem. Din opgaver er at “gætte” hvad problemet er? Har du et svar – så skyd en mail! Der er ingen store pengepræmier – men hæder og omtale.

Alternativt var det måske en ide at se på et FPGA kursus :-) Vi har altid en plan på nettet under www.axcon.dk/courses og der kommer løbende opdateringer.

Hvad mener du?