
VHDL 2008のソースリストを読んでいるところですが、以下のプログラムの意味がわからないので教えて下さい。50MHzのクロックから1MHのクロックい分周する回路の一部です。
CLK_WIDTH は分周比50という値を示す5ビットの定数(?)です。
C言語なら理解できるので、C言語で書き直す(?)としたらどのようなコードに対応するのでしょうか?
具体的には、cnt <= (others => '0');で cnt にどんな値が代入されるのでしょう?
なお、
<= はコンカレント代入文
:= はシーケンシャル代入文
といった違いは理解しています。
よろしくお願いします
process( S_AXI_ACLK ) is
begin
if (rising_edge (S_AXI_ACLK)) then
if ( S_AXI_ARESETN = '0' ) then
cnt <= (others => '0');
div <= (others => '0');
else
if ( div = CLK_WIDTH ) then
div <= (others => '0');
cnt <= cnt + 1;
else
div <= div + 1;
end if;
No.1ベストアンサー
- 回答日時:
私はほとんどVerilogしか使わないので、VHDLにそれほど詳しいわけではないけど、この場合のOthersはその名の通り「その他」の意味です。
あなたのコードではわかりにくいので、別の例を出すと以下の文はすべて同じことです。
cnt <= ( 4=>'1', 3 down to 1=>'0', 0=>'1');
cnt <= '10001';
cnt <= (4=>'1', 0=>'1', others=>'0');
これを見ればわかるけど、5ビットのcntがあって、明確に値が与えられている要素(indexが0と4の要素)以外のインデックスがothersと表現されます。
であなたのコードではcntのどの要素にも明示的に値が与えられていないので、others=>'0'ですべてのビットに0が与えられる、つまりカウンタの全ビットが0に初期化されているということです。
VHDLのようなハードウェア記述言語はその性格上すべてがビット単位で処理されます。だからカウンター値でもわざわざ5ビットの配列にしなければならないのだけど、Cは高級言語なので同じことをするのなら単に、
int cnt = 0;
でいいと思います。
ありがとうございます
>Cは高級言語なので同じことをするのなら単に、
>int cnt = 0;
>でいいと思います。
なるほど。 (others => '0')は、(変数のビット数に関係なく)全ビットが0という意味ですね、
ということは、
signal cnt : std_logic_vector(7 downto 0); -- 0 ~ 256 @ 1MHz
signal div : std_logic_vector(5 downto 0); -- 0 ~ DIV(49)
と宣言されているので、
cnt <= (others => '0');
div <= (others => '0');
は
cnt <= '00000000';
div <= '000000';
ということですね。
No.2
- 回答日時:
件のコードをCで置き換えるなら...
クロック(S_AXI_ACLK)の立ち上がりをどうC言語で表現するかはこれだけではなんといえないので端折るけど、if文内でやっていることは以下のような感じです。
if(S_AXI_ARESETN == 0) {
cnt = 0;
div = 0;
}
else {
if(div == CLK_WIDTH) {
div = 0;
cnt++;
}
else {
div++;
}
}
divは、それが50に達したら0にリセットされるフリーランニングのカウンタで、cntはクロックのカウント数が50, 100, 150, 200、....と50の倍数になるたびにカウントアップされる。
再度の回答ありがとうございます
C言語にするとよく理解できますね。
ようするに、
S_AXI_ARESETNがリセット信号で
クロック(S_AXI_ACLK)の立ち上がりで6ビットの内部カウンタdivをカウントアップ
50クロック毎に、8ビットの外部カウンタ cnt をカウントアップ
ということですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
質問です。 新規登録ボタンが全...
-
含む含まないという概念自体の...
-
htmlのolやulなどlistにtitleや...
-
画像にリンクを張ると画像がず...
-
【ヒトの神秘】美男美女から何...
-
縦長広告をウェブページの右側...
-
header部分とnaviの位置の調整...
-
改行ほどは行かないけど、若干...
-
webのナビメニューで、どうして...
-
質問1.
-
指定したborderの一部が表示さ...
-
ホームページ作成ソフトKompoZe...
-
htmlで画像を2個ずつ並べていき...
-
複数の画像にメニュー表示させたい
-
番号付きリスト(<Ol><Li>・・...
-
zoomについて質問です。
-
ulタグやliタグの中でbrタグ...
-
tdに対してmin-heightの定義、...
-
html の divとtable の役割
-
floatを適用したdiv内部にあるp...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
cnt <= (others => '0'); の意...
-
ASP.NETでプレーンなページに文...
-
pythonでのカーソル移動がずれる
-
質問です。 新規登録ボタンが全...
-
VBScriptでWebページの"hogehog...
-
vbaでieを操作しようとしていま...
-
VBAでの素数の求め方
-
css リンクの色が全部変わって...
-
Excel VBAでのIE操作でクリック...
-
プログラマーの方に質問です。 ...
-
htmlを組んでいるのですが、DIV...
-
VBA : QueryTableでのスクレイ...
-
検索結果がツリー状に表示され...
-
正規表現
-
RubyのHTMLパーサーで複数のタ...
-
入れ子になっているhtmlのXPath...
-
CSSでの2段組レイアウトでdiv#c...
-
行頭から全角で3文字位さげた...
-
chromedriverのver-upで動作不...
-
秀丸で複数行コメントアウトを...
おすすめ情報