我正在尝试用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行。+可以 在这种情况下没有这样的操作数。
我已经检查了几个参考语法,发现它没有任何问题。任何人都可以指出错误的原因吗?
提前致谢!
答案 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'类型的变量。