(長門の)UARTを作ろう!
仕事とは関係無しに簡単なUARTが欲しくなった。
いろいろとさがしてみたが、ドキュメント読むより作った方が早そうなので一から作ることにした。ただ作るのもあれなので、一個だけ特徴を持たせてみました。
名前は例によって、(長門の)UART、略してnuart。opencoresのmini UARTがライバル。
ISEで合成した比較
nuart mini UART
FFの数 78 74
Slice数 78 88
GCLK数 1 2
I/F FIFO Wishbone bus
見ての通り、ロジックの数はほぼ同じ。ただし、CLKラインが1本しか使わない。最近の回路はDDR周りだけで2つも3つもクロックラインを使うので、UARTごときでクロックラインを使いたくないという(主に僕の)要望に応えました。
システムクロックを分周して動かすのですが、x16のクロックを使う代わりに、x16のクロックに合わせて動作するように回路を組んでいます。ですので、クロックラインはシステム系(FIFOのI/F)の1系統しか使いません。
トップ回路はnuart.v、I/Fはこんな感じです。
①受信時波形
②送信時波形
要するに、受信したら受信データと共にrx_fifo_wr_oが1CLK HになってFIFOに書き込む。tx_fifo_empty_iがLの時(FIFOにデータがあるとき)は、FIFOからデータを読み出し送信します。一応、16倍クロックで受信時の補正をしていますが、上手く動いているかどうかは不明。
Nios Development Board, Cyclone Edition で折り返しが動いたので公開します。
ファイルはここ。回路のパラメータは、50MHzを入れたときに9600bpsで動作するようにしてます。
テストベンチも入っているので、altera_mf.vを追加すれば、そのままVeritakでシミュレーションできます。
The comments to this entry are closed.
Comments
見事なまでにMSB、LSBを逆に送っていた。折り返しだと気がつかない。
Posted by: なつたん | 2008.03.07 06:54 PM