論理回路とブール代数 山中和義 2007/07/04 22:08:39 ├!電子サイコロをつくる 山中和義 2007/07/04 22:59:08 (修正3回) │└!7セグメント数字表示をつくる 山中和義 2007/07/05 13:04:32 (修正1回) │ └!電子ルーレットをつくる 山中和義 2007/07/06 11:45:24 (修正1回) │ └!順序回路 山中和義 2007/07/08 09:30:39 (修正2回) │ ├!8回路リングカウンタをつくる 山中和義 2007/07/17 11:18:40 (修正1回) │ │└!N進カウンタをつくる 山中和義 2007/07/19 11:25:08 │ │ └つづき(カウンタ部分の差し替え) 山中和義 2007/07/19 11:29:13 (修正1回) │ └RS-FFは回路図で記述して、RS-FFを用いてJK... 山中和義 2007/07/31 14:23:38 (修正1回) └!演算論理装置ALU(ArithmeticLogicUnit) 山中和義 2007/08/07 22:10:30 └続き 山中和義 2007/08/07 22:12:35
論理回路とブール代数 山中和義 2007/07/04 22:08:39 ツリーへ
論理回路とブール代数 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/04 22:08:39 | |
!論理回路シミュレータ !基本論理回路 DEF AND(x,y)=MIN(x,y) !AND回路 DEF OR(x,y)=MAX(x,y) !OR回路 DEF NT(x)=1-x !NOT回路 DEF NAND(x,y)=NT(AND(x,y)) !NAND回路 DEF NOR(x,y)=NT(OR(x,y)) !NOR回路 !演算回路 DEF XOR(x,y)=NAND(NAND(x,NT(y)),NAND(NT(x),y)) !XOR回路(Exclusive-OR) SUB HALF_ADDER(a,b, s,c,nc) !半加算器 LET s=XOR(a,b) !和 LET c=AND(a,b) !桁上がり LET nc=NT(c) END SUB SUB FULL_ADDER(a,b,ci, s,co) !全加算器 CALL HALF_ADDER(a,b, S0,c,C0) CALL HALF_ADDER(S0,ci, s,c,C1) !和 LET co=NAND(C0,C1) !桁上がり END SUB SUB ADDER(a(),b(),n, c(),co) !加算器 LET ci=0 FOR i=n TO 1 STEP -1 !下の桁より CALL FULL_ADDER(a(i),b(i),ci, s,co) LET c(i)=s LET ci=co NEXT i END SUB !補助ルーチン SUB ToBinary(x,n, a()) !2進数へ FOR i=1 TO n LET a(i)=VAL(mid$(right$(REPEAT$("0",n-1)&BSTR$(x,2),n),i,1)) NEXT i END SUB FUNCTION ToDecimal(a(),n) !10進数へ LET c=a(1) FOR i=2 TO n LET c=c*2+a(i) !a(1)*2^n+a(2)*2^(n-1)+ … +a(n-1)*2+a(n) NEXT i LET ToDecimal=c END FUNCTION !動作を確認する FOR a=0 TO 1 FOR b=0 TO 1 FOR ci=0 TO 1 CALL FULL_ADDER(a,b,ci, s,co) PRINT a;b;ci, s;co NEXT ci NEXT b NEXT a LET n=4 DIM regA(n),regB(n),regC(n) !レジスタ FOR a=0 TO 15 CALL ToBinary(a,n, RegA) FOR b=0 TO 15 CALL ToBinary(b,n, RegB) CALL ADDER(regA,regB,n, regC,co) LET c=ToDecimal(regC,n) PRINT a;"+";b, co;c NEXT b NEXT a END |
├!電子サイコロをつくる 山中和義 2007/07/04 22:59:08 (修正3回) ツリーへ
Re: 論理回路とブール代数 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/04 22:59:08 ** この記事は3回修正されてます | |
!電子サイコロをつくる
!基本論理回路 DEF AND(x,y)=MIN(x,y) !AND回路 DEF OR(x,y)=MAX(x,y) !OR回路 DEF NT(x)=1-x !NOT回路 SET WINDOW -2,2,-2,2 FOR sw1=0 TO 1 !3つのスイッチ FOR sw2=0 TO 1 FOR sw3=0 TO 1 LET a=sw3 !デコード LET b=OR(sw1,sw2) LET c=sw1 LET d=AND(sw1,sw2) PRINT sw1;sw2;sw3, a;b;c;d !真理値表 CLEAR DRAW LEDdice(a,b,c,d) !発光ダイオードを使ってサイコロの目を光で表す WAIT DELAY 1 NEXT sw3 NEXT sw2 NEXT sw1 !電子部品(配置と配線) !b c 配置位置 !dad !c b PICTURE LEDdice(a,b,c,d) !サイコロの目を表示する DRAW LED(a) WITH SHIFT(0,0) DRAW LED(b) WITH SHIFT(-1,1) DRAW LED(b) WITH SHIFT(1,-1) DRAW LED(c) WITH SHIFT(-1,-1) DRAW LED(c) WITH SHIFT(1,1) DRAW LED(d) WITH SHIFT(-1,0) DRAW LED(d) WITH SHIFT(1,0) END PICTURE !電子部品(下位) PICTURE LED(a) !発光ダイオードを表示する IF a=1 THEN DRAW disk WITH SCALE(0.4) !点灯 ELSE DRAW circle WITH SCALE(0.4) !消灯 END IF END PICTURE END |
│└!7セグメント数字表示をつくる 山中和義 2007/07/05 13:04:32 (修正1回) ツリーへ
Re: !電子サイコロをつくる |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/05 13:04:32 ** この記事は1回修正されてます | |
!7セグメント数字表示をつくる
!基本論理回路 DEF AND(x,y)=MIN(x,y) !AND回路 DEF OR(x,y)=MAX(x,y) !OR回路 DEF NT(x)=1-x !NOT回路 !ゲート数を拡張する DEF AND3(a,b,c)=AND(AND(a,b),c) !3ゲートAND回路 DEF AND4(a,b,c,d)=AND(AND(a,b),AND(c,d)) !4ゲートAND回路 DEF OR3(a,b,c)=OR(OR(a,b),c) !3ゲートOR回路 DEF OR4(a,b,c,d)=OR(OR(a,b),OR(c,d)) !4ゲートOR回路 SET WINDOW -3,3,-3,3 FOR A=0 TO 1 !4ビット入力 A*2^3+B*2^2+C*2+D FOR B=0 TO 1 FOR C=0 TO 1 FOR D=0 TO 1 CALL DECODE7segment(A,B,C,D, Za,Zb,Zc,Zd,Ze,Zf,Zg,dp) !復号化する PRINT A;B;C;D, Za;Zb;Zc;Zd;Ze;Zf;Zg !真理値表 CLEAR DRAW LED7segment(Za,Zb,Zc,Zd,Ze,Zf,Zg,dp) !発光ダイオードを光らせる WAIT DELAY 1 NEXT D NEXT C NEXT B NEXT A !電子部品(配置と配線) SUB DECODE7segment(A,B,C,D, Za,Zb,Zc,Zd,Ze,Zf,Zg,dp) !4ビット入力10進数表示回路 LET nA=NT(A) !作業変数 LET nB=NT(B) LET nC=NT(C) LET nD=NT(D) LET bcd=AND3(B,C,D) LET Za=OR(AND4(nA,nB,nC,D),AND3(B,nC,nD)) LET Zb=OR(AND3(B,nC,D),AND3(B,C,nD)) LET Zc=AND3(nB,C,nD) LET Zd=OR(Za,bcd) LET Ze=OR(AND(B,nC),D) LET Zf=OR3(AND3(nA,nB,D),AND(nB,C),AND(C,D)) LET Zg=OR(AND3(nA,nB,nC),bcd) LET dp=0 END SUB ! --a- 配置位置 ! f| |b ! --g- ! e| |c ! --d- dp PICTURE LED7segment(a,b,c,d,e,f,g,dp) !7セグメント数字表示器 ※アノード・コモン DRAW bar(NT(a)) WITH SHIFT(0,2) DRAW bar(NT(b)) WITH ROTATE(PI/2)*SHIFT(1,1) DRAW bar(NT(c)) WITH ROTATE(PI/2)*SHIFT(1,-1) DRAW bar(NT(d)) WITH SHIFT(0,-2) DRAW bar(NT(e)) WITH ROTATE(PI/2)*SHIFT(-1,-1) DRAW bar(NT(f)) WITH ROTATE(PI/2)*SHIFT(-1,1) DRAW bar(NT(g)) WITH SHIFT(0,0) DRAW LED(NT(dp)) WITH SHIFT(2,-2) END PICTURE !電子部品(下位) PICTURE bar(a) ! !発光ダイオードを表示する IF a=1 THEN PLOT AREA: -1,-0.2; 1,-0.2; 1,0.2; -1,0.2 !点灯 ELSE PLOT LINES: -1,-0.2; 1,-0.2; 1,0.2; -1,0.2; -1,-0.2 !消灯 END IF END PICTURE PICTURE LED(a) !発光ダイオードを表示する IF a=1 THEN DRAW disk WITH SCALE(0.4) !点灯 ELSE DRAW circle WITH SCALE(0.4) !消灯 END IF END PICTURE END |
│ └!電子ルーレットをつくる 山中和義 2007/07/06 11:45:24 (修正1回) ツリーへ
Re: !7セグメント数字表示をつくる |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/06 11:45:24 ** この記事は1回修正されてます | |
!電子ルーレットをつくる
!4ビット入力16出力デコ−ダ(4bit-16DECODE) !基本論理回路 DEF AND(x,y)=MIN(x,y) !AND回路 DEF OR(x,y)=MAX(x,y) !OR回路 DEF NT(x)=1-x !NOT回路 DEF NAND(x,y)=NT(AND(x,y)) !NAND回路 DEF NOR(x,y)=NT(OR(x,y)) !NOR回路 !ゲート数を拡張する DEF AND3(a,b,c)=AND(AND(a,b),c) !3ゲートAND回路 DEF AND4(a,b,c,d)=AND(AND(a,b),AND(c,d)) !4ゲートAND回路 DEF OR3(a,b,c)=OR(OR(a,b),c) !3ゲートOR回路 DEF OR4(a,b,c,d)=OR(OR(a,b),OR(c,d)) !4ゲートOR回路 SET WINDOW -4,4,-4,4 DIM adr(16) FOR A=0 TO 1 !4ビット入力 A*2^3+B*2^2+C*2+D FOR B=0 TO 1 FOR C=0 TO 1 FOR D=0 TO 1 LET adr(1)=AND4(NT(A),NT(B),NT(C),NT(D)) !16デコード(アドレス系) LET adr(2)=AND4(NT(A),NT(B),NT(C),D) LET adr(3)=AND4(NT(A),NT(B),C,NT(D)) LET adr(4)=AND4(NT(A),NT(B),C,D) LET adr(5)=AND4(NT(A),B,NT(C),NT(D)) LET adr(6)=AND4(NT(A),B,NT(C),D) LET adr(7)=AND4(NT(A),B,C,NT(D)) LET adr(8)=AND4(NT(A),B,C,D) LET adr(9)=AND4(A,NT(B),NT(C),NT(D)) LET adr(10)=AND4(A,NT(B),NT(C),D) LET adr(11)=AND4(A,NT(B),C,NT(D)) LET adr(12)=AND4(A,NT(B),C,D) LET adr(13)=AND4(A,B,NT(C),NT(D)) LET adr(14)=AND4(A,B,NT(C),D) LET adr(15)=AND4(A,B,C,NT(D)) LET adr(16)=AND4(A,B,C,D) PRINT A;B;C;D, !真理値表 FOR i=1 TO 16 PRINT adr(i); NEXT i CLEAR DRAW LEDroulette(16,adr) !発光ダイオードを使ってルーレットを光で表す WAIT DELAY 0.5 NEXT D NEXT C NEXT B NEXT A PICTURE LEDroulette(n,adr()) !円周上に配置されたLEDを表示する FOR i=1 TO n !ダイナミック点灯(個々に点灯させる) DRAW LED(adr(i)) WITH SHIFT(0,3)*ROTATE(2*PI*i/n) NEXT i END PICTURE PICTURE LED(a) !発光ダイオードを表示する IF a=1 THEN DRAW disk WITH SCALE(0.4) !点灯 ELSE DRAW circle WITH SCALE(0.4) !消灯 END IF END PICTURE END |
│ └!順序回路 山中和義 2007/07/08 09:30:39 (修正2回) ツリーへ
Re: !電子ルーレットをつくる |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/08 09:30:39 ** この記事は2回修正されてます | |
!順序回路
!基本論理回路 DEF AND(x,y)=MIN(x,y) !AND回路 DEF OR(x,y)=MAX(x,y) !OR回路 DEF NT(x)=1-x !NOT回路 !フリップフロップ回路 !※非同期型 DIM FFQn(50),FFclk(50) !状態、エッジ検出 ※50個分 SUB RS_FF(id,R,S, Q,nQ) !リセット・セット型 IF S*R=1 THEN EXIT SUB !S=1,R=1の入力は禁止 LET FFQn(id)=OR(S,AND(NT(R),FFQn(id))) !特性方程式 Qn+1=S+R'*Qn LET Q=FFQn(id) !出力 LET nQ=NT(Q) END SUB SUB JK_FF(id,J,K, Q,nQ) !JK型 LET FFQn(id)=OR(AND(NT(K),FFQn(id)),AND(J,NT(FFQn(id)))) !Qn+1=K'*Qn+J*Qn' LET Q=FFQn(id) !出力 LET nQ=NT(Q) END SUB SUB T_FF(id,T, Q,nQ) !トグル型 ※J=T,K=TのJK-FF LET FFQn(id)=OR(AND(NT(T),FFQn(id)),AND(T,NT(FFQn(id)))) !Qn+1=T'*Qn+T*Qn' LET Q=FFQn(id) !出力 LET nQ=NT(Q) END SUB SUB T_FFc(id,T,CLR, Q,nQ) !トグル型 IF CLR=1 THEN !reset LET FFQn(id)=0 ELSE CALL T_FF(id,T, Q,nQ) END IF END SUB SUB D_FF(id,D, Q,nQ) !ディレイ型 LET FFQn(id)=D !Qn+1=D LET Q=FFQn(id) !出力 LET nQ=NT(Q) END SUB !※同期型 SUB eRS_FF(id,CLK,R,S, Q,nQ) !リセット・セット型 IF FFclk(id)=0 AND CLK=1 THEN !ポジティブエッジ L→H CALL RS_FF(id,R,S, Q,nQ) ELSE LET Q=FFQn(id) !出力 LET nQ=NT(Q) END IF LET FFclk(id)=CLK !次へ END SUB SUB eJK_FF(id,CLK,J,K, Q,nQ) !JK型 IF FFclk(id)=0 AND CLK=1 THEN CALL JK_FF(id,J,K, Q,nQ) ELSE LET Q=FFQn(id) !出力 LET nQ=NT(Q) END IF LET FFclk(id)=CLK !次へ END SUB SUB eT_FF(id,CLK,T, Q,nQ) !トグル型 IF FFclk(id)=0 AND CLK=1 THEN CALL T_FF(id,T, Q,nQ) ELSE LET Q=FFQn(id) !出力 LET nQ=NT(Q) END IF LET FFclk(id)=CLK !次へ END SUB SUB eD_FF(id,CLK,D, Q,nQ) !ディレイ型 IF FFclk(id)=0 AND CLK=1 THEN CALL D_FF(id,D, Q,nQ) ELSE LET Q=FFQn(id) !出力 LET nQ=NT(Q) END IF LET FFclk(id)=CLK !次へ END SUB !定数 LET TRUE=1 LET FALSE=0 LET Vcc=1 !VDD LET GND=0 LET CLK=0 !システムクロック FOR t=0 TO 32 CALL eJK_FF(11,CLK,Vcc,Vcc, Q1,nQ1) !16進カウンタ CALL eJK_FF(12,Q1,Vcc,Vcc, Q2,nQ2) CALL eJK_FF(13,Q2,Vcc,Vcc, Q3,nQ3) CALL eJK_FF(14,Q3,Vcc,Vcc, Q4,nQ4) CALL eJK_FF(15,Q4,Vcc,Vcc, Q5,nQ5) PRINT USING "T=## ":t; !タイムチャート PRINT CLK, Q1;Q2;Q3;Q4;Q5;Q6;Q7;Q8 LET CLK=NT(CLK) NEXT t END |
│ ├!8回路リングカウンタをつくる 山中和義 2007/07/17 11:18:40 (修正1回) ツリーへ
Re: !順序回路 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/17 11:18:40 ** この記事は1回修正されてます | |
!8回路リングカウンタをつくる
!基本論理回路 DEF AND(x,y)=MIN(x,y) !AND回路 DEF OR(x,y)=MAX(x,y) !OR回路 DEF NT(x)=1-x !NOT回路 DEF OR4(a,b,c,d)=OR(OR(a,b),OR(c,d)) !4ゲートOR回路 DEF NOR8(a1,a2,a3,a4,a5,a6,a7,a8)=NT(OR(OR4(a1,a2,a3,a4),OR4(a5,a6,a7,a8))) !8ゲートNOR回路 !フリップフロップ回路 DIM FFQn(50),FFclk(50) !状態、エッジ検出 ※50個分 !※非同期型 SUB D_FF(id,D, Q,nQ) !ディレイ型 LET FFQn(id)=D !Qn+1=D LET Q=FFQn(id) !出力 LET nQ=NT(Q) END SUB !※同期型 SUB eD_FF(id,CLK,D, Q,nQ) !ディレイ型 IF FFclk(id)=0 AND CLK=1 THEN CALL D_FF(id,D, Q,nQ) ELSE LET Q=FFQn(id) !出力 LET nQ=NT(Q) END IF LET FFclk(id)=CLK !次へ END SUB !定数 LET TRUE=1 LET FALSE=0 LET Vcc=1 !VDD LET GND=0 SET WINDOW -4,4,-4,4 LET CLK=0 !システムクロック FOR t=0 TO 32 LET D1=NOR8(Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q7) !※Q8はショート LET D2=Q1 LET D3=Q2 LET D4=Q3 LET D5=Q4 LET D6=Q5 LET D7=Q6 LET D8=Q7 CALL eD_FF(21,CLK,D1, Q1,nQ1) !8回路リングカウンタ CALL eD_FF(22,CLK,D2, Q2,nQ2) CALL eD_FF(23,CLK,D3, Q3,nQ3) CALL eD_FF(24,CLK,D4, Q4,nQ4) CALL eD_FF(25,CLK,D5, Q5,nQ5) CALL eD_FF(26,CLK,D6, Q6,nQ6) CALL eD_FF(27,CLK,D7, Q7,nQ7) CALL eD_FF(28,CLK,D8, Q8,nQ8) PRINT USING "T=## ":t; !タイムチャート PRINT CLK, Q1;Q2;Q3;Q4;Q5;Q6;Q7;Q8 CLEAR !発光ダイオードを使って光で表す DRAW LED(Q1) WITH SHIFT(0,3)*ROTATE(2*PI*1/8) !電子部品(配置と配線) DRAW LED(Q2) WITH SHIFT(0,3)*ROTATE(2*PI*2/8) DRAW LED(Q3) WITH SHIFT(0,3)*ROTATE(2*PI*3/8) DRAW LED(Q4) WITH SHIFT(0,3)*ROTATE(2*PI*4/8) DRAW LED(Q5) WITH SHIFT(0,3)*ROTATE(2*PI*5/8) DRAW LED(Q6) WITH SHIFT(0,3)*ROTATE(2*PI*6/8) DRAW LED(Q7) WITH SHIFT(0,3)*ROTATE(2*PI*7/8) DRAW LED(Q8) WITH SHIFT(0,3)*ROTATE(2*PI*8/8) WAIT DELAY 0.5 LET CLK=NT(CLK) NEXT t !電子部品(下位) PICTURE LED(a) !発光ダイオードを表示する IF a=1 THEN DRAW disk WITH SCALE(0.4) !点灯 ELSE DRAW circle WITH SCALE(0.4) !消灯 END IF END PICTURE END |
│ │└!N進カウンタをつくる 山中和義 2007/07/19 11:25:08 ツリーへ
Re: !8回路リングカウンタをつくる |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/19 11:25:08 | |
!N進カウンタをつくる
: 順序回路のサブルーチン(省略) : : SET WINDOW -3,3,-3,3 LET CLK=0 !システムクロック FOR t=0 TO 32 LET D1=nQ1 !4ビット16進カウンタ LET D2=OR(AND(nQ2,Q1),AND(Q2,nQ1)) LET D3=OR3(AND(Q3,nQ2),AND(Q3,nQ1),AND3(nQ3,Q2,Q1)) LET D4=OR4(AND(Q4,nQ3),AND(Q4,nQ2),AND(Q4,nQ1),AND4(nQ4,Q3,Q2,Q1)) CALL eD_FF(11,CLK,D1, Q1,nQ1) CALL eD_FF(12,CLK,D2, Q2,nQ2) CALL eD_FF(13,CLK,D3, Q3,nQ3) CALL eD_FF(14,CLK,D4, Q4,nQ4) PRINT USING "T=## ":t; !タイムチャート PRINT CLK, Q1;Q2;Q3;Q4;Q5;Q6;Q7;Q8 CALL DECODE7segment16(Q4,Q3,Q2,Q1, Za,Zb,Zc,Zd,Ze,Zf,Zg,dp) !復号化する CLEAR DRAW LED7segment(Za,Zb,Zc,Zd,Ze,Zf,Zg,dp) !発光ダイオードを光らせる WAIT DELAY 0.5 LET CLK=NT(CLK) NEXT t !電子部品(配置と配線) SUB DECODE7segment16(A,B,C,D, Za,Zb,Zc,Zd,Ze,Zf,Zg,dp) !4ビット入力16進数表示回路 LET tmp=((A*2+B)*2+C)*2+D !2進を10進に変換する IF tmp=0 THEN LET ptn$="0000001" IF tmp=1 THEN LET ptn$="1001111" IF tmp=2 THEN LET ptn$="0010010" IF tmp=3 THEN LET ptn$="0000110" IF tmp=4 THEN LET ptn$="1001100" IF tmp=5 THEN LET ptn$="0100100" IF tmp=6 THEN LET ptn$="0100000" IF tmp=7 THEN LET ptn$="0001101" IF tmp=8 THEN LET ptn$="0000000" IF tmp=9 THEN LET ptn$="0000100" IF tmp=10 THEN LET ptn$="0001000" !A IF tmp=11 THEN LET ptn$="1100000" !b IF tmp=12 THEN LET ptn$="1110010" !c IF tmp=13 THEN LET ptn$="1000010" !d IF tmp=14 THEN LET ptn$="0010000" !e IF tmp=15 THEN LET ptn$="0111000" !F LET Za=VAL(mid$(ptn$,1,1)) LET Zb=VAL(mid$(ptn$,2,1)) LET Zc=VAL(mid$(ptn$,3,1)) LET Zd=VAL(mid$(ptn$,4,1)) LET Ze=VAL(mid$(ptn$,5,1)) LET Zf=VAL(mid$(ptn$,6,1)) LET Zg=VAL(mid$(ptn$,7,1)) LET dp=GND END SUB ! --a- 配置位置 ! f| |b ! --g- ! e| |c ! --d- dp PICTURE LED7segment(a,b,c,d,e,f,g,dp) !7セグメント数字表示器 ※アノード・コモン DRAW bar(NT(a)) WITH SHIFT(0,2) DRAW bar(NT(b)) WITH ROTATE(PI/2)*SHIFT(1,1) DRAW bar(NT(c)) WITH ROTATE(PI/2)*SHIFT(1,-1) DRAW bar(NT(d)) WITH SHIFT(0,-2) DRAW bar(NT(e)) WITH ROTATE(PI/2)*SHIFT(-1,-1) DRAW bar(NT(f)) WITH ROTATE(PI/2)*SHIFT(-1,1) DRAW bar(NT(g)) WITH SHIFT(0,0) DRAW LED(NT(dp)) WITH SHIFT(2,-2) END PICTURE !電子部品(下位) PICTURE bar(a) ! !発光ダイオードを表示する IF a=1 THEN PLOT AREA: -1,-0.2; 1,-0.2; 1,0.2; -1,0.2 !点灯 ELSE PLOT LINES: -1,-0.2; 1,-0.2; 1,0.2; -1,0.2; -1,-0.2 !消灯 END IF END PICTURE PICTURE LED(a) !発光ダイオードを表示する IF a=1 THEN DRAW disk WITH SCALE(0.4) !点灯 ELSE DRAW circle WITH SCALE(0.4) !消灯 END IF END PICTURE END |
│ │ └つづき(カウンタ部分の差し替え) 山中和義 2007/07/19 11:29:13 (修正1回) ツリーへ
Re: !N進カウンタをつくる |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/19 11:29:13 ** この記事は1回修正されてます | |
つづき(カウンタ部分の差し替え)
いくつか紹介します。 ●JK-FFによる LET JK1=Vcc !4ビット16進カウンタ LET JK2=Q1 LET JK3=AND(Q2,Q1) LET JK4=AND3(Q3,Q2,Q1) !JK4=AND(Q3,JK3) CALL eJK_FF(11,CLK,JK1,JK1, Q1,nQ1) CALL eJK_FF(12,CLK,JK2,JK2, Q2,nQ2) CALL eJK_FF(13,CLK,JK3,JK3, Q3,nQ3) CALL eJK_FF(14,CLK,JK4,JK4, Q4,nQ4) LET J1=OR(nQ3,nQ2) !6進カウンタ LET K1=Vcc LET J2=AND(nQ3,Q1) LET K2=OR(Q3,Q1) LET J3=AND(Q2,Q1) LET K3=OR(Q2,Q1) CALL eJK_FF(11,CLK,J1,K1, Q1,nQ1) CALL eJK_FF(12,CLK,J2,K2, Q2,nQ2) CALL eJK_FF(13,CLK,J3,K3, Q3,nQ3) LET J1=Vcc !6進カウンタ LET K1=Vcc LET J2=AND(nQ3,Q1) LET K2=Q1 LET J3=AND(Q2,Q1) LET K3=Q1 CALL eJK_FF(11,CLK,J1,K1, Q1,nQ1) CALL eJK_FF(12,CLK,J2,K2, Q2,nQ2) CALL eJK_FF(13,CLK,J3,K3, Q3,nQ3) ●D-FFによる LET D=nQ1 !1ビット2進カウンタ ※分周回路 CALL eD_FF(1,CLK,D, Q1,nQ1) LET D1=nQ1 !10進カウンタ LET D2=OR(AND(Q2,nQ1),AND3(nQ4,nQ2,Q1)) LET D3=OR3(AND(Q3,nQ2),AND(Q3,nQ1),AND3(nQ3,Q2,Q1)) LET D4=OR(AND3(Q3,Q2,Q1),AND(Q4,nQ1)) CALL eD_FF(16,CLK,D1, Q1,nQ1) CALL eD_FF(17,CLK,D2, Q2,nQ2) CALL eD_FF(18,CLK,D3, Q3,nQ3) CALL eD_FF(19,CLK,D4, Q4,nQ4) LET D1=nQ1 !6進カウンタ LET D2=OR(AND3(nQ3,nQ2,Q1),AND(Q2,nQ1)) LET D3=OR(AND(Q3,nQ1),AND(Q2,Q1)) CALL eD_FF(16,CLK,D1, Q1,nQ1) CALL eD_FF(17,CLK,D2, Q2,nQ2) CALL eD_FF(18,CLK,D3, Q3,nQ3) LET D1=AND(nQ2,nQ1) !3進カウンタ LET D2=Q1 CALL eD_FF(16,CLK,D1, Q1,nQ1) CALL eD_FF(17,CLK,D2, Q2,nQ2) ●応用 !60進カウンタ(10進×6進) LET D1=nQ1 !10進カウンタ LET D2=OR(AND(Q2,nQ1),AND3(nQ4,nQ2,Q1)) LET D3=OR3(AND(Q3,nQ2),AND(Q3,nQ1),AND3(nQ3,Q2,Q1)) LET D4=OR(AND3(Q3,Q2,Q1),AND(Q4,nQ1)) LET D5=AND(Q4,Q1) !※1001(=9)でキャリアアップ CALL eD_FF(11,CLK,D1, Q1,nQ1) CALL eD_FF(12,CLK,D2, Q2,nQ2) CALL eD_FF(13,CLK,D3, Q3,nQ3) CALL eD_FF(14,CLK,D4, Q4,nQ4) CALL eD_FF(15,CLK,D5, Q5,nQ5) !※10回ごとに1クロック LET D6=nQ6 !6進カウンタ LET D7=OR(AND3(nQ8,nQ7,Q6),AND(Q7,nQ6)) LET D8=OR(AND(Q8,nQ6),AND(Q7,Q6)) CALL eD_FF(16,Q5,D6, Q6,nQ6) !※CLK=Q5 CALL eD_FF(17,Q5,D7, Q7,nQ7) CALL eD_FF(18,Q5,D8, Q8,nQ8) |
│ └RS-FFは回路図で記述して、RS-FFを用いてJK... 山中和義 2007/07/31 14:23:38 (修正1回) ツリーへ
Re: !順序回路 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/07/31 14:23:38 ** この記事は1回修正されてます | |
RS-FFは回路図で記述して、RS-FFを用いてJK-FF,T-FF,D-FFを記述する
NAND回路による回路図は、 S’──────| ̄ ̄\ | |○ ───┬──── Q ┌─|__/ | | | | | └────────┐ | | |Qn ┌────────|─┘ | | └─| ̄ ̄\ | | |○ ─┴────── Q' R’──────|__/ となるので、入力SとR、そして現在の状態Qnで(上半分の論理回路に着目) LET Q=NAND(NT(S),NAND(NT(R),Qn)) !Qn+1=(S'・(R'・Qn)')' LET nQ=NT(Q) と記述する。 !基本論理回路 DEF AND(x,y)=MIN(x,y) !AND回路 DEF OR(x,y)=MAX(x,y) !OR回路 DEF NT(x)=1-x !NOT回路 DEF NAND(x,y)=NT(AND(x,y)) !NAND回路 DEF NOR(x,y)=NT(OR(x,y)) !NOR回路 !※非同期型 DIM FFQn(50),FFclk(50) !状態、エッジ検出 ※50個分 SUB RS_FF(id,R,S, Q,nQ) !リセット・セット型 LET Qn=FFQn(id) LET Q=NAND(NT(S),NAND(NT(R),Qn)) !Qn+1=(S'・(R'・Qn)')' LET nQ=NT(Q) !LET Q=OR(S,AND(NT(R),Qn)) !等価回路 !LET nQ=NT(Q) !!!LET nQ=NOR(S,NOR(R,NT(Qn))) !(Qn+1)'=(S+(R+Qn')')' !!!LET Q=NT(nQ) LET FFQn(id)=Q !状態を記憶する END SUB SUB JK_FF(id,J,K, Q,nQ) !JK型 LET Qn=FFQn(id) !フィードバック部分 LET fb1=AND(K,Qn) LET fb2=AND(J,NT(Qn)) CALL RS_FF(id,fb1,fb2, Q,nQ) END SUB SUB T_FF(id,T, Q,nQ) !トグル型 ※J=T,K=TのJK-FF CALL JK_FF(id,T,T, Q,nQ) !!!LET Qn=FFQn(id) !等価回路 !!!LET Q=OR(AND(T,NT(Qn)),AND(NT(T),Qn)) END SUB SUB D_FF(id,D, Q,nQ) !ディレイ型 CALL RS_FF(id,NT(D),D, Q,nQ) END SUB FOR S=0 TO 1 !入力 FOR R=0 TO 1 FOR Qn=0 TO 1 !現在の状態 LET FFQn(5)=Qn CALL RS_FF(5,R,S, Q,nQ) PRINT S;R;Qn, Q;nQ !展開特性表 NEXT Qn NEXT R NEXT S FOR J=0 TO 1 !入力 FOR K=0 TO 1 FOR Qn=0 TO 1 !現在の状態 LET FFQn(5)=Qn CALL JK_FF(5,J,K, Q,nQ) PRINT J;K;Qn, Q;nQ !展開特性表 NEXT Qn NEXT K NEXT J FOR T=0 TO 1 !入力 FOR Qn=0 TO 1 !現在の状態 LET FFQn(5)=Qn CALL T_FF(5,T, Q,nQ) PRINT T;Qn, Q;nQ !展開特性表 NEXT Qn NEXT T FOR D=0 TO 1 !入力 FOR Qn=0 TO 1 !現在の状態 LET FFQn(5)=Qn CALL D_FF(5,D, Q,nQ) PRINT D;Qn, Q;nQ !展開特性表 NEXT Qn NEXT D END |
└!演算論理装置ALU(ArithmeticLogicUnit) 山中和義 2007/08/07 22:10:30 ツリーへ
Re: 論理回路とブール代数 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/08/07 22:10:30 | |
!演算論理装置ALU(Arithmetic Logic Unit)
!・整数演算 (加算、減算、乗算) !・論理演算 (AND、OR、NOT、XOR) !・シフト演算 LET n=4 !符号付nビット ※-2^(n-1)〜2^(n-1)-1 !基本論理回路 DEF AND(x,y)=MIN(x,y) !AND回路 DEF OR(x,y)=MAX(x,y) !OR回路 DEF NT(x)=1-x !NOT回路 !ゲート数(入力)を拡張する DEF AND4(a,b,c,d)=AND(AND(a,b),AND(c,d)) DEF OR3(a,b,c)=OR(OR(a,b),c) !演算回路 SUB HALF_ADDER(a,b, s,c) !半加算器(HA) LET c=AND(a,b) !桁上がり LET s=AND(OR(a,b),NT(c)) !和 END SUB SUB FULL_ADDER(a,b,ci, s,co) !全加算器(FA) CALL HALF_ADDER(a,b, S0,C0) CALL HALF_ADDER(S0,ci, s,C1) !和 LET co=OR(C0,C1) !桁上がり END SUB ! │\ ! A ┤ \ ALU ! B ┤ \ ! │ ├ C ! \ │ ! / │ ! │ ├ CF,SF,ZF ! │ / ! op ┤ / ! │/ ! !算術論理演算回路(Arithmetic Logic Unit; ALU) ! S4 S3 S2 S1 op 演算 ! --+--+--+--+-------- ! 0 0 0 0 A そのまま ! 0 0 0 1 A+1 increment ! 0 0 1 0 A+B 加算 ! 0 0 1 1 A+B+1 ! 0 1 0 0 A-B-1 ! 0 1 0 1 A-B 減算 ! 0 1 1 0 A-1 decrement ! 0 1 1 1 A そのまま ! 1 0 0 0 論理和(OR) ! 1 0 1 0 排他的論理和(EXOR) ! 1 1 0 0 論理積(AND) ! 1 1 1 0 否定(NOT) SUB ALU(n,a(),b(), S4,S3,S2,S1, c(),CF,SF,ZF) !nビットALU LET ci=S1 FOR i=n TO 1 STEP -1 !下の桁より ※MSB=1 LET aa=OR3(a(i),AND4(S4,NT(S3),NT(S2),b(i)),AND4(S4,S3,NT(S2),NT(b(i)))) LET bb=OR(AND(S2,b(i)),AND(S3,NT(b(i)))) LET cc=AND(NT(S4),ci) CALL FULL_ADDER(aa,bb,cc, s,co) LET c(i)=s LET ci=co NEXT i LET CF=co !キャリーフラグ LET SF=0 !サインフラグ IF S4=0 THEN LET SF=c(1) !算術演算なら LET ZF=c(1) !ゼロフラグ FOR i=2 TO n LET ZF=OR(ZF,c(i)) NEXT i LET ZF=NT(ZF) END SUB !補助ルーチン SUB ToBinaryS(x,n, a()) !符号付2進数へ ※-2^(n-1)〜2^(n-1)-1 IF x<0 THEN CALL ToBinary(x+2^n,n, a) ELSE CALL ToBinary(x,n, a) END SUB SUB ToBinary(x,n, a()) !2進数へ ※0〜2^n-1 FOR i=1 TO n LET a(i)=VAL(mid$(right$(REPEAT$("0",n-1)&BSTR$(x,2),n),i,1)) NEXT i END SUB FUNCTION ToDecimalS(a(),n) !符号付10進数へ LET z=ToDecimal(a,n) IF a(1)=1 THEN LET z=z-2^n LET ToDecimalS=z END FUNCTION FUNCTION ToDecimal(a(),n) !10進数へ LET c=a(1) FOR i=2 TO n LET c=c*2+a(i) !a(1)*2^n+a(2)*2^(n-1)+ … +a(n-1)*2+a(n) NEXT i LET ToDecimal=c END FUNCTION SUB PrintOut(n,a()) !2進数を表示する FOR i=1 TO n PRINT a(i); NEXT i PRINT ,ToDecimalS(a,n) END SUB |
└続き 山中和義 2007/08/07 22:12:35 ツリーへ
Re: !演算論理装置ALU(ArithmeticLogicUnit) |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/08/07 22:12:35 | |
続き
!動作を確認する DIM a(n),b(n),f(n) LET S4=0 !オペレーションコード(演算の選択) LET S3=0 LET S2=1 LET S1=0 LET x=-2 !オペランド CALL ToBinaryS(x,n, a) CALL PrintOut(n,a) LET y=-3 CALL ToBinaryS(y,n, b) CALL PrintOut(n,b) CALL ALU(n,a,b, S4,S3,S2,S1, f,CF,SF,ZF) CALL PrintOut(n,f) !結果 PRINT ,CF;SF;ZF !フラグ END ※このサンプルは、乗算、シフトはありません。 |