dポイントプレゼントキャンペーン実施中!

いつもお世話になっています。

以下の開発環境におけるFPGAのロジックのシミュレーションに疑問があるので質問します。

環境
modelsim Altera starter edition

質問概要
10進カウンターを作ってクロックの立ち上がりで動作するように作ったのに立下りで動作するのは何故か。(10進数をカウンター内部変数TQで数え上げqに出力しているがTQはクロックの立ち上がりで動いているが、qは立下りで動いている様に見える)

10進カウンターの内部構造

ソース概要
・内部変数TQが0から始まり、+1していき10回数えたら0から桁上がりの変数cを1にしてやりなおし。
・計算中の内部変数TQで7SEG LEDを駆動させるためのアウトプットqがある。
・リセットは0の時リセットされる。

VHDLのソースを載せます。
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity COUNT10 is
port(RESET,CLK : in std_logic;
Q: out std_logic_vector(3 downto 0);
C: out std_logic
);
end COUNT10;
architecture RTL of COUNT10 is
signal TQ : std_logic_vector(3 downto 0);
begin
process (RESET,CLK ) begin
if(RESET='0') then
TQ <= "0000";
C<='0';
elsif(CLK 'event and CLK ='1') then
if(TQ="1001") then
TQ <= "0000";
C <='1';
elsif(TQ="0000") then
C <='0';
TQ <= TQ + '1';
else
TQ <= TQ + '1';
end if;
end if;
Q<=TQ;
end process;
end RTL;

シミュレーション結果
クロックを数え上げた内部変数TQがqへ値を渡す仕組みになっています。
これがたち下がりの時に行われている様に見える。

「FPGAのシミュレーションに関して」の質問画像

A 回答 (1件)

Q<=TQ;


の代入文がprocess文の中に入ってるからですね。
シミュレーションでprocess文が評価(実行)されるのは、センシティビティリスト内の信号が変化したときのみです。
ですから、TQがクロック立ち上がりで変化した後、process文内が再度実行されるのはクロックの立ち下り時になります。

合成するとシミュレーションとは違ってQはクロック立ち下りに同期しないかもしれませんね。
ただ、書き方としては代入文はこのプロセス文の外でやる方がいいと思います。
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

疑問が解決した上に丁寧なアドヴァイスまでありがとうございました。

お礼日時:2011/01/07 15:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!