繁体   English   中英

为什么Quartus II将我的变量识别为信号?

[英]Why Quartus II recognizes my variable as a signal?

我是VHDL编程的新手,这是我的第一个项目-构建一个同时具有正/反向计数顺序的二进制计数器。 我的计划很简单:

  1. 编写分频器过程以获取所需的时钟频率,并将此新时钟作为位信号flag
  2. 将“标志”放入另一个进程的敏感度列表,根据正常/反向状态对其进行计数-在我的代码中存储为curr_s
  3. 第三进程接收输入的ctl信号作为敏感信号,然后切换curr_s并重置count的值-该值设置为存储我上一个进程的计数。

现在,问题是,Quartus II向我返回了错误消息:

错误(10028):在bi_counter.vhd(35)处无法解析网络“ count [31]”的多个常量驱动程序

错误(10029):bi_counter.vhd的常量驱动程序(46)

错误(10028):在bi_counter.vhd(35)处无法解析网络“ count [30]”的多个常量驱动程序

...

错误(10028):在bi_counter.vhd(35)处无法解析网络“ count [14]”的多个常量驱动程序

我用谷歌搜索了一些规则,例如不允许在多个进程中更改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;

你写了:

我用谷歌搜索了一些规则,例如不允许在多个进程中更改信号的值,但是问题是我将计数声明为共享变量而不是信号-应该不会遇到这种错误。

这个“规则”不仅使您的生活更加困难。

考虑一下您要做什么。 您正在尝试合成一些要保留在设备上的值,并试图从两个独立的进程中分配一个值(即使它们可能是相关的,并且知道它们应该如何工作,但它们仍然是独立)。 无论使用哪种语言元素-信号,变量,等等-一旦到达只有物理电路的设备,它就变得无关紧要。 也就是说,您可能没有违反任何语言规则,但是您违反了物理规则。

您的输出可以用以下形式表示:如果有某种条件,则输出某些内容,否则,如果有其他条件,则输出其他内容,等等。这可以放在单个过程中,这是我建议您执行的操作。

而且,正如罗素(Russell)所建议的那样,您可能不应该使用共享变量,尤其是像您那样绕过语言规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM