web-dev-qa-db-ja.com

デザインをVHDLで登録

VHDLで1ビットおよび32ビットレジスタを設計する際に問題が発生しました。レジスタの主な入力には、クロック(clk)、クリア(clr)、ロード/イネーブル(ld)信号、およびnビットデータ(d)が含まれます。 nビット出力は(q)で表されます。これまでのところ、1ビットのレジスタを作成したと思います。これが私のコードです。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY register32 IS
PORT(
d : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- input.
ld : IN STD_LOGIC; -- load/enable.
clr : IN STD_LOGIC; -- async. clear.
clk : IN STD_LOGIC; -- clock.
q : OUT STD_LOGIC; -- output.
END register32;
ARCHITECTURE description OF register32 IS

BEGIN

 process(clk, clr, ld)
   begin
      if clr = '1' then 
         q <= '0';
      elsif d = '1' and ld = 1 and clk'event and clk='1' then
         q <= '1';
      elsif d = '0' and ld = 1 and clk'event and clk='1' then
         q <= '0';
      else
         q <= '0';
      end if;
   end process;
END description;

これが1ビットレジスタに対して正しい場合、どのようにして32ビットレジスタにするのでしょうか。いくつかの助けをいただければ幸いです。

4
user3275865

それでは、最初にコードのいくつかの問題を見てみましょう。

  • 32ビットの入力と1ビットの出力がありますが、おそらくそれは単なる偶然です。
  • レジスターをリセットしておらず、rising_Edgeを使用していない場合は、無条件に出力を_'0'_に設定します。これはレジスターのモデリングではないので、削除しましょう。
  • 適切なタイミングでdqに割り当てるだけで、内部ロジックを簡素化することもできます。 (これにより、32ビットロジックもはるかに単純になります)。
  • _clk'event and clk='1'_はrising_Edge(clk)と書くことができます。
  • ポート宣言にはいくつかの小さな構文の問題があります。最後のメンバーはセミコロンで終わっておらず、ポート宣言自体は_);_で終わっていることに注意してください。

したがって、これにより、1ビットのレジスタが必要になります。

_ENTITY register1 IS PORT(
    d   : IN STD_LOGIC;
    ld  : IN STD_LOGIC; -- load/enable.
    clr : IN STD_LOGIC; -- async. clear.
    clk : IN STD_LOGIC; -- clock.
    q   : OUT STD_LOGIC -- output.
);
END register1;

ARCHITECTURE description OF register1 IS

BEGIN
    process(clk, clr)
    begin
        if clr = '1' then
            q <= '0';
        elsif rising_Edge(clk) then
            if ld = '1' then
                q <= d;
            end if;
        end if;
    end process;
END description;
_

そして、これを32ビットに拡張したい場合:

_ENTITY register32 IS PORT(
    d   : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
    ld  : IN STD_LOGIC; -- load/enable.
    clr : IN STD_LOGIC; -- async. clear.
    clk : IN STD_LOGIC; -- clock.
    q   : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) -- output
);
END register32;

ARCHITECTURE description OF register32 IS

BEGIN
    process(clk, clr)
    begin
        if clr = '1' then
            q <= x"00000000";
        elsif rising_Edge(clk) then
            if ld = '1' then
                q <= d;
            end if;
        end if;
    end process;
END description;
_
18
Bill Lynch