guruguru123’s diary

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

ad9851駆動回路の追加

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

f:id:guruguru123:20170418181830p:plain

さっそくcore-generatorでDCMを作成しくみこんでみた。生成するクロックの周波数は25MHz。論理合成を行ったところ次のようなエラーが出た。

ERROR:Xst:2035 - Port <clk> has illegal connections. This port is connected to an input buffer and other components.

バッファとコンポーネントが並列につながっているからダメらしい。正直この辺は勉強不足で知識が足りないので、改善策を探していきたい。とりあえず並列にならないようにバッファを入れてみた。

IBUFG_inst : IBUFG
port map (
O => clk_i, -- 1-bit output: Clock buffer output
I => clk -- 1-bit input: Clock buffer input
);

そうすると論理合成は通過した、がTranslateで引っかかった。

ERROR:NgdBuild:770 - IBUFG 'IBUFG_inst' and IBUFG 'clk_25/clkin1_buf' on net
'clk_i' are lined up in series. Buffers of the same direction cannot be
placed in series.
ERROR:NgdBuild:462 - input pad net 'clk_i' drives multiple buffers:

複数のバッファが直列に接続されているとこれが出るらしい。そういえばDCMでバッファ入れるとか入れないとかいう項目が会った気がする。今回はここまでにして、次回はこれの改善からはじめる。

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

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

data_out <= data_o1 when r_o = '1' else
      (others => '-') when r_o = '0';

これは、読み出しのときのみ出力を反映し、それ以外は保持としている。シミュレーション結果は以下のようになった。論理合成がエラー、Warningなしで行えたため、bitファイル生成まで行ったところ、ゲーテッドクロックも解消されていた。これからad9851をドライブする回路を追加していきたい。

f:id:guruguru123:20170418180953p:plain

RAMコントローラ記述変更

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

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

以前、ゲーテッドクロックをイネーブル付きのものに置き換えるというようなことを言っていた。そこでゲーテッドクロックをクロックイネーブルに変更していくための練習をした。

まずはゲーテッドクロックになってしまう例を作成。

entity clock_pra is
port(
clk : in std_logic;
D : in std_logic;
Q : out std_logic;
a : in std_logic;
b : in std_logic
);
end clock_pra;

architecture Behavioral of clock_pra is
signal dbuf : std_logic;
signal c : std_logic;

begin
c <= (clk and a and b);
process (clk) begin
if c' event and c = '1' then
dbuf <= D;
end if;
end process;

Q <= dbuf;

end Behavioral;

f:id:guruguru123:20170313153038p:plain

RTL Schematicを見るとクロックがAND回路の出力になっていることがわかる。

次にイネーブルのものを作成。

entity clock_pra is
port(
clk : in std_logic;
d_i : in std_logic;
Q : out std_logic;
a : in std_logic;
b : in std_logic
);
end clock_pra;

architecture Behavioral of clock_pra is
signal dbuf : std_logic;
signal c : std_logic;
signal D : std_logic;

begin
c <= (a and b);

process(c,d_i,dbuf) begin
if c = '1' then
D <= d_i;
else
D <= dbuf;
end if;
end process;

process (clk) begin
if clk' event and clk = '1' then
dbuf <= D;
end if;
end process;

Q <= dbuf;

end Behavioral;

f:id:guruguru123:20170313153508p:plain

こちらはクロックがそのまま用いられており、AND出力がイネーブルとして用いられている。また、以下のようなパターンでも同様な回路が構成される。

architecture Behavioral of clock_pra is
signal dbuf : std_logic;
signal c : std_logic;

begin
c <= (a and b);

process (clk,c) begin
if clk' event and clk = '1' then
if c = '1' then
dbuf <= D;
end if;
end if;
end process;

Q <= dbuf;

end Behavioral;

f:id:guruguru123:20170313153805p:plain

以下参考にしたサイト

https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx11/sim.pdf

https://japan.xilinx.com/support/answers/51737.html

 

Papilio Pro上にRAMを構成(4)

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

製作していく中で以下のような問題点が見つかった。
・タイミング制御部のミス
ゲーテッドクロックの除去

内部構成RAMについては、問題なく動作していることが確認できたため、修正すべき点はクロック周りだけである。調べつつ進めていきたい。

Papilio Pro上にRAMを構成(3)

前回までは、読み出しまでが終わったタイミングでRS232C通信を開始していたが、今回は1秒ごとに

RAM制御→RS232C:DATA1→RS232C:DATA→RS232C:DATA1→RS232C:DATA2

でまたRAM制御に戻すようなものに改良してみた。

最初に以下のようにしてみた。

RAM制御→RS232C:DATA1→RAM制御→...

出力がうまく得られなかったのだが、それに加えてRS232Cの出力が、RS232Cへのデータ入力をRAMからの読み出しデータにすると1秒間隔で出てくるので、おかしいことになっていた。試しにRS232Cへのデータ入力を直接入力すると、ちゃんと2秒おきに出力が出てくる。

 

今後はこちらの方式で進めていきたい。

Papilio Pro上にRAMを構成(2)

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

以下、動作確認時の信号のキャプチャ。

f:id:guruguru123:20170120172751p:plain