Tuesday, June 20, 2006

CPLDのノイズ対策

「結論」
UART受けは2段でのD-FFで入力信号をラッチしてから、ステートマシンで処理すること。
(念のため100pf程度のコンデンサでノイズを取っておくこと)

「現象」
250kbpsのUARTを受けて処理してFIFO経由で別レートのUARTで転送するCPLDを作った。
シミュレーション上は、動作するが実機だとまれに0xFFが出力されるという問題が発生した。

「説明」
メタステーブル状態が発生するのは、もう少しクロックが高い信号のときだと思っていたら
どうやら、入力の信号にノイズが乗っていたため、たまに発生していたらしい。

メタステーブル状態になると、他のフリップフロップの信号も不安定になり'0'で初期化している信号も初期化が無視される。今回のケースでは 0x00で初期化している8bitラッチが0xFFになって、FIFOに渡っていたと想像される。0xFFを代入するVHDLは書いていないので、近辺の信号が誤動作を受けるらしい。

Sunday, June 04, 2006

Hobby PC: EDK の1回目

EDKは日本語が使えない模様。
UCFファイルに日本語を入れたかったんだけどな。

SPARTAN-3 Starter Kitに2つシリアルを追加する。

1.UCFファイルにRS232_1を追加
2.MHSファイルにRS232_1を追加
3.MSSファイルにRS232_1を追加

具体的には次の通り

■system.ucfファイルの変更箇所


Net fpga_0_RS232_0_RX_pin LOC=t13;
Net fpga_0_RS232_0_TX_pin LOC=r13;

Net fpga_0_RS232_1_RX_pin LOC=n10; # ug130.pdf ←今回追加
Net fpga_0_RS232_1_TX_pin LOC=t14; # ug130.pdf ←今回追加



■system.mhsファイルの変更箇所



#PORT fpga_0_RS232_RX_pin = fpga_0_RS232_RX, DIR = I
#PORT fpga_0_RS232_TX_pin = fpga_0_RS232_TX, DIR = O
PORT fpga_0_RS232_0_RX_pin = fpga_0_RS232_RX, DIR = I
PORT fpga_0_RS232_0_TX_pin = fpga_0_RS232_TX, DIR = O
PORT fpga_0_RS232_1_RX_pin = fpga_0_RS232_RX, DIR = I
PORT fpga_0_RS232_1_TX_pin = fpga_0_RS232_TX, DIR = O

...

BEGIN opb_uartlite
PARAMETER INSTANCE = RS232_0
PARAMETER HW_VER = 1.00.b
PARAMETER C_BAUDRATE = 115200
PARAMETER C_DATA_BITS = 8
PARAMETER C_ODD_PARITY = 0
PARAMETER C_USE_PARITY = 0
PARAMETER C_CLK_FREQ = 50000000
PARAMETER C_BASEADDR = 0x40600000
PARAMETER C_HIGHADDR = 0x4060ffff
BUS_INTERFACE SOPB = mb_opb
PORT OPB_Clk = sys_clk_s
PORT RX = fpga_0_RS232_0_RX
PORT TX = fpga_0_RS232_0_TX
END

BEGIN opb_uartlite
PARAMETER INSTANCE = RS232_1
PARAMETER HW_VER = 1.00.b
PARAMETER C_BAUDRATE = 115200
PARAMETER C_DATA_BITS = 8
PARAMETER C_ODD_PARITY = 0
PARAMETER C_USE_PARITY = 0
PARAMETER C_CLK_FREQ = 50000000
PARAMETER C_BASEADDR = 0x40610000
PARAMETER C_HIGHADDR = 0x4061ffff
BUS_INTERFACE SOPB = mb_opb
PORT OPB_Clk = sys_clk_s
PORT RX = fpga_0_RS232_1_RX
PORT TX = fpga_0_RS232_1_TX
END




■system.mssファイルの変更箇所


BEGIN DRIVER
PARAMETER DRIVER_NAME = uartlite
PARAMETER DRIVER_VER = 1.00.b
PARAMETER HW_INSTANCE = RS232_0
END

BEGIN DRIVER
PARAMETER DRIVER_NAME = uartlite
PARAMETER DRIVER_VER = 1.00.b
PARAMETER HW_INSTANCE = RS232_1
END



ハードウェアを定義するMHSを変更したら、自動生成されるHDLも
一旦削除する必要があるので、make -f system.make hwcleanとするか
或いは、Hardware->Clean Hardware のメニューを実行する必要がある。
しないと、次のエラーがOutputに表示される。




ERROR:MDT - fpga_0_RS232_0_RX (RX) -
C:\labo\labo_fpga\labo_EDK\SPARTAN3\system.mhs line 141 - connection has no
driver!
ERROR:MDT - fpga_0_RS232_1_RX (RX) -
C:\labo\labo_fpga\labo_EDK\SPARTAN3\system.mhs line 157 - connection has no
driver!
WARNING:MDT - fpga_0_RS232_0_TX (TX) -
C:\labo\labo_fpga\labo_EDK\SPARTAN3\system.mhs line 142 - floating
connection!
WARNING:MDT - fpga_0_RS232_1_TX (TX) -
C:\labo\labo_fpga\labo_EDK\SPARTAN3\system.mhs line 158 - floating
connection!
WARNING:MDT - dcm_0_lock (LOCKED) -
C:\labo\labo_fpga\labo_EDK\SPARTAN3\system.mhs line 260 - floating
connection!





□ハードウェア(SPARTAN3 Starter Kit)のスペック


# Created by Base System Builder Wizard for Xilinx EDK 8.1 Build EDK_I.18.7
# Sat Jun 03 23:18:14 2006
# Target Board: Xilinx Spartan-3 Starter Board Rev E
# Family: spartan3
# Device: XC3S200
# Package: FT256
# Speed Grade: -4
# Processor: Microblaze
# System clock frequency: 50.000000 MHz
# Debug interface: On-Chip HW Debug Module
# On Chip Memory : 8 KB
# Total Off Chip Memory : 1 MB
# - SRAM_256Kx32 = 1 MB

EDK8.1 をさわってみる

EDK8.1を購入したので、触ってみる。

一緒に購入したSPARTAN3EのStarterKitに接続してみるも、開発に使用するThinkPad T42pが、ものすごく遅くなる。
実行時のコンソールの表示からCygwinを内部で使用していることが分かる。 このためか、2重起動とかはチェックできていない様子。Linuxで開発した方が 快適かもしれないと思った。

マクロCPUであるMicroBlaze用プログラムは、Xilinx Platform Studioに含まれている GCCを利用する。サンプルコードが自動で生成されるため、RS232C経由でprintは 何もしないでもサンプル内で出来ている。

やること:
 1.自分のVHDLの回路を組み合わせる。
 2.残りのFPGAの使用率の確認。
 3.Peripheralの新規作成方法。

Thursday, June 01, 2006

About this site

These are webpages to log my work toward "My original Hobby PC".