ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

FPGA/CPLD友の会コミュの"*"の算術演算子について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして、
FPGAを使用して間もないものです。

VHDLの乗算器についての質問です。

いま、actelのLibero IDEを使用して、テストベンチファイルを作成し、
modelsimを用いてシミュレーションを行っています。

それで、VHDLの算術演算子"*"の動作を試したく、
下記のソースにて、
シミュレーションを行っているのですが、
yの出力が不定となって出力されてしまいます。
a=0001
b=0011
の時
y=000000XX
となってしまいます。

どうしたら、うまくいくのでしょうか?
この原因とあと'*'を扱うときの注意点などあれば教えていただきたいです。

よろしく、お願いします。

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
USE IEEE.std_logic_arith.ALL;

--入出力変数の定義--

ENTITY lowpass IS
PORT(
CLK : IN std_logic;
RESET : IN std_logic;
y : OUT std_logic_vector(7 downto 0);
y1 : OUT std_logic_vector(3 downto 0);
y2 : OUT std_logic_vector(3 downto 0)

);
END lowpass;


--プログラム本体--
ARCHITECTURE rt1 of lowpass IS


--使用する変数の定義(信号の定義)--
SIGNAL r : std_logic_vector(3 downto 0);
SIGNAL a : std_logic_vector(3 downto 0);--T/T+Ts
SIGNAL b : std_logic_vector(3 downto 0);--(1-a)
SIGNAL yn : std_logic_vector(7 downto 0);

BEGIN

y<= yn;
y1<=b;
y2<=a;

PROCESS(CLK,RESET)
BEGIN
if(RESET='1') then
a<="0001";
b<="0000";
y<=(others => '0');
yn<=(others => '0');

elsif(CLK'event and CLK='1') then

b<=b+'1';

END if;
END PROCESS;

PROCESS(b)
BEGIN

yn<=a*b;

END PROCESS;


END rt1;

コメント(6)

bの変化は波形で見ましたか?
VHDLだと加算は桁数合わせたほうが良かったような気がします…
b<=b+'1';でなくてb<=b+"0001"; もしくは b<=b+1; みたいな
複数のprocess文からynをドライブしてるのが原因だと思います。
解決策としては、下のprocess文を消して、上のprocess文の中に yn<=a*b; を入れればいいと思います。
あと、yをprocess文の中で代入してるのもまずいので、消さないとだめだと思います。

*を使うときの注意点は、回路面積が大きくなる点でしょうか。
>peaceofblueさんへ
bの変化は、波形で確認しました。
それで、ちゃんと0000,0001,0010・・・って加算されていってました。aも0001って常に出力されているのを確認しました。
しかし、yの出力は1になるべきところがXとなって不定になってしまいます。
>ALL
alteraのQuartus IIつかって、シミュレーションを行ったら問題を解決することができました。
上のプログラムで、動かなかった原因はまだわかってないですが、
ご助言ありがとうございました。
なべさんの仰る通り、複数のproces文の中でynに代入しているのと、yの代入がおかしいですね。

ただ、yに関しては文法上後出しじゃんけんで一応動くかも(verilogではassignとalwaysで代入になって怒られると思います…)

シミュレータによっては甘く見てくれて動作してしまうかもしれませんが、warningが出たり合成で失敗したりしますので、ちゃんと直したほうがいいですね(あと原因不明のバグの温床になる)
プロセス文の外で、y<=yn;となっており、
プロセス文内で、y<=(others => '0');となっていますね。これはまずいかと思います。リセット時にyに0をロードするようなレジスタであるような気もしますし、ただの配線である気もしますよね。(このソースで、本当に回路合成できるのでしょうか?)

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

FPGA/CPLD友の会 更新情報

FPGA/CPLD友の会のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング