LUT för CPLD

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
bos
Inlägg: 2273
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

LUT för CPLD

Inlägg av bos »

Jag köpte två utvecklingskort (Altera Cyclone 4 FPGA samt Xilinx Coolrunner CPLD) för några år sen men de har bara samlat damm på hyllan sen dess, i brist på testprojekt att pula med. Nu har jag dock hittat ett projekt som jag faktiskt Behöver, och försöker därför dyka ner i träsket. Jag kommer att använda Xilinx CoolRunner XC2C32A (CPLD), ISE 14.1, samt Verilog. Eftersom jag inte kan något av dessa tre har jag en väldig hög tröskel att kliva över, så jag måste bryta ner allt till väldigt små delmål om jag ska komma någon vart.

Det jag vill göra är att återskapa funktionaliteten som finns i en MT8812 (länk: https://www.microsemi.com/document-port ... eet-sept11) , som är en 8x12 Switch Array. Sju ingångar bestämmer exakt en utgång som signalen DATA ska hamna på när STROBE pulsas hög. Det här borde, tycker min humla, inte vara ogenomförbart med en CPLD. Jag vet bara inte riktigt hur ännu.

I mitt fall har jag också sju ingångar, fördelat på en 4-bit AX[3-0] samt en 3-bit AY[2-0]. Utgångar är två 8-bit YA[7-0] samt YB[7-0]. Beroende av alla kombinationer på AX och AY ska exakt en bit i vardera PA/PB påverkas, när och endast när STROBE pulsas. Om RESET sätts ska samtliga utgångar nollas.

Ungefärlig sanningstabell för AX/AY kontra YA/YB:
CPLD-table.png
Min Verilog-fil har just inget mer än enbart deklarationen, längre än så har jag inte kommit:

Kod: Markera allt

module Main(
    output [7:0] PA,
    output [7:0] PB,
    input [3:0] AX,
    input [2:0] AY,
    input STROBE,
    input DATA,
    input RESET
);

endmodule

Frågor:

Vilket är lämpligt sätt att implementera en uppslagstabell enligt den sanningstabell jag har tagit fram för det aktuella projektet? En hord med if-satser? (Jag är i detta begynnelsestadie mer intresserad av fullt läsbar kod jämfört med superkomprimerade quick-n-dirty-hack)

STROBE pulsas externt av en microcontroller. Utöver denna signal, behöver jag en klocksignal till CPLD-kretsen? Databladet för XC2C32A är lite vagt skriven, pinne 1 sägs vara "Global clock" men mer information om klocka hittar jag inte. Jag vet alltså inte om kretsen måste klockas (som en microcontroller), eller om den kan köras ändå.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
swesysmgr
Inlägg: 14128
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: LUT för CPLD

Inlägg av swesysmgr »

CASE WHEN och en lång lista med inkombinationerna? Jag tror du kan ha flera omdirigeringar för utsignaler under varje alternativ.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4689
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: LUT för CPLD

Inlägg av Swech »

Är inte tröskeln lägre om du ritar ett schema i Xilinx utvecklingssystem
istället för att skriva koden manuellt

Swech
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: LUT för CPLD

Inlägg av Mr Andersson »

Om du hade valt samma logik som MT-kretsen hade det varit ganska enkel kod. Två muxar, två register, och lite klocklogik. Men din sanningstabell verkar ganska konstig och har ingen simpel lösning. Dessutom har du en X-ingång för mycket.
Vilket är lämpligt sätt att implementera en uppslagstabell enligt den sanningstabell jag har tagit fram för det aktuella projektet? En hord med if-satser? (Jag är i detta begynnelsestadie mer intresserad av fullt läsbar kod jämfört med superkomprimerade quick-n-dirty-hack)
Använd absolut inte if/else if. Du kommer få extremt långa logikkedjor och hög latency. Använd case istället om du måste ha den där sanningstabellen.
STROBE pulsas externt av en microcontroller. Utöver denna signal, behöver jag en klocksignal till CPLD-kretsen? Databladet för XC2C32A är lite vagt skriven, pinne 1 sägs vara "Global clock" men mer information om klocka hittar jag inte. Jag vet alltså inte om kretsen måste klockas (som en microcontroller), eller om den kan köras ändå.
Strobe-signalen blir din klocka. Beroende på hur snabbt du vill köra kan det gå att använda en vanlig IO-pinne, eller så måste du använda en klockpinne. Skriv färdigt koden och simulera innan du du bygger hårdvaran och blir låst med ditt pinval.
Skriv svar