Üzerinde çalıştığım bir proje için GAL16V8B kullanmayı düşünüyorum. Daha önce Gal ve Pal ile uğraşmadığım için bir araştışrma yaptım WINCUPL programını edindim. CUPL dilini bilmediğimden, öğrenmek için Türkçe dersler arıyorum. Yada Türkçe kaynak. Yardımcı olabilecek olan varmı ?
Merhaba;
Video olarak aşağıdaki video yardımcı olabilir.
Dosya olarak aşağıdaki linkte bulunan dosya fikir verebilir.
http://www.ehm.yildiz.edu.tr/images/files/deney_9.pdf (http://www.ehm.yildiz.edu.tr/images/files/deney_9.pdf)
Biz geçen yıl YTU de gal22v10 programladık aslında mantık aynı, FPGA gibi dijital tasarım. Yukarıdaki video program kullanımı için faydalı olabilir bölüm hocalarından biri çekmişti yanlış hatırlamıyorsam
CUPL oldukça basit asıl sorun WinCUPL hataları.
Bazen düzgün yazılan koda hatalı diye sentezlemediği olabiliyor.
YTU EHM için Lab örneklerimi paylaşayım belki faydası olur
Name ShiftRegister;
PartNo 00;
Date 03.06.2020;
Revision 01;
Designer Engineer;
Company Student;
Assembly None;
Location ;
Device g22v10;
/* *** INPUT PINS *** */
PIN 1 = CLK;
PIN [2 .. 5] = [I0, I1, I2, I3];
PIN [6 .. 10] = [S0, S1, SRSI, SLSI, CLR];
/* *** OUTPUT PINS *** */
PIN [20 .. 23] = [Q3, Q2, Q1, Q0];
/* *** OPERATION *** */
M41_3 = (!S1 & !S0 & Q3) # (!S1 & S0 & SRSI) # (S1 & !S0 & Q2) # (S1 & S0 & I3);
M41_2 = (!S1 & !S0 & Q2) # (!S1 & S0 & Q3) # (S1 & !S0 & Q1) # (S1 & S0 & I2);
M41_1 = (!S1 & !S0 & Q1) # (!S1 & S0 & Q2) # (S1 & !S0 & Q0) # (S1 & S0 & I1);
M41_0 = (!S1 & !S0 & Q0) # (!S1 & S0 & Q1) # (S1 & !S0 & SLSI) # (S1 & S0 & I0);
M21_3 = (CLR & M41_3);
M21_2 = (CLR & M41_2);
M21_1 = (CLR & M41_1);
M21_0 = (CLR & M41_0);
Q3.D = M21_3;
Q2.D = M21_2;
Q1.D = M21_1;
Q0.D = M21_0;
Q3.AR = 'b'0;
Q2.AR = 'b'0;
Q1.AR = 'b'0;
Q0.AR = 'b'0;
Q3.SP = 'b'0;
Q2.SP = 'b'0;
Q1.SP = 'b'0;
Q0.SP = 'b'0;
Name Project ;
PartNo 00 ;
Date 09.06.2020 ;
Revision 01 ;
Designer Engineer ;
Company Student ;
Assembly None ;
Location ;
Device g22v10 ;
/* *************** INPUT PINS *********************/
PIN [1 .. 4] = [CLK, RST, CE, UP_DOWN];
PIN [5 .. 9] = [D0, D1, D2, D3, D4];
/* *************** OUTPUT PINS *********************/
PIN [15 .. 19] = [Q0, Q1, Q2, Q3, Q4];
function full_adder(A, B, Cin, Cout)
{
Cout = ((A $ B) & Cin) # (A & B);
full_adder = (A $ B) $ Cin;
}
function mux_2x1(X0, X1, S)
{
mux_2x1 = (!S & X0) # (S & X1);
}
function xnor(A, B)
{
xnor = (A & B) # (!A & !B);
}
function A_EQ_B_5BIT(A0, A1, A2, A3, A4, B0, B1, B2, B3, B4)
{
X4 = xnor(A4, B4);
X3 = xnor(A3, B3);
X2 = xnor(A2, B2);
X1 = xnor(A1, B1);
X0 = xnor(A0, B0);
A_EQ_B_5BIT = (X4 & X3 & X2 & X1 & X0);
}
SUM0 = full_adder(Q0, 'b'1, 'b'0, CS1);
SUM1 = full_adder(Q1, 'b'0, CS1, CS2);
SUM2 = full_adder(Q2, 'b'1, CS2, CS3);
SUM3 = full_adder(Q3, 'b'0, CS3, CS4);
SUM4 = full_adder(Q4, 'b'0, CS4, CSOUT);
DIF0 = full_adder(Q0, 'b'1, 'b'0, CD1);
DIF1 = full_adder(Q1, 'b'1, CD1, CD2);
DIF2 = full_adder(Q2, 'b'0, CD2, CD3);
DIF3 = full_adder(Q3, 'b'1, CD3, CD4);
DIF4 = full_adder(Q4, 'b'1, CD4, CDOUT);
UD_SEL = !UP_DOWN;
UD0 = mux_2x1(SUM0, DIF0, UD_SEL);
UD1 = mux_2x1(SUM1, DIF1, UD_SEL);
UD2 = mux_2x1(SUM2, DIF2, UD_SEL);
UD3 = mux_2x1(SUM3, DIF3, UD_SEL);
UD4 = mux_2x1(SUM4, DIF4, UD_SEL);
LOW_LIM_SEL = UP_DOWN & A_EQ_B_5BIT(Q0, Q1, Q2, Q3, Q4, D0, D1, D2, D3, D4);
LL0 = mux_2x1(UD0, 'b'0, LOW_LIM_SEL);
LL1 = mux_2x1(UD1, 'b'0, LOW_LIM_SEL);
LL2 = mux_2x1(UD2, 'b'0, LOW_LIM_SEL);
LL3 = mux_2x1(UD3, 'b'0, LOW_LIM_SEL);
LL4 = mux_2x1(UD4, 'b'0, LOW_LIM_SEL);
UP_LIM_SEL = !(UP_DOWN # Q0 # Q1 # Q2 # Q3 # Q4);
UL0 = mux_2x1(LL0, D0, UP_LIM_SEL);
UL1 = mux_2x1(LL1, D1, UP_LIM_SEL);
UL2 = mux_2x1(LL2, D2, UP_LIM_SEL);
UL3 = mux_2x1(LL3, D3, UP_LIM_SEL);
UL4 = mux_2x1(LL4, D4, UP_LIM_SEL);
CE0 = mux_2x1(Q0, UL0, CE);
CE1 = mux_2x1(Q1, UL1, CE);
CE2 = mux_2x1(Q2, UL2, CE);
CE3 = mux_2x1(Q3, UL3, CE);
CE4 = mux_2x1(Q4, UL4, CE);
Q0.D = CE0;
Q1.D = CE1;
Q2.D = CE2;
Q3.D = CE3;
Q4.D = CE4;
Q0.AR = RST;
Q1.AR = RST;
Q2.AR = RST;
Q3.AR = RST;
Q4.AR = RST;
Q0.SP = 'b'0;
Q1.SP = 'b'0;
Q2.SP = 'b'0;
Q3.SP = 'b'0;
Q4.SP = 'b'0;
Q0.OE = 'b'1;
Q1.OE = 'b'1;
Q2.OE = 'b'1;
Q3.OE = 'b'1;
Q4.OE = 'b'1;
Buda manuel optimizasyon yapılmış bir örnek
Name Project ;
PartNo 00 ;
Date 09.06.2020 ;
Revision 01 ;
Designer Engineer ;
Company Student ;
Assembly None ;
Location ;
Device g22v10 ;
/* *************** INPUT PINS *********************/
PIN [1 .. 4] = [CLK, RST, CE, UP_DOWN];
PIN [5 .. 9] = [D0, D1, D2, D3, D4];
/* *************** OUTPUT PINS *********************/
PIN [17, 20, 21, 22, 23] = [Q4, Q3, Q2, Q1, Q0];
PIN 18 = IS_D_EQUAL_Q_PART1;
PIN 19 = IS_D_EQUAL_Q_PART2;
function full_add_sub(A, B, Cin, OP, Cout)
{
Cout = ((A $ (B $ OP)) & Cin) # (A & (B $ OP));
full_add_sub = (A $ (B $ OP)) $ Cin;
}
function mux_2x1(X0, X1, S)
{
mux_2x1 = (!S & X0) # (S & X1);
}
function xnor(A, B)
{
xnor = (A & B) # (!A & !B);
}
function A_EQ_B_5BIT(A0, A1, A2, A3, A4, B0, B1, B2, B3, B4)
{
X4 = xnor(A4, B4);
X3 = xnor(A3, B3);
X2 = xnor(A2, B2);
X1 = xnor(A1, B1);
X0 = xnor(A0, B0);
A_EQ_B_5BIT = (X4 & X3 & X2 & X1 & X0);
}
OP_SEL = !UP_DOWN;
RESULT0 = full_add_sub(Q0, 'b'1, OP_SEL, OP_SEL, CS0);
RESULT1 = full_add_sub(Q1, 'b'0, CS0, OP_SEL, CS1);
RESULT2 = full_add_sub(Q2, 'b'1, CS1, OP_SEL, CS2);
RESULT3 = full_add_sub(Q3, 'b'0, CS2, OP_SEL, CS3);
RESULT4 = full_add_sub(Q4, 'b'0, CS3, OP_SEL, COUT);
IS_D_EQUAL_Q_PART1 =
D0 & D1 & D2 & D3 & D4 & Q0 & Q1 & Q2 & Q3 & Q4
# D0 & D1 & D2 & D3 & !D4 & Q0 & Q1 & Q2 & Q3 & !Q4
# D0 & D1 & D2 & !D3 & D4 & Q0 & Q1 & Q2 & !Q3 & Q4
# D0 & D1 & D2 & !D3 & !D4 & Q0 & Q1 & Q2 & !Q3 & !Q4
# D0 & D1 & !D2 & D3 & D4 & Q0 & Q1 & !Q2 & Q3 & Q4
# D0 & D1 & !D2 & D3 & !D4 & Q0 & Q1 & !Q2 & Q3 & !Q4
# D0 & D1 & !D2 & !D3 & D4 & Q0 & Q1 & !Q2 & !Q3 & Q4
# D0 & D1 & !D2 & !D3 & !D4 & Q0 & Q1 & !Q2 & !Q3 & !Q4
# D0 & !D1 & D2 & D3 & D4 & Q0 & !Q1 & Q2 & Q3 & Q4
# D0 & !D1 & D2 & D3 & !D4 & Q0 & !Q1 & Q2 & Q3 & !Q4
# D0 & !D1 & D2 & !D3 & D4 & Q0 & !Q1 & Q2 & !Q3 & Q4
# D0 & !D1 & D2 & !D3 & !D4 & Q0 & !Q1 & Q2 & !Q3 & !Q4
# D0 & !D1 & !D2 & D3 & D4 & Q0 & !Q1 & !Q2 & Q3 & Q4
# D0 & !D1 & !D2 & D3 & !D4 & Q0 & !Q1 & !Q2 & Q3 & !Q4
# D0 & !D1 & !D2 & !D3 & D4 & Q0 & !Q1 & !Q2 & !Q3 & Q4
# D0 & !D1 & !D2 & !D3 & !D4 & Q0 & !Q1 & !Q2 & !Q3 & !Q4;
IS_D_EQUAL_Q_PART2 =
!D0 & !D1 & D2 & D3 & D4 & !Q0 & !Q1 & Q2 & Q3 & Q4
# !D0 & !D1 & D2 & D3 & !D4 & !Q0 & !Q1 & Q2 & Q3 & !Q4
# !D0 & !D1 & D2 & !D3 & D4 & !Q0 & !Q1 & Q2 & !Q3 & Q4
# !D0 & !D1 & D2 & !D3 & !D4 & !Q0 & !Q1 & Q2 & !Q3 & !Q4
# !D0 & !D1 & !D2 & D3 & D4 & !Q0 & !Q1 & !Q2 & Q3 & Q4
# !D0 & !D1 & !D2 & D3 & !D4 & !Q0 & !Q1 & !Q2 & Q3 & !Q4
# !D0 & !D1 & !D2 & !D3 & D4 & !Q0 & !Q1 & !Q2 & !Q3 & Q4
# !D0 & !D1 & !D2 & !D3 & !D4 & !Q0 & !Q1 & !Q2 & !Q3 & !Q4
# !D0 & D1 & !D2 & D3 & D4 & !Q0 & Q1 & !Q2 & Q3 & Q4
# !D0 & D1 & !D2 & D3 & !D4 & !Q0 & Q1 & !Q2 & Q3 & !Q4
# !D0 & D1 & !D2 & !D3 & D4 & !Q0 & Q1 & !Q2 & !Q3 & Q4
# !D0 & D1 & !D2 & !D3 & !D4 & !Q0 & Q1 & !Q2 & !Q3 & !Q4
# !D0 & D1 & D2 & !D3 & D4 & !Q0 & Q1 & Q2 & !Q3 & Q4
# !D0 & D1 & D2 & !D3 & !D4 & !Q0 & Q1 & Q2 & !Q3 & !Q4
# !D0 & D1 & D2 & D3 & D4 & !Q0 & Q1 & Q2 & Q3 & Q4
# !D0 & D1 & D2 & D3 & !D4 & !Q0 & Q1 & Q2 & Q3 & !Q4;
IS_D_EQUAL_Q = IS_D_EQUAL_Q_PART1 # IS_D_EQUAL_Q_PART2;
LOW_LIM_SEL = UP_DOWN & IS_D_EQUAL_Q;
LL0 = (RESULT0 & !LOW_LIM_SEL);
LL1 = (RESULT1 & !LOW_LIM_SEL);
LL2 = (RESULT2 & !LOW_LIM_SEL);
LL3 = (RESULT3 & !LOW_LIM_SEL);
LL4 = (RESULT4 & !LOW_LIM_SEL);
UP_LIM_SEL = !(UP_DOWN # Q0 # Q1 # Q2 # Q3 # Q4);
UL0 = mux_2x1(LL0, D0, UP_LIM_SEL);
UL1 = mux_2x1(LL1, D1, UP_LIM_SEL);
UL2 = mux_2x1(LL2, D2, UP_LIM_SEL);
UL3 = mux_2x1(LL3, D3, UP_LIM_SEL);
UL4 = mux_2x1(LL4, D4, UP_LIM_SEL);
CE0 = mux_2x1(Q0, UL0, CE);
CE1 = mux_2x1(Q1, UL1, CE);
CE2 = mux_2x1(Q2, UL2, CE);
CE3 = mux_2x1(Q3, UL3, CE);
CE4 = mux_2x1(Q4, UL4, CE);
Q0.D = CE0;
Q1.D = CE1;
Q2.D = CE2;
Q3.D = CE3;
Q4.D = CE4;
Q0.AR = RST;
Q1.AR = RST;
Q2.AR = RST;
Q3.AR = RST;
Q4.AR = RST;
Q0.SP = 'b'0;
Q1.SP = 'b'0;
Q2.SP = 'b'0;
Q3.SP = 'b'0;
Q4.SP = 'b'0;
Q0.OE = 'b'1;
Q1.OE = 'b'1;
Q2.OE = 'b'1;
Q3.OE = 'b'1;
Q4.OE = 'b'1;
Edit : Şu linklerdeki dökümanları okuyun
https://www.microchip.com/en-us/products/fpgas-and-plds/spld-cplds/pld-design-resources
https://www.microchip.com/developmenttools/ProductDetails/WinCUPL