- Hobby elektronika
- Milyen billentyűzetet vegyek?
- Milyen videókártyát?
- Milyen egeret válasszak?
- Sokat megélt veterán CPU-t hoz vissza a piacra az Intel
- Multimédiás / PC-s hangfalszettek (2.0, 2.1, 5.1)
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- OLED TV topic
- Vezeték nélküli fülhallgatók
- Őszköszöntő hardverkeverék
Aktív témák
-
t3rm1nat0r
csendes tag
Elég a mellébeszélésből, lássuk a lényeget.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <X11/Xlib.h>
#include <assert.h>
#include <unistd.h>
Display *disp;
Window win;
GC gc;
void pixel(int x,int y,int color)
{
XSetForeground(disp,gc,color);
XDrawPoint(disp, win, gc, x,y);
}
void draw_line(int x1,int y1,int x2,int y2,int color)
{
XSetForeground(disp,gc,color);
XDrawLine(disp, win, gc, x1,y1,x2,y2);
}
void initialize()
{
disp = XOpenDisplay((0));
win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0,0, 1200, 850, 0,0,0);
XSelectInput(disp, win, StructureNotifyMask);
XMapWindow(disp, win);
gc = XCreateGC(disp, win, 0, (0));
XSetForeground(disp,gc,0);
while(1)
{
XEvent event;
XNextEvent(disp, &event);
if (event.type == MapNotify)break;
}
}
//#define random_nand
struct struct_nand
{
int in1,in2,out;
int link[2];
int xykoord[3][2];
}nand[2000];
int szinek[]={0x777700,0xffff00};
int xykoord[10][2];
const int link_0V =-3;
const int link_5V =-2;
const int link_none=-1;
const int sor=32;
const int ketsor=32*2;
void draw_tranz(int x,int y,int l1,int l2,int l3,int n)
{
draw_line(x,y,x,y+8,0xff0000);
draw_line(x+2,y,x+2,y+8,0xff0000);
xykoord[n][0]=x-4;//in
xykoord[n][1]=y+4;
draw_line(x-4,y+4,x-1,y+4,szinek[l1]);
draw_line(x+3,y+2,x+6,y+2,szinek[l2]);
draw_line(x+3,y+6,x+6,y+6,szinek[l3]);
draw_line(x+6,y-2,x+6,y+2,szinek[l2]);
draw_line(x+6,y+9,x+6,y+6,szinek[l3]);
if(n==1)
{
xykoord[4][0]=x+6;//out
xykoord[4][1]=y+9;
}
if(n==0)
{
xykoord[5][0]=x+6;//0.tr out
xykoord[5][1]=y+9;
}
}
void draw_nand(int j)
{
if(nand[j].link[0]==link_none)
if(nand[j].link[1]==link_none) return;
int x=j%sor;
int y=j/sor;
x*=30;
y*=40;
draw_tranz(x+12,y+12,nand[j].in1,1,!nand[j].in1,0);//1 bal
draw_tranz(x+24,y+12,nand[j].in2,1,!nand[j].in2,1);//3 db jobb lefele
draw_tranz(x+24,y+24,nand[j].in1, !nand[j].in1,0,2);
draw_tranz(x+24,y+36,nand[j].in2, !nand[j].in2,0,3);
int q=0,w=2;//in
draw_line(xykoord[q][0],xykoord[q][1],xykoord[q][0],xykoord[w][1],szinek[nand[j].in1]);
draw_line(xykoord[w][0],xykoord[w][1],xykoord[q][0],xykoord[w][1],szinek[nand[j].in1]);
q=1;w=3;
draw_line(xykoord[q][0],xykoord[q][1],xykoord[q][0],xykoord[w][1],szinek[nand[j].in2]);
draw_line(xykoord[w][0],xykoord[w][1],xykoord[q][0],xykoord[w][1],szinek[nand[j].in2]);
w=4;
draw_line(xykoord[w][0],xykoord[w][1],xykoord[w][0]+3,xykoord[w][1],szinek[nand[j].out]);//out
nand[j].xykoord[0][0]=xykoord[w][0]+3;
nand[j].xykoord[0][1]=xykoord[w][1];
w=0;
draw_line(xykoord[w][0],xykoord[w][1],xykoord[w][0]-3,xykoord[w][1],szinek[nand[j].in1]);//in1
draw_line(xykoord[w][0]+12,xykoord[w][1]+15,xykoord[w][0]-3,xykoord[w][1]+15,szinek[nand[j].in2]);//int2
nand[j].xykoord[1][0]=xykoord[w][0]-3;
nand[j].xykoord[1][1]=xykoord[w][1];
nand[j].xykoord[2][0]=xykoord[w][0]-3;
nand[j].xykoord[2][1]=xykoord[w][1]+15;
w=5;
draw_line(xykoord[w][0],xykoord[w][1],xykoord[w][0]+12,xykoord[w][1],szinek[!nand[j].in1]);//in1
}
void draw_connect(int j,int link,int s,int dx,int col)
{
if(link<0) return;
int x=nand[j].xykoord[s][0];
int y=nand[j].xykoord[s][1];
int x3=nand[link].xykoord[0][0];
int y3=nand[link].xykoord[0][1];
int x2,y2;
x2=x;
y2=y+dx;
draw_line(x,y,x2,y2,col);x=x2;y=y2;
x2=x3;
y2=y;
draw_line(x,y,x2,y2,col);x=x2;y=y2;
x2=x3+dx;
y2=y;
draw_line(x,y,x2,y2,col);x=x2;y=y2;
x2=x3+dx;
y2=y3;
draw_line(x,y,x2,y2,col);x=x2;y=y2;
x2=x3;
y2=y3;
draw_line(x,y,x2,y2,col);x=x2;y=y2;
}
void draw_layer()
{
int j;
for(j=0;j<1000;j+=40) draw_line(0,j+9,1000,j+9,0xffff00);//tap vezetekek
for(j=0;j<1000;j+=40) draw_line(0,j+6,1000,j+6,0x777700);
for(j=0;j<sor*sor;j++) draw_nand(j);
for(j=0;j<sor*sor;j++)
{
int dx=2+(j%8)*2;
draw_connect(j,nand[j].link[0],1,dx,szinek[nand[j].in1]);
draw_connect(j,nand[j].link[1],2,dx,szinek[nand[j].in2]);
}
}
void define_links(int t,int l1,int l2,int default_out)
{
nand[t].link[0]=l1;
nand[t].link[1]=l2;
nand[t].out=default_out;
}
void define_adder(int t,int l1,int l2,int l3)
{
int tr[]={
t+0, t+1, t+2, t+3, t+4,
t+sor+0, t+sor+1, t+sor+2, t+sor+3, 0};//5-8
define_links(tr[0],l1,l2,0); define_links(tr[1],l1,tr[0],0);
define_links(tr[2],tr[5],tr[1],0); define_links(tr[3],tr[2],l3,0);
define_links(tr[4],tr[3],tr[2],0);
define_links(tr[5],tr[0],l2,0); define_links(tr[6],tr[3],l3,0);
define_links(tr[7],tr[4],tr[6],0); define_links(tr[8],tr[0],tr[3],0);
}
void define_dflip(int t,int l1)
{
int tr[]={
t+0, t+1, t+2, t+3, t+4,
t+sor+0, t+sor+1, t+sor+2, t+sor+3, t+sor+4,0};//5-9
define_links(tr[0],link_5V,l1,0); //inverter
define_links(tr[5],link_5V,tr[4],1);
define_links(tr[1],l1,tr[5],0); define_links(tr[2],tr[7],tr[1],1);
define_links(tr[6],l1,tr[4],1); define_links(tr[7],tr[2],tr[6],0);
define_links(tr[3],tr[0],tr[2],1); define_links(tr[4],tr[9],tr[3],0);
define_links(tr[8],tr[0],tr[7],1); define_links(tr[9],tr[4],tr[8],1);
}
void define_decoder(int tr3,int tr4,int mask)
{
int dx[]={sor,sor,sor,sor};//invertalva egy ketsorral lejjebb
if(mask&1) dx[0]=0;
if(mask&2) dx[1]=0;
if(mask&4) dx[2]=0;
if(mask&8) dx[3]=0;
define_links(tr3 ,tr4+dx[0] ,tr4+ketsor+dx[1],0);
define_links(tr3+1,tr3,link_5V,0); //inverter
define_links(tr3+2,tr4+ketsor*2+dx[2],tr4+ketsor*3+dx[3],0);
define_links(tr3+3,tr3+2,link_5V,0);//inverter
define_links(tr3+4,tr3+1,tr3+3,0);
define_links(tr3+5,tr3+4,link_5V,0);//inverter
}
void nand_gates()
{
int i,j,y;
nand[0].out=1;
nand[sor].out=1;
for(j=0;j<sor*sor;j++)
{
nand[j].in1=1;
nand[j].in2=1;
nand[j].link[0]=link_none;
nand[j].link[1]=link_none;
#ifdef random_nand
nand[j].link[0]=j + (rand()%4) + (rand()%4)*sor;
nand[j].link[1]=j + (rand()%4) + (rand()%4)*sor;
#endif
}
//counter
int counter_bazis=2,counter_out_offset=4;
int tr=counter_bazis;
define_dflip(tr,0); tr+=ketsor;
define_dflip(tr,tr+counter_out_offset-ketsor); tr+=ketsor;
define_dflip(tr,tr+counter_out_offset-ketsor); tr+=ketsor;
define_dflip(tr,tr+counter_out_offset-ketsor); tr+=ketsor;
define_dflip(tr,tr+counter_out_offset-ketsor); tr+=ketsor;
define_dflip(tr,tr+counter_out_offset-ketsor); tr+=ketsor;
define_dflip(tr,tr+counter_out_offset-ketsor); tr+=ketsor;
define_dflip(tr,tr+counter_out_offset-ketsor); tr+=ketsor;
//address decoder
int tr3=20,tr4=counter_bazis + counter_out_offset, addr=0;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
define_decoder(tr3,tr4,addr++); tr3+=sor;
//adder
int adder_bazis=9,adder_out_offset=34;
int tr1=adder_bazis,tr_out1=counter_bazis+counter_out_offset,tr_out_carry=link_0V;
define_adder(tr1,link_0V,tr_out1,tr_out_carry); tr1+=ketsor; tr_out1+=ketsor;
tr_out_carry=adder_bazis + adder_out_offset + 1;
define_adder(tr1, link_5V, tr_out1, tr_out_carry); tr1+=ketsor; tr_out1+=ketsor; tr_out_carry+=ketsor;
define_adder(tr1, link_0V, tr_out1, tr_out_carry); tr1+=ketsor; tr_out1+=ketsor; tr_out_carry+=ketsor;
define_adder(tr1, link_5V, tr_out1, tr_out_carry); tr1+=ketsor; tr_out1+=ketsor; tr_out_carry+=ketsor;
define_adder(tr1, link_0V, tr_out1, tr_out_carry); tr1+=ketsor; tr_out1+=ketsor; tr_out_carry+=ketsor;
define_adder(tr1, link_0V, tr_out1, tr_out_carry); tr1+=ketsor; tr_out1+=ketsor; tr_out_carry+=ketsor;
define_adder(tr1, link_0V, tr_out1, tr_out_carry); tr1+=ketsor; tr_out1+=ketsor; tr_out_carry+=ketsor;
define_adder(tr1, link_0V, tr_out1, tr_out_carry); tr1+=ketsor; tr_out1+=ketsor; tr_out_carry+=ketsor;
while(1)
{
//printf("%d.. %d %d \n",k,nand[0].out,nand[sor].out);
draw_layer();
for(i=0;i<100;i++)
{
//draw_layer();//ido kell mig minden beall, kirajzolhato a koztes allapot
for(j=0;j<sor*sor;j++)
if((j%sor))//elso sor nem kell
{
int link1=nand[j].link[0];
int link2=nand[j].link[1];
if(link1==link_5V) nand[j].in1=1;//fix input
if(link2==link_5V) nand[j].in2=1;
if(link1==link_0V) nand[j].in1=0;
if(link2==link_0V) nand[j].in2=0;
if(link1>=0) nand[j].in1=nand[link1].out;//out -> in1,2
if(link2>=0) nand[j].in2=nand[link2].out;
}
for(j=0;j<sor*sor;j++)
if((j%sor))//elso sor nem kell
{
nand[j].out=!(nand[j].in1 & nand[j].in2);//NAND muvelet
}
}
int s=1,a=0;
for(y=0;y<16;y+=2)
{
// for(x=0;x<6;x++) printf("%d ",nand[x+sor*y].out);
int e=nand[counter_bazis + counter_out_offset + sor*y].out;//counter kimenet
if(e) a+=s;
s<<=1;
printf("%d ",e);
}
printf(" = %d \n",a);
a=0;s=1;
for(y=0;y<16;y+=2)
{
int e=nand[adder_bazis + sor*y + adder_out_offset].out;//adder kimenet
if(e) a+=s;
s<<=1;
printf("%d ",e);
}
printf(" = %d \n",a);
nand[0].out^=1;
printf("\n");
// getchar();
}
}
int main()
{
initialize();
nand_gates();
XFlush(disp);
getchar();
return 0;
}
Aktív témák
- iPad pro 11 M2 Celluar 128 GB + Apple Smart Folio
- Apple iPhone 14 Pro 128 GB Graphite 12 hónap Garancia Beszámítás Házhozszállítás
- Samsung Odyssey G5 S27CG554EU 27 QHD 165Hz Ívelt Gaming Monitor 6 hó garancia Házhozszállítás
- Dropshipping - Elindult Magyarország első használt iPhone XML feedje! - Phonelist.eu
- Samsung S32R750UE monitor - 4K/UHD állítható magasság HDMI - asztalra csavarozható!
- Akció! Hordozható GAMER Monitor! MSI MAG162V ! 15.6 1920x1080 FULLHD! Bolti ár fele!
- Apple iPhone SE 2022 / 256GB / Kártyafüggetlen / 12Hó Garancia
- Azonnali készpénzes AMD Ryzen 1xxx 2xxx 3xxx 5xxx processzor felvásárlás személyesen / csomagküldés
- BESZÁMÍTÁS! ASUS B550 Vision D B550 chipset alaplap garanciával hibátlan működéssel
- Lenovo V130-15IGM laptop (Pentium Silver N5000/8GB/256GB SSD
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft.
Város: Budapest