1

シフト・レジスタの基本とシリアル-パラレル変換技法

シリアルI/Oコントローラ
設計入門
山武 一朗

マイコン周辺機能としてもっとも一般的かつ汎用的なものとして，シリアル・コントローラがある．ここではもっとも簡単な仕様のシリアル・コントローラを実現するまでを，シフト・レジスタを使ったシリアル-パラレル変換回路で，具体的に順を追って詳しく解説する．
（編集部）

があります．そのため，1 度しか書き込みのできないデバイス

1

シリアル・コントローラ設計の前準備やフラッシュ・メモリ・ベースの CPLD/FPGA は，学習用としては適していません．何度でもダウンロードが可能な SRAM

● シリアル・コントローラ＝シフト・レジスタによる
シリアル-パラレル変換回路

ベースの FPGA を選択してください．
また，評価ボードとして必要な機能としては，シリアル・コ

シリアル・コントローラとは，複数のビットからなる一つのントローラの心臓部でもあるシフト・レジスタの動作を，目で情報（パラレルとして保持）を，1 本の信号線を使って相手に送見て理解できるようにするため，複数個の LED とプッシュ・信（シリアル伝送）したり，逆に 1 本の信号線で送られてきたボタンを装備した FPGA 評価ボードを用意してください．さら

データを，元の複数のビットからなる一つの情報に戻す処理をに時間経過をカウントするためにクロックも必要です．そしてする機能をもった，マイコン周辺機能としてはもっとも一般的

最終的に RS-232-C につないで通信するところまでをテストしたな汎用のコントローラです．

い場合には，RS-232-C ドライバ IC や D-Sub コネクタまでを装そのシリアル・コントローラの中身を一口で言えば，シフト・備した FPGA 評価ボードがよいでしょう．

レジスタによるシリアル-パラレル変換回路であるといえます．

複数個の LED やプッシュ・ボタン，クロック，そして RS-

ここでは簡単な仕様のシリアル・コントローラを，もっとも232-C が付いた FPGA 評価ボードは，もっとも一般的な仕様な基本的な機能を実装してその動作を確認し，少しずつ機能を追ので，さまざまな評価ボードの中から入手が容易で安価なもの

加していきながら，最後には RS-232-C にも使われている調歩を選択してください．

同期式シリアル通信に対応させるまでを，本章と次章にわたっ● 使用する FPGA 評価ボードの入出力仕様の確認て詳しく解説します．

ここに，種類の異なる 2 枚の FPGA 評価ボードがあるとしま

なお，ここでのコントローラの HDL 記述には VHDL と Veri

す．8 ビット LED とプッシュ・ボタンは，どちらも同様にボーlog-HDL の両方で設計しますが，本文の説明ではおもに VHDL

ド上に装備されています．しかし回路構成上，FPGA から見た版を使います．VHDL のソースと Verilog-HDL のソースは同じ

LED やボタンの動作が異なっている場合があります．

構造になるように記述しているので，照らし合わせて見てくだ

図 1 に示すように FPGA から LED を点灯制御するには， L

さい．VHDL および Verilog-HDL の基本的な言語仕様などにつレベルを出力すると点灯するものと， H レベルを出力するといては詳しく説明しません．HDL の入門書などを参照してくだ点灯するものの 2 通りがあります．スイッチも同様で，スイッ

さい．

チを ON にすると FPGA に L レベルが入力されるものと， H● 8 ビット LED とプッシュ・ボタンを装備した FPGA

レベルが入力されるものがあります． L レベルを出力して点

評価ボードを使用

灯する LED や，スイッチが ON 状態で L レベルが入力される動作を試しながら学ぶということから，お手元に FPGA 評価

回路を，負論理回路と呼びます．用意した評価ボードがどちらボードを用意してください．FPGA はどこのメーカのどのようであるかは，回路図を見たり実際にテスト回路を動作させるななシリーズのものでも問題ありません．ただし，動作確認をしどして確認しておいてください．

たらさらに機能を追加して動作確認…という手順を繰り返すの

