新しく発言する EXIT インデックスへ
論理回路とブール代数

  論理回路とブール代数 山中和義 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
PRINT


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
PRINT

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
PRINT


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
PRINT


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
PRINT


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
PRINT


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



※このサンプルは、乗算、シフトはありません。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。