guruguru123’s diary

かなり雑な作業日記です。

rs232c通信を用いてコマンド送信:基礎編

AD9851の出力周波数を変えたり、複数動かすためには外部からコマンドを入力して制御することになるため、RS232C通信でコマンドを送ることにした。今回は基礎作り。 今回はTERA TERMを使ってFPGAへアスキーでwdと送ると40bit受付待機、rdと送るとその40bitの…

AD9851ドライブ用データのRS232C通信での転送

前回はRS232C通信によって、あらかじめ蓄えられているADF9851ドライブ用データの読み出し先を選択する機構を作った。 今回は蓄えるデータもRS232C通信でFPGA上のRAMに書き込みできるものをつくっていく。データ生成部も後々必要になるが、今回は手打ちでテキ…

AD9851ドライブ用データをRS232C通信を用いてPCから選択

そろそろ外部でデータ生成をして、それをRAMに格納して順次読み出し、AD9851をドライブする。といったものを作っていきたい。 今回は、PCからデータを受け渡す機構として、以前も出てきたRS232Cを使って試したいと思う。いきなりデータ生成まで作るのは大変…

AD9851へのドライブ信号を外部入力から選択

前回、AD9851を100MHzでドライブすることができたため、今回は外部入力から状態遷移(4データのRAMへの書き込み、それぞれのデータの読み出し)を行えるように組み替えた。I/Oポートにそれぞれのリクエスト信号に対応する5つのピンを設け、それをグラウンド…

AD9851へW_CLKの周波数を上げてドライブ

32MHzの周期を3.125nsだと一桁勘違いしていたため(本当は31.25ns)前回はW_CLKを分周して用いていた。そこで、今回は全ブロックを32MHzで動作するものを作成した。 また、これが動作したため、DCMを用いて、W_CLKの周波数を上げてAD9851へドライブするものを…

AD9851へのドライブ(2)

前回のAD9851への書き込み信号が連続して出力されてしまう問題(waitの状態に移行してくれない)の解決策が思い浮かばなかったため、問題を洗い出すためにシミュレーションをしてみた。以下がその結果。 すると、シミュレーション上ではstate_nがいったん書…

AD9851のドライブ

前回のエラー文中に PIN "clk_gen/clkout1_buf.O" CLOCK_DEDICATED_ROUTE = FALSE; を制約ファイルに入れるとエラーからワーニングに移るとあったため、試してみた。すると、出ていたエラーが消え、以下のようなワーニングに移った。 Pack:1653 - At least o…

AD9851駆動回路の追加(DCM)

DCM構成の段階でBUFGをつなぐかどうかのチェックがあったため、今回構成したDCMのVHDLの記述を参照してみた。すると、内部にIBUFGとBUFGがすでにあったため、前回のエラーが発生していたようだ。 そこでIBUFG,BUFGの記述を削除し、32MHzのクロック信号をDCM…

ad9851駆動回路の追加

RAMコントローラが問題なく動いたため、AD9851の駆動用の回路を追加していく。ベースは以前作成したZPUinoに追加した回路。AD9851用の書き込みクロックであるW_CLKは、最小パルス幅が3.5nsであり、以前作成したものでは、カウンタを作ってそれでクロックの代…

ramコントローラの記述変更

