D FlipFlop VHDL的1Hz时钟

时间:2013-02-03 07:30:33

标签: syntax compiler-errors vhdl

我正在尝试用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行。+可以   在这种情况下没有这样的操作数。

我已经检查了几个参考语法,发现它没有任何问题。任何人都可以指出错误的原因吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

clk_count用于表示数字,而不是一包比特。

因此,请使用类型系统而不是对抗它,并将其声明为数字或至少是某种数字类型。

为此目的的最佳工具,因为你需要从中提取一点,是numeric_std.unsigned。

所以在use ieee.numeric_std.all;子句之后添加library ieee;,将其声明为

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

你已经完成了。

答案 1 :(得分:1)

无论如何,布莱恩有最好的答案,对于二人权力。可以说,对于其他环绕值,您还应该使用integer 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;

答案 2 :(得分:-1)

在过程中 clk_divider 修改以下行:

clk_count <= clk_count +1;

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

这是因为 clk_count 被定义为'std_logic_vector'类型的变量