ちなみに，なぜ入出力回路に負論理を採用することが多いので，何度でも回路データをダウンロードしてテストできる必要かについては，歴史的にもそれなりに根拠があるのですが，こ54

KEYWORD ――シリアル・コントローラ，シフト・レジスタ，シリアル-パラレル変換，ビット・シフト

Jan. 2006

シリアル I/O コントローラ設計入門

V

スイッチを押す

スイッチを離す

L レベルを出力するとLEDが点灯
（負論理）
入力レベル

H レベルを出力するとLEDが点灯
（正論理）

デ
バ
イ
ス

1

V
ロジック信号スイッチをONにすると L レベルが入力
（負論理）

V

スイッチを1回だけ押したり離したりしただけで，数回操作したのと同じ状況になる

スイッチをONにすると H レベルが入力（正論理）

図 2 スイッチ入力のチャタリング
VV

図 1 正論理と負論理の違い
スイッチを押すとL レベル

こでは説明を省略します．ディジタル回路設計の入門書などを参照してください．

● スイッチのチャタリング除去回路を入れよう

1
図 3 チャタリング除去回路の例

評価ボードによっては，プッシュ・ボタンの入力がそのまま
直接 FPGA に接続されている場合もあります．その場合，ス
イッチを押したり離した瞬間にチャタリングと呼ばれる現象が2

リセット ・ スイッチ（負論理）
V

FPGA
RESET

発生し，1 度しかスイッチを押していないにもかかわらず，回

LED出力（負論理）

路としては数回のスイッチ入力があったかのような動作をしてしまう場合があります（図 2）．
使用する評価ボードのスイッチ入力部に，図 3 のようなチャVVす．後述するシフト動作タイミングを示すスイッチ入力には，×8個

4SW̲CLK

図 4 リスト 1 の FPGA 外部の回路例

5チャンタリングを除去したノイズのないクロックが必要です．
レジスタで 8 ビット・データを保持します．

2

シフト・レジスタと
シリアル-パラレル変換の回路

実際の回路は begin の次の行から記述します． の process

ト・パターンのデータが代入されます（）．すると process

リスト 1 にシフト・レジスタによるパラレル→シリアル変換

文の外の では，SHIFT_REG の値を LED_OUT という信号に出の HDL ソースを，図 4 に FPGA の外部回路の例を示します．

力しています．process 文の外は常時並列に回路が動作するの

リスト 1 は LED 点灯出力やスイッチ入力が負論理の場合の例

で，リセット時に SHIFT_REG に値を代入すると，それと同時です．評価ボードの回路構成の違いにより，負論理/正論理のに LED_OUT の出力信号も SHIFT_REG に代入した値に変わりま違いがある場合は，それぞれの仕様に合わせてコメント部分をす．ソフトウェアの世界からハードウェアの世界に入門したば変更してください．リスト 1 では 8 ビット LED 出力と，リセッ

かりの頃は，この「同時に動作する」という点をつねに頭に入れト・スイッチおよびシフト動作タイミングとして使うクロッて，それを意識しながら HDL ソースを見てください．

ク・スイッチの 2 個のスイッチを必要とします．

リスト 1 を論理合成/配置配線し，FPGA 用のコンフィグレー

リスト 1 の内容について説明します．まず entity で，FPGA

ション・データを作成して，評価ボードにダウンロードしてくの外につなげる信号を定義します（リスト 1 の ）．リセット信ださい．リセット・スイッチを押して，LED の点灯パターンが号として RESET を，8 ビット LED の点灯出力用として LED_SHIFT̲REG に代入した値のビット・パターンと同じになってOUT を，そしてシフト動作クロック信号として SW_CLK を定義いるでしょうか？

します．

● レジスタ SHIFT̲REG のシフト動作

さらに FPGA の内部に必要なレジスタを定義します（ ）．こ
こでは SHIFT_REG という 8 ビットのレジスタを定義し，このJan. 2006

App2

文がシフト・レジスタの処理をしている部分です．まずリセット・スイッチが押されると，SHIFT_REG には 10101010 というビッ● パラレル→シリアル変換の動作

