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

时间:2014-12-08 17:53:53

标签: vhdl quartus

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

  1. 写一个分频器进程以获取所需的时钟频率,并将此新时钟输出为位信号flag
  2. Put" flag"到另一个进程的敏感性列表,根据常规/反向状态计数 - 在我的代码中存储为curr_s
  3. 第三个进程接收输入ctl信号作为敏感信号,然后切换curr_s并重置count的值 - 设置为存储我上一个进程的计数。
  4. 然而,现在的问题是,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;
    

1 个答案:

答案 0 :(得分:3)

您写道:

  

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

这&#34;规则&#34;并不是为了让你的生活更加艰难。

想想你正在尝试做什么。您正在尝试合成要放置在您的设备上的某些内容,这些内容会保留一个值,您尝试从两个独立的进程分配这些内容(即使它们可能相关且知道它们&# 39;应该工作,他们仍然是独立的)。无论你使用什么语言元素 - 信号,变量,等等 - 一旦你到达只有物理电路的设备就变得无关紧要了。也就是说,您可能没有违反任何语言规则,但是您违反了物理规则。

你的输出可以用下面的形式说明:如果是某种情况,那么输出一些东西,否则如果有其他条件,输出别的东西等等。这可以放在一个过程中,这就是我建议你做的

另外,正如Russell建议的那样,你可能不应该使用共享变量,特别是像你一样绕过语言规则。