集積電子回路設計
Part 3:デジタル回路
千葉大学工学部電気電子工学科
橋本研也
論理回路
Y=AB=A+B Y=A+B=AB Y Y A B Y Y=A+B=A+B A B Y L L H L L L L H H H L H A B Y L L H L L H L H H H H H A B Y L L H L L H L H H H H L A B A B Y A B Y A B Y A Bデジタル素子もアナログ素子
しきい値
過渡応答によ
る波形の乱れ
負荷を多くすると ⇒ パルス遅延の増加
遅延を規定以
下にする最大
の素子数 =
ファンアウト
遅延の増大+
パルス幅の減少
高速デジタル回路 ⇒ 分布定数回路
しきい値パルスの遅延
伝送線路によ
る信号遅延
パルスの反射は?
反射があると。。。
反射による波
形の乱れ
A sel 0 1 A B sel 0 1 2 3 sel A 0 1 H x H H L L L H L L L H _ _ A B 0 1 x x H H L L H L L H H L _ _ sel H L L 2 3 H H H H H H _ _ L H H H H H H H L L L H H L
セレクタ
A B Y L x H x L H sel L L x L x H L H H H
デュプレクサ
A B Rp Y Y A B sel sel 3ステートバッファによる実現 (多くの多重化容易)入出力回路
SW1 Rp Y A RB RC 通常の論理ICはGNDへの 電流流出により“L”を判定 +5V C LED BE LEDR
V
V
I
5
VLED: LEDの順方向電圧降下 RB(<VBE /ILED) : ベース電流の制限 マイクロ コンピュータ 無接続の入力は “H”と判 定Ra Rb eout ein
シュミットトリガ回路
b a in b out a t b a in b out a t outR
R
e
R
e
R
V
V
R
R
e
R
e
R
V
V
e
V+:”H”出力、 V-:”L”出力e
oute
in シュミットトリガの入出力特性 V+ Vs- Vs+V
s+=V
t/(1+R
b/R
a)-V
-R
b/R
aV
s-=V
t/(1+R
b/R
a)-V
+R
b/R
a V-C R eout Ra
マルチバイブレータ
0
V
+V
tV
-t
e
oute
c
V
c+V
c-ec 青曲線を表す式(T=CR) マルチバイブレータの波形)
/
exp(
)
(
V
V
t
T
V
V
o
V
o
V
t
(
V
V
)
T
T
V
V
V
V
T
o t2
.
2
3
log
2
)
/(
)
(
log
2
(Vt=(V++V-)/2の時)C R Ra ein eout t eout ein ecut ec
ワンショットマルチバイブレータ
Vt V -V+ V+ V -青曲線を表す式(T=CR))
/
exp(
)
(
V
V
t
T
V
V
(Vt=(V++V-)/2の時)
T
T
V
V
V
V
T
t69
.
0
2
log
)
/(
)
(
log
HDL(Hardware Description Language) verilogによる構造記述 A B S L L L H L H C L L H L H H H L L H
半加算器
S W0 A B W1 W2 C module halfadder(s, c, a, b); input a, b; output s, c; wire w0, w1, w2; assign w0 = a&b, w1 = ~w0, w2 = a|b, s = w1 & w2, c = w0; endmodule 入出力,ワ イヤの定義 相互接続の 定義 否定 論理積 論理積 論理和B Ci S L L L H L H Co L L H L H H H L L H
全加算器
W0 A B W1 Smodule fulladder(s, co, a, b, ci); input a, b, ci; output s, co; wire w0, w1, w2; halfadder I0 (.s(w0), .c(w1), .a(a), .b(b)); halfadder I1 (.s(s), .c(w2), .a(w0), .b(ci)); assign co = w1 | w2; endmodule HDL(Hardware Description Language) verilogによる構造記述 入出力,ワ イヤの定義 下位モ ジュール の相互接 続の定義 Ci 半加算器I0 半加算器I1 Co A L L L L L L L H H L L H H L H H L H H H H H H H W2
4bit
加算器
Ci A0
module adder4(s, co, a, b, ci); input [3:0] a, b; input ci; output [3:0] s; output co; wire w0, w1, w2; fulladder I0 (.co(w0), .s (s[0]), .a(a[0]), .b(b[0]), .ci(ci)); fulladder I1 (.co(w1), .s (s[1]), .a(a[1]), .b(b[1]), .ci(w0)); fulladder I2 (.co(w2), .s (s[2]), .a(a[2]), .b(b[2]), .ci(w1)); fulladder I3 (.co(co), .s (s[3]), .a(a[3]), .b(b[3]), .ci(w2)); endmodule 4bitデータ バスの定義 全加算器I0 B0 A1 全加算器I1 B1 W1 W0 A2 全加算器I2 B2 A3 全加算器I3 B3 W2 S0 S1 S2 S3 Co 下位モ ジュール の相互接 続の定義 ワイヤの定義
begin
a = 4'b0001; b = 4'b0001; ci = 1'b0;
$monitor("%t %b %b %b",$time,s,a,b,co); for (count=0; count<=7; count=count+1) begin #10 b = a; a = s; end $finish; end
adder4 inst0 (s,co,a,b,ci); endmodule
動作試験のためのモジュール(結果を次々加算)
時間10お休み module testadder4; reg [3:0] a, b; reg [7:0]count; reg ci; wire [3:0] s; wire co; initial 2進数の代入 結果の 出力 7回反復 終わり 最初にする仕事 は以下の通り 始めはこのモ ジュールから データを収 納するメモ リに定義VeriLogger Proによる
シミュレーション結果
(桁あふれに注意)
4bit
加算器
Ci
A0 module adder4(s, co, a, b, ci);
input [3,0] a, b; input ci; output [3,0] s; output s, co; reg [3:0] s; reg co;
always (a or b or ci) begin [co,s] = a + b + ci; end endmodule 全加算器I0 B0 A1 全加算器I1 B1 W1 W0 A2 全加算器I2 B2 A3 全加算器I3 B3 W2 S0 S1 S2 S3 Co HDL(Hardware Description Language) verilogによる動作記述 動作を保管するレジス タの定義 a,b,ciが変化 した時は常に
記述は簡単だが、
最適な
hardwareが
組み上がるか不明
SR(Set-Reset)
フリップフロップ
S R Q Q H H L L H L L H H L L H L L H L L H _ HH→LLの遷移の結果 は? Q Q _ S R Q Q S R _ _ 早い者勝ち!=実装や素子によって不定 _SW1 SW2 SW1 SW2 t Q S R Q Q _ _ _ Rp SW R S Q Q _ _ _ Rp Rp スイッチのばたつき (チャタリング) t Q S R _ _ スイッチのばたつき (チャタリング) Rp
Q _ Q clk S R
クロック付き
SR
フリップフロップ
クロック“H”の時に出力変化 R S R S Q Q Q Q _ _ clk clk clk S R Q Q _ クロックが“H”から“L”に変化し た時のデータを保持 クロックが“H”から“L”に変化し た時のデータを保持 それ以外では出力変化せず マスタ・スレーブ型Q _ Q clk K J Q _ Q clk K J pre clr J(S) K(R) Qn Qn H H H L L H H L L H L L _ Qn-1 Q_n-1 Q_n-1 Qn-1
JK
フリップフロップ
preset(set):クロックに関わ らず強制的にQ=H clear(reset):クロックに関わ らず強制的にQ= L Qn-1 :1クロック前の出力ラッチ
(D
フリップフロップ
)
J K Q Q _ pre clr D clk RB RC t Q D clk 0 0 1 11 0 11 1 00 0 11 0 00 1 0 00 0 11次のクロック入力まで
データ保持=メモリ
D Q Q _ pre clrSerial-Parallel変換(シフトレジスタ)
J K Q Q_ pre clr J K Q Q_ pre clr J K Q Q_ pre clr clk clr D Q1 Q2 Q3 t Q1 Q2 Q3 D clk 0 0 0 0 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0クロック入力から出力
変化までに遅延有り
Parallel-Serial変換
(シフトレジスタ)
J K Q Q _ pre J K Q Q _ pre clr J K Q Q _ pre clk clr clr D1 ld Sin S out D2 D3J K Q Q _ pre clr J K Q Q _ pre clr J K Q Q _ pre clr Q0 clr clk Q1 Q2
2進数(Binary)カウンタ
t Q1 Q2 Q0 clk 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 1J K Q Q _ J K Q Q _ J K Q Q _ clk J K Q Q _ Q0 ' Q1 Q2 Q3 Q2
二進化十進数(Binary-Coded Decimal)カウンタ
t clk Q0 Q1 Q2 Q2 Q3 ' 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0Q4 BCDカウンタ Q4 BCDカウンタ Q4 BCDカウンタ Q1Q2Q3 Q1Q2Q3 Q1Q2Q3 液晶ディスプレイ CLR CLR CLR Set Reset Q (gate)
ストップウォッチの回路構成
基準クロック •クリアパルスの入力で、カウンタをクリア •セットパルスの入力から、計測開始 •リセットパルスの入力で、計測終了 ① ② ③C
2e
outC
1クロック用発振回路
音叉型水晶振動子e
oute
in インバータの入出力特性 反転増幅器と等価!2
15=32,768Hz を2
15分周すれば
1Hz!
高安定プログラマブル発振器
(
v=M
s/N)
VCO
s vAmp
e
d位相検波器
LPF
N分周器
M分周器
Phase-Locked Loop (PLL)
• 高安定発振源
sによる制御 ⇒ 高精度、高安定
• 分周器をプログラム可能 ⇒ 可変
S水晶発振器による発生
DCモータ+回転検出センサ
高精度モータ
ミキサ
(排他的論理和)とLPFの役割(位相検出)
t
A B
A
B
LPF
通過後
閉ループ利得大で、負帰還がか
かっている時、差動入力は零
PLLロック時AとB
は
90度の位相差
+t Q(gate) LD S clk CLR Q4
周波数カウンタを作ってみよう
基準クロック 計測開始 計測終了 データラッチ カウンタクリア 計測区間 •計測区間内のパルス数をカウント •計測後、結果をラッチに保存 •カウンタをクリアQ4 BCDカウンタ Q4 Q4 Q4 BCDカウンタ Q4 Q4 Q1Q2Q3 Q1Q2Q3 Q1Q2Q3 Q4 Q1Q2Q3 Q4 Q1Q2Q3 Q4 Q1Q2Q3D4 D1D2D3 D1D2D3D4 D1D2D3D4 液晶ディスプレイ LD LD LD BCDカウンタ BCDカウンタ
reset reset reset
BCDカウンタ BCDカウンタ
reset reset reset
LD reset CLK CLK set D Q Q (gate) set D Q
周波数カウンタの回路構成
基準クロック resetmodule jkflipflop(out,outbar,j,k,clk,res); output out,outbar;
input j,k,clk,res; reg q;
always @(negedge clk or negedge res) begin if(!res) begin q <= 0; end else
HDL(Hardware Description Language)による論理回路設計
JKフリップフロップの Verilog-HDLによる記述 入出力線,内部 レジスタの定義 clkの立ち下がりもしくは resの立ち下がりの時 低レベル機能の モジュール化 q=0の代入(リセット動作) resが偽(0)の時 その他の時
if(j==1) if(k==1) begin q <= ~q; end else begin q <= 1; end else if(k==1) begin q<= 0; end end assign out=q; assign outbar=~q; endmodule 出力信号の定義(常時接続) J=K=1の時、qの反転 J=1でK=0の時、q=1 J=0でK=1の時、q=0 always構文の終了 もしj=1ならば もしk=1ならば もしk=1ならば
module bcdcounter(out,clk,res); output [3:0] out; input clk,res; wire q3,qbar0,qbar1,qbar2,qbar3,a; assign a=1; jkflipflop I0 (.out(out[0]),.outbar(qbar0),.j(a),.k(a),.clk(clk),.res(res)); jkflipflop I1 (.out(out[1]),.outbar(qbar1),.j(qbar3),.k(a),.clk(out[0]),.res(res)); jkflipflop I2 (.out(out[2]),.outbar(qbar2),.j(a),.k(a),.clk(out[1]),.res(res)); jkflipflop I3 (.out(q3),.outbar(qbar3),.j(out[2]),.k(qbar2),.clk(out[0]),.res(res)); assign out[3]=qbar2&q3; endmodule モジュールを組み合わせ て高機能のモジュール化 BCDフリップフロップの Verilog-HDLによる記述 相互接続線の定義 a=1(常時接続) qbar2とq3の&をoutと定義(常時接続) モジュー ル間の相 互接続の 定義 論理積
module bcdtest; wire [3:0] out; reg set,clk,res; initial begin $monitor("%t %b %b %b",$time,clk,res,out); clk <=0; res <=0; #40 res <=1; #350 $finish; end always #10 begin clk<= ~clk; end
bcdcounter inst0 (out,clk,res); endmodule 試行用信号源の Verilog-HDLによる記述 初期動作の定義 これ終わり 出力データとその出力 形式の定義 clkの否定(clkの作成) 時間40休止 時間350休止 時間10毎の動作 2進数で表示
VeriLogger Pro Student Versionによるシミュレーション結果
アナログモデルでの シミュレーション(信号 の遅延、鈍り等考慮) Field Programmable
Logic Array (FPGA) によるハードウェア化 カスタムLSIによ るハードウェア化 駄目な場合 FPGAやカスタム LSIへの実装 Intellectual Property (IP)としての権利化・ 販売(例: CPUコア)
t trig clk Q1 Q3 Q2 out Q0
トリガ入力後、クロックに同期した
パルスを4個出力するためには?
パルスを4 個数える 最後のパルス リセット信号 この区間だけ出力 入力トリガ 入力クロック 出力信号トリガ入力後、クロックに同期した
パルスを4個出力する回路
動くかどうかはシミュレータで実証!
思いもかけない入力もありえる
J K Q Q_ J K Q Q_ trig OUT J K Q Q_ CLR clk Q1 Q2 Q3 R Q 0 CLR CLR実は後述の
verilog-HDLで最初に設計し、
後に
Hardware化
module rsflipflop(out,outbar,set,res); output out,outbar;
input set,res; reg q;
always @(posedge set or posedge res) begin if(set=1) begin q <= 1; end else begin q <= 0; end end assign out=q; assign outbar=~q; endmodule
HDL(Hardware Description Language)による論理回路設計
RSフリップフロップの Verilog-HDLによる記述 入出力線,内部 レジスタの定義 動作の定義 set=1の時q=1 set=0の時q=0 setの立ち上がりもしくはresの 立ち上がりの時 出力信号の定義
module pulse4out(out,clk,trig,res); output out; input clk,res,trig; wire [3:0] q,qbar; wire clk2,a; assign a=1,clk2=res&~q[3]; rsflipflop I0 (.out(q[0]),.outbar(qbar[0]),.set(trig),.res(~clk2)); jkflipflop I1 (.out(q[1]),.outbar(qbar[1]),.j(q[0]),.k(a),.clk(clk),.res(clk2)); jkflipflop I2 (.out(q[2]),.outbar(qbar[2]),.j(q[0]),.k(a),.clk(q[1]),.res(clk2)); jkflipflop I3 (.out(q[3]),.outbar(qbar[3]),.j(q[0]),.k(a),.clk(q[2]),.res(clk2)); assign out=q[0]&clk; endmodule フリップフ ロップ間の 相互接続 resとq[3]の否定の&をclk2と定義 q[0]とclkの&をoutと定義 入出力線,相互 接続線の定義 低レベル機能を利用した高 次機能モジュールの実現 複雑機能のモジュール化 4bitデータ
module pulse4; wire out; reg clk,res,trig; initial begin $monitor("%t %b %b %b",$time,clk,trig,out); clk <=0; res <=0; trig <=0; #40 res <=1; #25 trig <=1; #5 trig <=0; #100 trig <=1; #5 trig <=0; #100 $finish; end always #10 begin clk<= ~clk; end
pulse4out inst0 (out,clk,trig,res); endmodule
試行用信号源のVerilog-HDLによる記述
VeriLogger Pro Student Versionによるシミュレー ション結果
OrCAD PSPICE A/D SVによるシ ミュレーション結果 Reset:FFの初期値 設定(これが無いと シミュレータが怒る) Clk Trig Trigのタイミングによっ てパルス数が変化!
機械同士でデータを交換する
(非同期通信)
data Ready Strobe Strobe t data Ready ホスト 周辺機器 •周辺機器が準備できるまで待機 •データ出力(データからだけでは データが出ているか否か判定不能) •ストローブ信号を出力 Nビット分のデー タ(Data Bus構造)Read/Write data CLK enable Read/Write address t clk data enable •クロックもしくはセレクト信号に 同期したデータ出力 •読み書き動作 •アドレス設定 CPU メモリ address
(同期通信)
Read/Write
バス構造
CPU
アドレ スバス
Memory1 Memory2 Memory3
データ バス コントロー ルバス enable 同一配線を選択されたもの同士が利用 必要に応じてユニットを追加・削減可能
Y C A Y C A
3
ステートバッファ
C A Y H H H H L L x L high-Z C=“H”の時 C=“L”の時双方向性バッファ
high-Z :無接続と同等Rp Y A
オープンコレクタ
シュミットトリガ 人間を相手にする以上間違いを考慮した設計(Fail Safe) •配線切断(もしくは無接続)の状態ではどうなるか? •GNDとの短絡ではどうなるか? •配線間の短絡ではどうなるか?#include <stdio.h>
int main(int argc, char **argv[]) {
int count, cmax; int sum = 0;
scanf("%d",&cmax);
for (count = 1; count <= cmax ; ++count){
sum = sum+count; (sum += count;と標記可)
printf("count = %d, sum = %d¥n", count, sum); } return (0); } 変数(整数)と初期値の定義
高級言語
Cによるプログラム例
1からcmaxま で順次加算 おまじない(利用する関数群の定義) cmaxの読み込み(10進数形式) このプログラム(関数)から スタート 終了するとき0を返す 変数cmaxの収納場所 countとsumの出 力(10進数形式) 行替えlcc-win32でcompileして実行した結果 入力
#include <stdio.h>
int bcdcount(int, int, int);
int main(int argc, char **argv[]) {
int count, countmax; int clock = 1, reset = 1;
for (count = 0; count <= 5 ; ++count){ clock = -clock;
out = bcdcount(clock,reset,in); in=out;
printf("time = %d, clock = %d, out = %d¥n", count, clock, out); }
reset = 0;
scanf("%d",&countmax);
for (count = 0; count <= countmax ; ++count){ clock = -clock;
out=bcdcount(clock,reset,in); in=out;
printf("time = %d, clk = %d, out = %d¥n", count, clock, out); } return (0); } 変数と初期値の定義
高級言語
CによるBCDカウンタの動作実現
時間5まで reset=1 countmaxまで reset=0 clkの否定(clkの作成) clkの否定(clkの作成) おまじない(利用する関数群の定義) countmaxの読み込み 使用する関数(moduleと等価
)の定義 ここからスタートint bcdcount(int clock, int reset, int in) {
int out;
if( reset == 1 ) { out = 0 ;} else {
if( clock == -1 ) {out = in +1 ;} else { out=in ; } } return out; } reset付BCDカウンタ
int updowncount(int clock, int reset, int a, int b, int in) {
int out;
if( reset == 1 ) { out = 0 ;} else { if( clock==-1) {
if( a == 1 & b==0) {out = in +1 ;} if( b == 1 & a==0) {out = in -1 ;} } else { out =in ; } } return out; } reset付updownカウンタ
lcc-win32で compileして実 行した結果
updown.c
デジタル
(Finite-Impulse-Response; FIR)フィルタ
a
0
e
in+
+
+
+
e
outa
1a
2a
3a
4
1 0)
(
)
(
N n in n outt
a
e
t
n
e
デジタルシグナルプロセッサ(DSP)による処理 : 1clk遅延
1 0)
(
N n n nz
a
z
H
ADC DSP DACe
ie
oz
-1a
+
e
ie
o離散系信号処理(その1)
}
)
1
{(
)
(
)
(
i i onT
e
nT
ae
n
T
e
1クロック遅延 = z
-1)
(
}
1
{
)
(
)
(
)
(
i 1 i 1 i oz
E
z
az
E
z
az
E
z
E
11
)
(
z
az
H
a
0z
-1e
i+
+
+
+
e
oa
1a
2a
3a
4Finite Impulse Response (FIR) フィルタ
1 0)
(
N n n nz
a
z
H
デジタルフィルタ=数値計算によるフィルタリング
位相直線性が可能、しかし多くの段数を必要
z
-1z
-1z
-1z
-1a
+
e
ie
o離散系信号処理(その2)
}
)
1
{(
)
(
)
(
i o onT
e
nT
ae
n
T
e
)
(
)
(
)
(
i 1 o oz
E
z
az
E
z
E
11
1
)
(
az
z
H
無限インパルス応答
(IIR)フィルタの一例
)
exp(
1
1
)
(
T
j
a
H
Infinite Impulse Response (IIR)
フィルタ
1 11
)
(
N n n nz
b
z
H
z
-1e
i+
+
+
+
e
o-b
1-b
2-b
3-b
4z
-1z
-1z
-1短い演算で急峻な周波数特性可能
ただし、線形位相実現せず
N n n n N n n nz
b
z
a
z
H
1 01
)
(
z
-1e
o-b
1-b
2-b
3-b
4z
-1z
-1z
-1a
0z
-1e
i+
+
+
+
a
1a
2a
3a
4デジタルフィルタの一般形
z
-1z
-1z
-1
1 0 i o{(
)
}
1
)
(
N nT
n
m
e
N
mT
e
平均値フィルタ
1 0(
11
)
1
1
)
(
N n N nz
N
z
z
N
z
H
)
2
/
sin(
)
2
/
sin(
}
2
/
)
1
(
exp{
)
(
T
N
T
N
T
N
j
H
線形位相:遅延が周波数に依存せず
有限インパルス応答
(FIR)フィルタの一例
-40
-35
-30
-25
-20
-15
-10
-5
0
-0.5 -0.4 -0.3 -0.2 -0.1 0 0.1 0.2 0.3 0.4 0.5
sinNx/Nx
sinNx/Nsinx
Relative frequency
Relative amplitude in dB
スペクトラムの
折り返しの影響
z=exp(j
T)であるから
)
2
/
(
)
2
/
sin(
}
2
/
)
1
(
exp{
)
2
/
sin(
)
2
/
sin(
}
2
/
)
1
(
exp{
1
)
exp(
1
)
exp(
)
(
T
N
T
N
T
N
j
N
T
N
T
N
T
N
j
N
T
j
T
jN
E
1
1
)
(
1
z
z
t
e
NZ
は?
パルス中心の
ずれ:
(N-1)T/2
単一パルスの
離散化版
連続関数と離散化関数で何故違う?
-120 -100 -80 -60 -40 -20 0 0 2 4 6 8 10 rectangular Hamming Blackmann Blackmann-Harris Relative frequency Amplitude in dB 0 0.2 0.4 0.6 0.8 1 -1-0.8-0.6-0.4-0.2 0 0.20.40.60.8 1 W eight Relative position Hamming Blackmann Blackmann-Harris ハミング関数w(t)=0.54+0.46cos(2t/T) ブラックマン関数:w(t)=0.42+0.5cos(2t/T) +0.08cos(4t/T) ブラックマン・ハリス関数:w(t)=0.35875+0.48829cos(2t/T) +0.14128cos(4t/T)+0.01168cos(6t/T)
窓関数
hd(t)を有限時間で打ち切るための関数:w(t) 帯域外抑圧と帯域幅はトレードオフ-70 -60 -50 -40 -30 -20 -10 0 0 0.5 1 1.5 2 -0.04 -0.03 -0.02 -0.010 0.01 0.02 0.03 0.04 0.05 Relative frequency T ransfer function in dB T ransfer function in dB -0.05
レメッツ交換法による設計結果
手法提案の論文に設 計プログラムが添付 ⇒ 世界中に普及 許容リップルと最も狭 い遷移帯域幅で必用 なタップ数を推定可能(Infinite-Impulse-Response; IIR)フィルタ
+
+
+
+
e
outa
0
e
inb
1b
2b
3b
4
N n out n in outt
a
e
t
b
e
t
n
e
1 0(
)
(
)
)
(
: 1clk遅延
N n n nz
b
a
z
H
1 01
)
(
・少ないタップで良好な遮断特性可能(ただし最少位相推移系) ・係数によっては発振(安定条件:全ての極が|Z|<1) ・FIRと組み合わせて、少ないタップで、位相特性、周波数特性 共に良好なフィルタ実現int average(int clock, int in) {
int position, count, temp, result; long int sum = 0;
temp=clock/TAP;
position=clock-temp*TAP+TAP; data[position]=in;
data[position-TAP]=in;
for (count = 0 ; count < TAP ; ++count) { sum += data[position-count]; } result = sum/TAP; return result; }
平均値フィルタの構成
タップの場合
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 こ の 範 囲 を加算 新データ 新データ 次々と下 に移動 下まで行ったら 一番上 32bit整数 切捨て演算 余りの算出 総和 タップ数での 割り算#include <stdio.h>
#define TAP 8 #define TMAX 20
int average(int, int);
int data[2*TAP];
int main(int argc, char **argv[]) {
int count, period, out; int in=0, clock=0;
for (period =1 ; period <=4 ; ++period) {
for (count = 1 ; count <= TMAX ; ++count) { ++clock;
in += 5;
out=average(clock,in);
printf("%d, %d, %d¥n", clock, in, out); } 以下省略 定数の定義 共用の変数を定義 clockを1ずつ増加 inを5ずつ増加 関数averageの実行 傾斜型 波形の 形成 4回繰り返し TMAX回繰り返し
TAP=4の結果 TAP=8の結果
TAP=16の結果 TAP=32の結果
計算結果を gnuplotで表示
Program counter
Data bus Address bus Register A Register B Register C Register D Stack pointer ALU Instruction register Interrupt unit B Instruction decoder control lines CPU Interrupt status register Read Write Interrupt unit A Reset Clock
CPU: Central Processing Unit ALU: Arithmetric Logical Unit Register
Address
1. LD A, 30H (16進数で30をレジスタAに代入) 2. DEC A (Aの内容を1つ減少) 3. JNZ 09H (演算結果が"0"で無い場合アドレス09Hにジャンプ) 4. LD 50H, B (レジスタBの内容をアドレス50Hに代入) 5. JMP 30H (アドレス30Hへジャンプ)