wincupl

Başlatan diot, 25 Mart 2021, 15:48:19

diot

Ü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ı ?

ali.f

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

baran123

#2
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