前回のものでは次の状態(wからr_1等)への待機がうまく記述できていなかったため、待機状態を新たに追加した。また、状態遷移内での出力の変化がそのまま出力につながっていたため、これを以下のように変更した。 data_out <= data_o1 when r_o = '1' else (o…

RAMコントローラ記述変更

以前までの方法ではゲーテッドクロックの除去が難しかったため、記述方法を変えてみることにした。イネーブルを導入したものでの動作確認のためにテストベンチを作成した。動作をさせてみるとイネーブルは動作しているが状態遷移が起こっていないことがわか…

ゲーテッドクロックからクロックイネーブル付きへの変更練習

以前、ゲーテッドクロックをイネーブル付きのものに置き換えるというようなことを言っていた。そこでゲーテッドクロックをクロックイネーブルに変更していくための練習をした。 まずはゲーテッドクロックになってしまう例を作成。 entity clock_pra is port(…

Papilio Pro上にRAMを構成(4)

RS232C通信を用いてきてうまくいかないため、問題点をはっきりさせるために、いったんRS232C通信での出力の確認をやめた。代わりに出力の下位4bitをIOピンから1bitずつ出力して、目視による確認ができるようなものを作っていく。 製作していく中で以下のよう…

Papilio Pro上にRAMを構成(3)

前回までは、読み出しまでが終わったタイミングでRS232C通信を開始していたが、今回は1秒ごとに RAM制御→RS232C:DATA1→RS232C:DATA→RS232C:DATA1→RS232C:DATA2 でまたRAM制御に戻すようなものに改良してみた。 最初に以下のようにしてみた。 RAM制御→RS232C:…

Papilio Pro上にRAMを構成(2)

SDRAMコントローラとなるべく同じような動作をするようにRAMコントローラを作ってみた。動作させたところ、目的の信号が出てはいるのだが動作が不安定であった。その理由がわからないため、テストベンチを作るなどして原因を考えて行きたい。 以下、動作確認…

Papilio Pro 上にRAMを構成

SDRAMで行き詰っていたところ、ISEのBlock Memory Generatorで内部RAMを作って試してみたらと、アドバイスを頂いたので試してみた。 http://www.hmwr-lsi.co.jp/fpga/fpga_5.htm こちらのサイトを参考にとりあえず構成をしてみた。 Block Memory Generatorが…

SDRAMを用いてのAD9851への書き込み

SDRAMコントローラがとりあえずできたので、以前作ったAD9851ドライブ機構と合わせてみようとした。しかし、以前はVelirog hdlを用いていたため、また、ZPUinoに組み込んでいたため、信号部分等の変更が面倒だった。そこで新しくDDSドライブ部をつくり、組み…

Papilio Pro基板上SDRAMの利用(10)

前回に引き続き、一秒間隔の信号に従ってSDRAMへデータを書き込み、その書き込んだアドレスからデータを読み出す。そのデータをRS232C通信でPC上に表示させ、ここまで終わったら次の立ち上がり信号を待機する。というSDRAMコントローラの製作。 前回、RS232C…

Papilio Pro基板上SDRAMの利用(9)

前回RS232C通信部は問題ないと書いたが、一秒ごとに出力させるようにタイミング制御を入れたところうまく動作しなかった。そこで、以下のようにプログラムを改変した。 startが'1'の間送信部が働き、16bit送信が終わったらstate_fが立ち上がり、startを'0'に…

Papilio Pro基板上SDRAMの利用(8)

とりあえずこんな感じに組み込んでみた。今回はあまり速度は考えず、一秒間隔で書き込み、そのままそのアドレスを読み出しをする。読み出しが終わったらRS232Cのブロックにデータを渡してPCと通信させる。コンパイルまで終わったが、シリアルコンソールに出…

Papilio Pro基板上SDRAMの利用(7)

前回は起動からアクティブまで遷移するものを作った。今回はそこから書き込みをしてそのまま連続で読み出しをするものを作った。以下シミュレーションのキャプチャである。図を見るとアクティブであるときに、書き込みリクエストがあると書き込みサイクルへ…

Papilio Pro基板上SDRAMの利用(6)

前回まで作っていたものを改めてみたところ、ステートマシンとして記述していたつもりが状態判定部分が機能しておらず、正しく動作していなかったことがわかった。 そこで、とりあえず起動からアクティブまでを新しく作り直した。前回まではテストベンチを作…

Papilio Pro基板上SDRAMの利用(5)

プログラムを組み終わり、コンパイルからbitファイル生成までエラーなく成功した。しかし、SDRAMからのデータ読み出しの出力を確認したところ読み出しがうまくいっていないことがわかった。プログラムを確認したところSDRAMの信号線を何本か接続し忘れていた…

Papilio Pro基板上SDRAMの利用(4)

基本的なSDRAMの動作について勉強したが、いまいちアドレス指定の仕方がわからない。ざっくりとアドレス指定のブロック図を示すと以下のようになると思う。SDRAMはクロックに同期して動作するため、ロウ/カラム・アドレスは同一の信号線を用いる。図では、バ…

Papilio Pro基板上SDRAMの利用(3)

前回rとnが何だかわからないと書いたが、用途はだいたいわかった。このプログラムは3つのprocess文から成り立っていて、rとnが出てくるのは以下2つだ。 1.process (r, rstate, address, req_read, rdata_write, req_write, addr_row, addr_bank, addr_col, d…

Papilio Pro基板上SDRAMの利用(2)

前回はentuty内部を見たので、今回からarchitecture内部を見ていく。 レコードタイプの定義 type reg is record address : std_logic_vector(ADDRESS_BITS-1 downto 0); bank : std_logic_vector( 1 downto 0); init_counter : std_logic_vector(14 downto 0…

Papilio Pro基板上SDRAMの利用(1)

ad9851の出力の周波数・位相を高速に切り替える(μs単位が目標)ためにあらかじめPapilio Pro基板上のSDRAMにad9851へ書き込む40bitデータと時間のデータを与えておく。それを順次読み出して40bitデータをad9851へ書き込みをできるようにする。 そのためにはま…

FPGAでArduino(7)

DDS-LSIであるad9851を駆動し、周波数・位相を高速で切り替えるためにXilinx社製のFPGA:Spaltan-6を搭載した開発用基板Papilio Proを用いて40bitのデータを書き込む。これにはZAP IDEから周波数と位相の数値データの入力し、FPGAプログラムで40bitデータを…

FPGAでArduino(6)

なんとなくコツがつかめてきたので、本題のAD9851へ40bitのデータを書き込むためのプログラムを作成していきたい。まずは、40biのデータをどうやって作成するかだが、これは、ZAPIDEで発振したい周波数、位相を指定し、それを40bitデータへ計算させるためSLO…

FPGAでArduino(5)

2進カウンタを追加してみようとして苦戦しているが、そもそもどこがだめなのかをはっきりさせるため、いったん2進カウンタの値をWISHBONEバスを用いて読み取るのをやめ、WISHBONEバスを用いて定数を読み出すことにした。すると、問題なく読み出せていること…