3
App1

LED̲OUT

シフト動作スイッチ（負論理）

タリング除去回路が付いていない場合は，コラム 1 に示すような，ロジック回路によるチャタリング除去回路が必要になりまP

次にシフト・レジスタをシフト動作させてみます．シフト動
作スイッチを押すと，SW_CLK 信号が 1 になります．

Information ――「Impulse C」が FPGA アクセラレータ搭載のスーパ・コンピュータに採用
米 Impulse Accelerated Technologies 社が開発した C 言語による FPGA 設計ツール「Impulse C」が，米 Cray 社の FPGAアクセラ
レータ搭載のスーパ・コンピュータ「XD1」に採用された．Impulse C の国内販売代理店は，（有）インターリンク（http://www.ilink.co.jp）
．

の部

55

6

Column 1 ロジック回路によるチャタリング除去の例
図 2 でわかるように，スイッチ入力は安定するまでに数 ms 〜数十を 1 にセットします．

ms 程度の時間がかかります．そこでこの時間が経過するのを待ってか

スイッチ入力無効期間では，時間経過をカウントする CLK_COUNTらスイッチの状態を入力すれば，安定したスイッチ入力が可能です．

ER の上位ビットを調べ，規定した時間が経過したかどうかを判定しリスト A とリスト B にロジック回路によるチャタリング除去の例

ます．まだ規定時間が経過していない場合は，CLK_COUNTER をインを示します．チャタリング除去の対象となるスイッチ入力と，チャクリメントします．もし規定時間が経過した場合は，スイッチ入力

タリングを除去したスイッチ状態出力のほかに，時間経過をカウン

マスクをクリアし，スイッチ入力判定結果を保持する信号 SW_OUT_

トするためのクロック入力と，関連するカウンタのクリアのためにリ

REG に，安定したスイッチ入力の状態を代入します．

セット入力も必要です．

process 文の外では，SW_OUT_REG の値を SW_OUT 信号に代入し通常はスイッチ入力有効期間として，スイッチの状態を常時監視します．SW_REG1 と SW_REG0 の二つの信号は，スイッチ入力であているので，チャタリングを除去したきれいなスイッチ入力を，ここで出力します．

る SW_IN の状態を保持した変数で，SW_REG1 は SW_REG0 より 1 ク

時間経過をカウントするクロックとしては，33MHz のクロックをロック前の状態を保持しています．よって，この二つの信号を比較使用する場合は 20 数ビット程度のカウンタを使うことで，数 ms 〜

し状態が異なる場合は，スイッチが押された，または離されたこと十数 ms の待ち時間をカウントすることができます．使用するスイッを検出できます．スイッチの状態が変化したことを検出したら，スチの特性によっては，チャタリング発生期間が異なります．タクト・

イッチ入力が安定するまでの時間をカウントする CLK_COUNTER を

スイッチの類は比較的時間が短いようですが，内部が機械式バネのクリアし，またスイッチ入力を無視するためのマスク信号 SW_MASK

スイッチでは，比較的チャタリング発生期間が長いようです．

リスト 1 シフト・レジスタによる LED 点灯出力-- ********************************************************-- シフト・レジスタ出力のテスト-- ********************************************************// ********************************************************// シフト・レジスタ出力のテスト// ********************************************************

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;module SHIFT_OUT(

入出力信号の定義

input
outputinput

entity SHIFT_OUT is
port (RESET
LED_OUT
SW_CLK

: in
: out
: in

std_logic;
std_logic_vector(7 downto 0);
std_logic
FPGA内部で保持する
シフト・レジスタ定義);
end SHIFT_OUT;
architecture RTL of SHIFT_OUT issignal SHIFT_REG: std_logic_vector(7 downto 0);

RESET
LED_OUT
SW_CLK[7 : 0]

FPGA内部で保持する
シフト・レジスタ定義);
reg

入出力信号の定義

[7:0]

,
,

