CPLD för den absoluta nybörjaren
CPLD för den absoluta nybörjaren
Bifogas. Kommentarer mottages tacksamt!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: CPLD för den absoluta nybörjaren
En bra guide tycker jag, snudd på att jag skulle lyckas själv med denna som hjälp, trots att det här verkligen inte är mitt område 
Har varit sugen att prova dock.
Har varit sugen att prova dock.
Re: CPLD för den absoluta nybörjaren
Jag behöver uppdatera den. Det har kommit nya versioner av både LittleATF Programmer och Digital. Dock har jag en litet irriterande sak:
Skulle behöva en RS-vippa, men tar jag den i digital så gnäller Digital att den inte kan analysera den och försöker jag skapa en vippa med två grindar klagar den oxå.
Jag skall nu testa med den gamla gratisversionen av Quintus, en nätt liten sak som behöver 10Gb disk...
Skulle behöva en RS-vippa, men tar jag den i digital så gnäller Digital att den inte kan analysera den och försöker jag skapa en vippa med två grindar klagar den oxå.
Jag skall nu testa med den gamla gratisversionen av Quintus, en nätt liten sak som behöver 10Gb disk...
Re: CPLD för den absoluta nybörjaren
Jag tror att du skall skriva RS-vippan som en tillståndsmaskin bestående av en D-vippa + lite logik. Så brukar man tänka i CPLD/FPGA/ASIC-världen.
Re: CPLD för den absoluta nybörjaren
OK. Tror jag förstår, men blir det inte väldigt mycket flera makroceller då?
Re: CPLD för den absoluta nybörjaren
Nu är jag ignorant och har inte alls tittat på hur kretsarna du använder ser ut, så jag vet inte vad en macrocell är i detta fallet.
I klassiska CPLD är det vippor kopplade till matriser av AND-OR-grindar eller ekvivalent. De är byggda för tillståndsmaskiner, så det skall matcha bra. Om det är mer FPGA-liknande med SRAM-baserade macroblock så brukar dessa innehålla både sekventiella och kombinatoriska element, så det blir en bra match där också.
Försöker du bygga vippor med kombinatoriska element blir det sannolikt både varningar och odeterministiskt beteende. Gör bara det om du verkligen vet vad du gör:-) Men det går. Jag har byggt asynkrona tillståndsmaskiner i vanliga PAL-liknande kretsar, och det går finfint, men där är också komplexiteten begränsad och kretslösningen väldigt reguljär så jag inbillade mig att jag hade full kontroll. (Men för asynkrona maskiner behöver man realisera logiken hasardfritt också, och då går logikoptimeraingar bort.)
I klassiska CPLD är det vippor kopplade till matriser av AND-OR-grindar eller ekvivalent. De är byggda för tillståndsmaskiner, så det skall matcha bra. Om det är mer FPGA-liknande med SRAM-baserade macroblock så brukar dessa innehålla både sekventiella och kombinatoriska element, så det blir en bra match där också.
Försöker du bygga vippor med kombinatoriska element blir det sannolikt både varningar och odeterministiskt beteende. Gör bara det om du verkligen vet vad du gör:-) Men det går. Jag har byggt asynkrona tillståndsmaskiner i vanliga PAL-liknande kretsar, och det går finfint, men där är också komplexiteten begränsad och kretslösningen väldigt reguljär så jag inbillade mig att jag hade full kontroll. (Men för asynkrona maskiner behöver man realisera logiken hasardfritt också, och då går logikoptimeraingar bort.)
Re: CPLD för den absoluta nybörjaren
Det är ATF1504 och ATF1508.
5V eftersom jag tänkte ersätta en del av logiken i GPIB/HPIB med en sådan, om det går.
5V eftersom jag tänkte ersätta en del av logiken i GPIB/HPIB med en sådan, om det går.
Re: CPLD för den absoluta nybörjaren
Kollade väldigt snabbt. Det verkar som varje macrocell kan ta in ett antal globala signaler _samt_ fem produktsignaler (dvs fem AND-grindar med stort antal inputs) till en stor MUX, och på utgången av den sitter en fet OR som kan lägga ihop varianter av dessa inputs. Så en SR skall bara ta ett enda macroblock.
Spännande krets.
Vad programmerar du i för språk?
Spännande krets.
Vad programmerar du i för språk?
Re: CPLD för den absoluta nybörjaren
Det lilla jag testat med är inte programmering, utan jag har designat i Digital med logiska element, lika som jag annars skulle bygga med diskreta kretsar. Annars programmerar jag i C/C++ så hela VHLD/Verilog känns extremt främmande. Om jag skall implementera en GPIB mottagning så vill jag fånga det i ett register och så långt har jag kommit, men sedan vill jag naturligtvis trigga en vippa som dels signalerar på bussen att sändaren måste vänta, dels indikerar till min MPU att det finns ett byte att hämta. Digital är annars enkelt och bra och kan exportera till Verilog/VHDL.
Men som sagt var, en RS vippa går inte, däremot en JK:
Antingen får jag derivera en klocka från signalen, eller så ha en..
Tidigare har jag gjort allt i C-kod och assembler i en 5V kapabel MPU, men jag har även en version där jag använder ALS160/161 kretsar som tyvärr är på utgående så tanken var att fixa översättningen från 5V till 3.3 samt en del av logiken med en ATF150x
Men jag kanske kan lära mig VHDL genom att rita och exportera?
Men som sagt var, en RS vippa går inte, däremot en JK:
Antingen får jag derivera en klocka från signalen, eller så ha en..
Tidigare har jag gjort allt i C-kod och assembler i en 5V kapabel MPU, men jag har även en version där jag använder ALS160/161 kretsar som tyvärr är på utgående så tanken var att fixa översättningen från 5V till 3.3 samt en del av logiken med en ATF150x
Men jag kanske kan lära mig VHDL genom att rita och exportera?
Kod: Markera allt
-- generated by Digital. Don't modify this file!
-- Any changes will be lost if this file is regenerated.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
entity DIG_JK_FF is
generic (Default : std_logic);
port (
Q: out std_logic;
notQ: out std_logic;
J: in std_logic;
C: in std_logic;
K: in std_logic );
end DIG_JK_FF;
architecture Behavioral of DIG_JK_FF is
signal temp: std_logic := Default;
begin
process (C)
begin
if rising_edge(C) then
if (J='0' and K='1') then
temp <= '0';
elsif (J='1' and K='0') then
temp <= '1';
elsif (J='1' and K='1') then
temp <= not (temp);
end if;
end if;
end process;
Q <= temp;
notQ <= NOT( temp );
end Behavioral;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
entity main is
port (
S: in std_logic;
R: in std_logic;
Clk: in std_logic;
Q1: out std_logic;
Q2: out std_logic);
end main;
architecture Behavioral of main is
begin
gate0: entity work.DIG_JK_FF
generic map (
Default => '0')
port map (
J => S,
C => Clk,
K => R,
Q => Q1,
notQ => Q2);
end Behavioral;Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: CPLD för den absoluta nybörjaren
Ja, du kanske kan modda den filen.
"entity" specar interfacet
"architecture" specar beteendet, där den första är din vippa och den andra hela konstruktionen som instantierar den.
Det borde finnas en "entity" för toppnivån också tycker jag.
I "architecture" kör alla rader parallellt, så "Q <= temp" körs samtidigt som "notQ <= ..." samtidigt som process-blocket (i vilket koden kör sekventiellt. Egentligen är "<="-rader också processer, och alla processer kör parallellt, men koden inom dem är sekventiell.)
I din process finns ett antal if-rader, och notera att om man INTE definierar en utsignal för alla kombinationer av insignaler skapas ett minneselement, i detta fall en vippa som triggar på stigande flank. Man måste tänka sig för om man gör vanlig logik och ALLTID tilldela ALLA utsignaler ett värde. Man kan tilldela en utsignal värden flera gånger i processen och det är det sista som gäller.
Hur detta sedan syntetiseras ner på en målteknologi beror helt på vilka "komponenter" som finns tillgängliga. Du har ett verktyg som mappar filens beteende och interface mot CPLD-arkitekturen.
"entity" specar interfacet
"architecture" specar beteendet, där den första är din vippa och den andra hela konstruktionen som instantierar den.
Det borde finnas en "entity" för toppnivån också tycker jag.
I "architecture" kör alla rader parallellt, så "Q <= temp" körs samtidigt som "notQ <= ..." samtidigt som process-blocket (i vilket koden kör sekventiellt. Egentligen är "<="-rader också processer, och alla processer kör parallellt, men koden inom dem är sekventiell.)
I din process finns ett antal if-rader, och notera att om man INTE definierar en utsignal för alla kombinationer av insignaler skapas ett minneselement, i detta fall en vippa som triggar på stigande flank. Man måste tänka sig för om man gör vanlig logik och ALLTID tilldela ALLA utsignaler ett värde. Man kan tilldela en utsignal värden flera gånger i processen och det är det sista som gäller.
Hur detta sedan syntetiseras ner på en målteknologi beror helt på vilka "komponenter" som finns tillgängliga. Du har ett verktyg som mappar filens beteende och interface mot CPLD-arkitekturen.
Re: CPLD för den absoluta nybörjaren
Japp, det är Atmels "fitter" som skapar en JEDEC-fil som man sedan programmerar.
Jag skall testa litet vidare
Jag skall testa litet vidare
Re: CPLD för den absoluta nybörjaren
Ser at hardware nå også er under en fri lisens https://github.com/roscopeco/atfprog-hardware
Re: CPLD för den absoluta nybörjaren
Ett förtydligande. CPLDer är konstruerade för _synkrona_ designflöden. Designen skall vara klockad, flanktriggad, och det finns bara en klocka.
Det lät som att du ville ha en SR-vippa. Dessa är ju asynkrona, två motkopplade grindar utan klocka. Att bygga en sådan i en CPLD kommer att kräva att man har koll på alla detaljer. Jag avråder från det i detta läget.
Bygg något som är synkront, dvs klockat istället. Typ som kodsnutten du har. Du kan sannolikt INTE hämta klockan ut någon av insignalerna, för man måste ta hänsyn till setup och holdtider mm, och det kan så lätt bli indeterministiskt eller rent av orsaka att vipporna låser sig. Så planera för en extern klocka.
Är själva systemet du skall använda detta i verkligen asynkront?
Det lät som att du ville ha en SR-vippa. Dessa är ju asynkrona, två motkopplade grindar utan klocka. Att bygga en sådan i en CPLD kommer att kräva att man har koll på alla detaljer. Jag avråder från det i detta läget.
Bygg något som är synkront, dvs klockat istället. Typ som kodsnutten du har. Du kan sannolikt INTE hämta klockan ut någon av insignalerna, för man måste ta hänsyn till setup och holdtider mm, och det kan så lätt bli indeterministiskt eller rent av orsaka att vipporna låser sig. Så planera för en extern klocka.
Är själva systemet du skall använda detta i verkligen asynkront?
Re: CPLD för den absoluta nybörjaren
Japp. Bra, för då kan man fixa ev fel. Tidigare version av atfu hade en bugg som gjorde att den inte verifierade OK.tingo skrev: ↑15 oktober 2025, 21:05:54 Ser at hardware nå også er under en fri lisens https://github.com/roscopeco/atfprog-hardware
