-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;

但是当我尝试编译时,却报如下错误:

错误:HDLParsers:808 - "F:/EE4218/XQ/d_flip_flop.vhd" 第 47 行。+ 在这种情况下不能有这样的操作数。

我已经检查了几个参考的语法,并没有发现任何问题。谁能指出错误的原因?

提前致谢!

4

3 回答 3

1

布赖恩有最好的答案,无论如何都是二次幂。可以说,对于其他环绕值,您还应该使用integerforclock_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 回答