-1

VHDL で D フリップフロップに 1Hz クロックを実装しようとしています。

以下は私のコードです:

entity d_flip_flop is
    Port ( clk : in  STD_LOGIC;
           D : in  STD_LOGIC;
           Q : out  STD_LOGIC);
end d_flip_flop;

architecture Behavioral of d_flip_flop is
signal clk_div: std_logic; --divided clock
begin

--process to divide clock
clk_divider: process(clk) --clk is the clock port
variable clk_count: std_logic_vector(25 downto 0) := (others => '0');
begin
    if clk'event and clk = '1' then
        clk_count <= clk_count+1;
        clk_div <= clk_count(25);
    end if;
end process;

--main process  
main:process(clk_div)
    begin
        if clk'event and clk = '1' then
            Q <= D;
        end if;
end process;


end Behavioral;

しかし、コンパイルしようとすると、次のエラーが報告されます。

ERROR:HDLParsers:808 - "F:/EE4218/XQ/d_flip_flop.vhd" 47 行目。+ このコンテキストでは、このようなオペランドを使用できません。

構文についていくつかのリファレンスを確認しましたが、問題はありませんでした。誰でもエラーの原因を指摘できますか?

前もって感謝します!

4

3 に答える 3

1

とにかく、2 の累乗については、Brian が最良の答えを持っています。おそらく、他のラップアラウンド値については、integerforを使用しclock_countてラップする必要があります。

signal clk_div : std_logic := '0';

clk_divider: process(clk) --clk is the clock port
subtype t_clk_count: integer range 0 to 12345678; -- for example
variable clk_count: t_clk_count := 0;
begin
    if clk'event and clk = '1' then
        if clk_count+1 >= t_clk_count'high then
           clk_div <= not clk_div;
           clk_count <= 0;
        else
            clk_count <= clk_count+1;
        end if;
    end if;
end process;
于 2013-02-05T14:36:30.670 に答える
1

clk_count は、ビットのバッグではなく、数値を表すために使用されています。

したがって、型システムと戦うのではなく、型システムを使用し、数値または少なくとも何らかの数値型として宣言してください。

この目的に最適なツールは、そこから少し抽出する必要があるため、numeric_std.unsigned です。

したがって、句use ieee.numeric_std.all;の後に追加して、次のように宣言しますlibrary ieee;

variable clk_count: unsigned(25 downto 0) := (others => '0');

これで完了です。

于 2013-02-03T11:21:13.253 に答える
-1

プロセスclk_dividerで、次の行を変更します。

clk_count <= clk_count +1;

clk_count := std_logic_vector(UNSIGNED(clk_count) + 1);

これは、clk_countが「std_logic_vector」型の変数として定義されているためです。

于 2013-02-03T08:57:42.163 に答える