プロが教える店舗&オフィスのセキュリティ対策術

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;

A 回答 (2件)

私はほとんど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;
でいいと思います。
    • good
    • 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';
ということですね。

お礼日時:2021/07/25 17:16

件のコードを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の倍数になるたびにカウントアップされる。
    • good
    • 0
この回答へのお礼

再度の回答ありがとうございます

C言語にするとよく理解できますね。
ようするに、
 S_AXI_ARESETNがリセット信号で
 クロック(S_AXI_ACLK)の立ち上がりで6ビットの内部カウンタdivをカウントアップ
 50クロック毎に、8ビットの外部カウンタ cnt をカウントアップ
ということですね。

お礼日時:2021/07/25 17:16

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