シフト・
レジスタ処理クロック・
エッジで動作SHIFT_REG;//always @(posedge SW_CLK or posedge RESET)// 正論理の場合
always @(negedge SW_CLK or negedge RESET)// 負論理の場合
begin// if (RESET == 1'b1) begin// 正論理の場合
if (RESET == 1'b0) begin// 負論理の場合

シフト・レジスタ処理

begin

SHIFT_REG <= 8'b10101010;
process (RESET, SW_CLK)
begin-- if (RESET = '1') thenif (RESET = '0') thenend else begin-- 正論理の場合-- 負論理の場合

リセット時代入SHIFT_REG[7] <= 1'b0;
SHIFT_REG[6 : 0] <= SHIFT_REG[7 : 1];

リセット時代入SHIFT_REG <= "10101010";

end--

elsif (SW_CLK'event and SW_CLK = '1') thenelsif (SW_CLK'event and SW_CLK = '0') then-- 正論理の場合-- 負論理の場合//
SHIFT_REG(7) <= '0';
SHIFT_REG(6 downto 0) <= SHIFT_REG(7 downto 1);

シフト動作

end
assignassignendmodule
end if;end process;
--

シフト動作

LED_OUT
LED_OUT= SHIFT_REG; // 正論理の場合= ~SHIFT_REG; // 負論理の場合
LED点灯出力

クロック・イベント文（b）Verilog-HDL 版

LED_OUT <=SHIFT_REG;
LED_OUT <= not SHIFT_REG;-- 正論理の場合-- 負論理の場合

LED点灯
出力

end RTL;（a）VHDL 版

56

New Products ―― アダプテック，SAS 製品を続々発売
アダプテックジャパン（株）は，SAS/SATA ドライブのインテリジェント・エンクロージャ「Storage Enclosure 335SAS」，SAS
RAID コントローラ「Serial Attached SCSI RAID 4800SAS/4805SAS」，「Serial Attached SCSI 48300」を発売した．

Jan. 2006

シリアル I/O コントローラ設計入門

1

リスト A ロジック回路によるチャタリング除去回路の例（VHDL 版）
SW_REG0
SW_OUT_REG
SW_MASK-- ********************************************************-- スイッチ入力のチャタリング除去-- ********************************************************

elsif (CLOCK'event and CLOCK = '1') thenlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;if (SW_MASK = '0') then-- スイッチ入力有効期間
if (SW_REG1 /= SW_REG0) then-- 前回と比較してスイッチ状態が変化した
SW_MASK<= '1';-- スイッチ入力無効期間
CLK_COUNT <= (others => '0');end if;entity SWIN_CTRL is
port (
RESET
CLOCK
SW_IN
SW_OUT

: in
: in
: in
: out

std_logic;
std_logic;
std_logic;
std_logic

else -- スイッチ入力無効期間
if (CLK_COUNT(20) = '1') then-- 規定時間を経過した
SW_MASK <= '0';-- スイッチ入力有効期間
SW_OUT_REG<= SW_REG1;-- スイッチ入力状態確定
else
CLK_COUNT <= CLK_COUNT + '1';-- 経過時間カウント
end if;end if;);end SWIN_CTRL;
architecture RTL of SWIN_CTRL issignal CLK_COUNT
signal SW_REG0
signal SW_REG1
signal SW_OUT_REG
signal SW_MASK<= '0';<= '0';<= '0';: std_logic_vector(20 downto 0);: std_logic;: std_logic;: std_logic;: std_logic;
--

begin
-- ***** 入力スイッチ状態判定 ***** -process(RESET, CLOCK)
begin

SW_REG1 <= SW_REG0;
SW_REG0 <=SW_IN;
SW_REG0 <= not SW_IN;

P
1-- 現在のスイッチ状態を保存-- 正倫理の場合-- 負倫理の場合

2

end if;end process;3

SW_OUT <= SW_OUT_REG;--

if (RESET = "1") thenif (RESET = '0') then-- 正論理の場合-- 負論理の場合-- チャタリング除去したスイッチ状態を出力

App1

end RTL;
CLK_COUNT <= (others => '0') ;SW_REG1<= '0';

4
リスト B ロジック回路によるチャタリング除去回路の例（Verilog-HDL 版）

if (SW_MASK == 1'b0) begin// スイッチ入力有効期間
if (SW_REG1 != SW_REG0) begin// 前回と比較してスイッチ状態が変化した
SW_MASK<= 1'b1; // スイッチ入力無効期間
CLK_COUNT <= 20'h00000;
end

module SWIN_CTRL
(
input
input
input
output

RESET
CLOCK
SW_IN
SW_OUT,,,[20: 0]App2
6

end else begin // スイッチ入力無効期間
if (CLK_COUNT[20] == 1'b1) begin// 規定時間を経過した
SW_MASK <= 1'b0; // スイッチ入力有効期間
SW_OUT_REG <= SW_REG1;// スイッチ入力状態確定
end else begin
CLK_COUNT <= CLK_COUNT + 1;// 経過時間カウント
end
end

);
reg
reg
reg
reg
reg

5

end else begin// ********************************************************// スイッチ入力のチャタリング除去// ********************************************************

CLK_COUNT;SW_REG0;
SW_REG1;
SW_OUT_REG;
SW_MASK;//always @(posedge CLOCK or posedge RESET) // 正論理の場合
always @(posedge CLOCK or negedge RESET) // 負論理の場合
begin// if (RESET == 1'b1) begin// 正論理の場合
if (RESET == 1'b0) begin// 負論理の場合//

SW_REG1 <= SW_REG0;
SW_REG0 <= SW_IN;
SW_REG0 <= ~SW_IN;// 現在のスイッチ状態を保存// 正倫理の場合// 負倫理の場合

end
CLK_COUNTSW_REG1
SW_REG0
SW_OUT_REG
SW_MASK<= 20'h00000;<= 1'b0;<= 1'b0;<= 1'b0;<= 1'b0;end
assignSW_OUT = SW_OUT_REG;// チャタリング除去したスイッチ状態を出力

endmoduleJan. 2006

New Products ―― サン，「Sun Java Studio Enterprise 8」を無償で提供
サン・マイクロシステムズ（株）は，Java アプリケーション統合開発環境「Sun Java Studio Enterprise 8」をリリースし，無償での提供を開始した．本ツールは，NetBeans 4.1 がベースとなって開発されている．対象となる OS は，Solaris と Windows．

57

Column 2
評価ボードに 8 ビットのディッ
プ・スイッチがある場合

リスト C リセット時の初期値をディップ・スイッチで設定可能にする例（VHDL 版）〜中略〜entity SHIFT_OUT_b isport (RESET
LED_OUTDIP_SW
SW_CLK

リスト 1 ではリセット時に HDL ソース中に記述した固定値を SHIFT_REG に代入しています．もし使: in std_logic;: out std_logic_vector(7 downto 0);: in std_logic_vector(7 downto 0);: in std_logic

ディップ・
スイッチ入力を追加

用する FPGA 評価ボードに 8 ビットのディップ・ス
イッチが実装されている場合は，それを使ってリセット時の初期値を決めることも可能です．
リスト C にリセット時の初期値をディップ・ス
イッチで設定可能にする例を示します．これにより，
HDL ソース・コードを変更して，論理合成や配置配
線，さらにはダウンロードまでをやり直さなくても，);end SHIFT_OUT_b;〜中略〜

process (RESET, DIP_SW, SW_CLK)
begin-- if (RESET = '1') then-- 正論理の場合
if (RESET = '0') then-- 負論理の場合
SHIFT_REG <= DIP_SW;

ディップ・スイッチの状態を変更してからリセット・スイッチを押せば，LED の点灯ビット・パターンを--すぐに変更することができます．

リセット時にディップ・スイッチの内容をシフト・レジスタに代入

elsif (SW_CLK'event and SW_CLK = '0') then -- 正論理の場合
elsif (SW_CLK'event and SW_CLK = '1') then -- 負論理の場合〜中略〜

分は，SW_CLK 信号が 1 から 0 になった立ち下がりのタイミ

elsif 文の内側の 2 行が同時に実行されるのとさらに同時

ングで，elsif 文の内側が実行されることを示しています．

に，process 文の外にある LED_OUT の出力部分も動作するのの部分で，最終的にはシフト動作スイッチを押すと，8 ビット LED のです．まず SHIFT_REG の最上位ビットである 7 ビットに 0

点灯パターンが 1 個ずつ下位ビット側にずれて表示される動作を代入しています．またすぐ下の行では，SHIFT_REG のビッになります．またビット 7 にはゼロが代入されるので，その部

ト 7 〜 1 を同じレジスタ SHIFT_REG のビット 6 〜 0 に代入し分は LED の点灯が消えていきます．

ています．同じレジスタから同じレジスタへ，ビット位置をず● LED̲OUT のビット 0 に注目して動作を確認

そして SW_CLK 信号の立ち下がりで動作する回路がらして代入する動作がシフト動作になります．この例ではビッ

ここで，LED_OUT のビット 0 だけに注目してみましょう．リ

ト位置が 1 ビットだけずれていますが，一度に複数のビットをセット時は SHIFT_REG に代入した値のビット 0 が反転して代ずらすことも可能です．もちろん移動元と移動先のビット幅が入されて 1 になります．シフト動作スイッチを押すと 1 ビッ

一致していなければ，論理合成時にエラーになります．

ト下位側にシフトして，ビット 0 は 0 になります．さらにシ

ここで，ハードウェアや HDL の初心者は，先に SHIFT_REG

フト動作スイッチを押すともう 1 ビット下位側にシフトして，のビット 7 にゼロを代入してしまったら，そのすぐ下の行で行っ

今度はビット 0 は 1 になります．つまり，リセット時にているシフト動作をしても，SHIFT_REG のビット 6 までがゼ

SHIFT_REG に代入した値が，シフト動作を行うたびに下位ビッロになってしまうと思う人もいるかもしれません．リスト 1 は

トから 1 ビットずつ出力される動作になります．これがパラレ

一見プログラミング言語のようなソースなので，ソフトウェア

ル→シリアル変換の基本動作となります．以上のシフト動作の畑の人はどうしてもそのような先入観を持ってしまいますが，ようすを図 5 に示します．

これはれっきとしたハードウェアです．

シフト動作スイッチを 8 回押すと，すべての LED の点灯が消えることになります．ここでリセット・スイッチを押すと，レSHIFT_REG(7) <= '0':の行も，その下の，ジスタ SHIFT_REG にまた新しくデータが代入されるので，再SHIFT_REG(6 downto 0) <=SHIFT_REG(7 downto 1);の行も，SW_CLK 信号の立ち下がりのタイミングで同時に並列度 LED が点灯し始めます．またシフト動作スイッチを押した
回数が 8 回未満のときにリセット・スイッチを押しても，LEDの点灯状態はリセット時の状態に戻ります．

に動作するのです．つまり結果的に，レジスタ SHIFT_REG の

リスト 1 に記述している process 文は，先にある if 文で内容が全体として下位ビット側に 1 ビットだけシフトし，最上RESET 信号の状態を調べ，次にある if 文（VHDL では elsif位であるビット 7 はゼロになります．ちなみにシフトの直前まと記述）で SW_CLK 信号の状態を調べることになるので，もしでビット 0 に入っていた情報は，このシフト動作で消えてなく

同時に信号が入力されても（ここでの SW_CLK 信号はクロック・

なります．

イベント文として記述しているので，SW_CLK 信号の立ち上が58

New Products ―― Twin Sun 社とミラクル・リナックスが電子カルテ・システムを共同で開発
米 Twin Sun 社とミラクル・リナックス（株）は電子カルテ・システムを共同で開発し，提供を開始した．同システムは，Twin Sun
社のカルテ・システム「MEDEX」に，ミラクル・リナックスのソフトウェア「MEDEX On MIRACLE LINUX」を搭載したもの．

Jan. 2006