我是VHDL编程的新手,这是我的第一个项目 - 构建一个具有常规/反向计数顺序的二进制计数器。 我的计划很简单:
flag
。curr_s
。ctl
信号作为敏感信号,然后切换curr_s
并重置count
的值 - 设置为存储我上一个进程的计数。然而,现在的问题是,Quartus II会向我返回错误消息:
错误(10028):无法解决网络"计数[31]"的多个常量驱动程序at bi_counter.vhd(35)
错误(10029):bi_counter.vhd(46)
的常量驱动程序错误(10028):无法解决网络"计数[30]"的多个常量驱动程序at bi_counter.vhd(35)
...
错误(10028):无法解决网络的多个常量驱动程序" count [14]" at bi_counter.vhd(35)
我google了一下,有些规则不允许在多个进程中更改signal
的值,但问题是我将count
声明为共享变量而不是信号 - 不应该遇到这样的错误。我打算这样做,因为我想使用count
作为变量来在进程之间交换信息 - 这是否有意义,如果没有,是否有任何解决方法?
这是我的代码:
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.numeric_std.all;
--
entity bi_counter is
port(
master_clk, ctl, rst: in std_logic;
q: out std_logic_vector(7 downto 0)
);
end bi_counter;
--
architecture behv of bi_counter is
shared variable curr_s: std_logic := '0'; -- 0 for incremental, 1 for reverse counting
shared variable count: integer := -1;
shared variable master_count: natural := 0;
signal flag: std_logic;
begin
p_freq_div: process(master_clk, rst)
begin
if rst = '0' then
master_count := 0;
elsif master_clk'event and master_clk='1' then
master_count := master_count + 1;
if master_count = 24000000 then
flag <= not flag;
master_count := 0;
end if;
end if;
end process p_freq_div;
p_count: process(flag)
begin
if curr_s = '1' then
count := count + 1;
q <= conv_std_logic_vector(count, 8);
else
count := count - 1;
q <= conv_std_logic_vector(count, 8);
end if;
end process p_count;
p_switch: process(ctl)
begin
if ctl'event and ctl='1' then
curr_s := not curr_s;
if curr_s = '0' then
count := 0;
else
count := 1000;
end if;
end if;
end process p_switch;
end behv;
答案 0 :(得分:3)
您写道:
我用google搜索了一下,有规则不允许在多个进程中更改信号的值,但问题是我将我的计数声明为共享变量而不是信号 - 这不应该遇到这样的错误。
这&#34;规则&#34;并不是为了让你的生活更加艰难。
想想你正在尝试做什么。您正在尝试合成要放置在您的设备上的某些内容,这些内容会保留一个值,您尝试从两个独立的进程分配这些内容(即使它们可能相关且您知道它们&# 39;应该工作,他们仍然是独立的)。无论你使用什么语言元素 - 信号,变量,等等 - 一旦你到达只有物理电路的设备就变得无关紧要了。也就是说,您可能没有违反任何语言规则,但是您违反了物理规则。
你的输出可以用下面的形式说明:如果是某种情况,那么输出一些东西,否则如果有其他条件,输出别的东西等等。这可以放在一个过程中,这就是我建议你做的
另外,正如Russell建议的那样,你可能不应该使用共享变量,特别是像你一样绕过语言规则。