VHDL,使用两个变量来计算的问题

时间:2015-01-26 23:15:17

标签: vhdl

我遇到了一个问题,我不明白为什么...... 例如,我做了这样的声明:

variable compteur1,compteur2 : natural range 0 to 15;
process(H)
begin
    if(rising_edge(H)) then
        compteur1 := compteur1 + 1;
        if (compteur1 = 9) then
            compteur2 := compteur2 + 1;
        end if;
    end if;
end process;

为什么compteur1只运行0到15,而compteur2只运行一次?

2 个答案:

答案 0 :(得分:1)

有一些事情是错的,凯文提到的翻滚,名字中有一些拼写错误:

此:

package compt is
    shared variable compteur1,compteur2 : natural range 0 to 15;
end package;

library ieee;
use ieee.std_logic_1164.all;
use work.compt.all;

entity foo is
end entity;

architecture fum of foo is
    signal H: std_logic := '0';
begin

CLOCK:
    process
    begin
        wait for 10 ns;
        H <= not H;
        if Now > 600 ns then
            wait;
        end if;
    end process;

UNLABELLED:
    process(H)
    begin
        if(rising_edge(H)) then
            compteur1 := compteur1 + 1;
            report "compteur1 = " & natural'image(compteur1);
            if (compteur1 = 9) then
                compteur2 := compteur2 + 1;
                report "compteur2 = " & natural'image(compteur2);
            end if;
        end if;
    end process;
end architecture;

给出运行时错误,因为你将compteur1增加到超出它的范围:

  

compteur.vhdl:31:13:@ 10ns :(报告说明):compteur1 = 1
  compteur.vhdl:31:13:@ 30ns :(报告说明):compteur1 = 2
  compteur.vhdl:31:13:@ 50ns :(报告说明):compteur1 = 3
  compteur.vhdl:31:13:@ 70ns :(报告说明):compteur1 = 4
  compteur.vhdl:31:13:@ 90ns :(报告说明):compteur1 = 5
  compteur.vhdl:31:13:@ 110ns :(报告说明):compteur1 = 6
  compteur.vhdl:31:13:@ 130ns :(报告说明):compteur1 = 7
  compteur.vhdl:31:13:@ 150ns :(报告说明):compteur1 = 8
  compteur.vhdl:31:13:@ 170ns :(报告说明):compteur1 = 9
  compteur.vhdl:34:17:@ 170ns :(报告说明):compteur2 = 1
  compteur.vhdl:31:13:@ 190ns :(报告说明):compteur1 = 10
  compteur.vhdl:31:13:@ 210ns :(报告说明):compteur1 = 11
  compteur.vhdl:31:13:@ 230ns :(报告说明):compteur1 = 12
  compteur.vhdl:31:13:@ 250ns :(报告说明):compteur1 = 13
  compteur.vhdl:31:13:@ 270ns :(报告说明):compteur1 = 14
  compteur.vhdl:31:13:@ 290ns :(报告说明):compteur1 = 15
  ./foo:error:copteur.vhdl中的绑定检查失败:30
  ./foo:error:模拟失败了   ghdl:编译错误

由于VHDL没有模块化整数类型,并且您使用共享变量,因此您可以测试增量的位置:

UNLABELLED:
    process(H)
    begin
        if(rising_edge(H)) then
            if compteur1 = 15 then
                compteur1 := 0;
            else
                compteur1 := compteur1 + 1;
            end if;
            report "compteur1 = " & natural'image(compteur1);
            if (compteur1 = 9) then
                compteur2 := compteur2 + 1;
                report "compteur2 = " & natural'image(compteur2);
            end if;
        end if;
    end process;

这将在compteur2上给你多个增量:

  

compteur.vhdl:35:13:@ 10ns :(报告说明):compteur1 = 1
  compteur.vhdl:35:13:@ 30ns :(报告说明):compteur1 = 2
  compteur.vhdl:35:13:@ 50ns :(报告说明):compteur1 = 3
  compteur.vhdl:35:13:@ 70ns :(报告说明):compteur1 = 4
  compteur.vhdl:35:13:@ 90ns :(报告说明):compteur1 = 5
  compteur.vhdl:35:13:@ 110ns :(报告说明):compteur1 = 6
  compteur.vhdl:35:13:@ 130ns :(报告说明):compteur1 = 7
  compteur.vhdl:35:13:@ 150ns :(报告说明):compteur1 = 8
  compteur.vhdl:35:13:@ 170ns :(报告说明):compteur1 = 9
  compteur.vhdl:38:17:@ 170ns :(报告说明):compteur2 = 1
  compteur.vhdl:35:13:@ 190ns :(报告说明):compteur1 = 10
  compteur.vhdl:35:13:@ 210ns :(报告说明):compteur1 = 11
  compteur.vhdl:35:13:@ 230ns :(报告说明):compteur1 = 12
  compteur.vhdl:35:13:@ 250ns :(报告说明):compteur1 = 13
  compteur.vhdl:35:13:@ 270ns :(报告说明):compteur1 = 14
  compteur.vhdl:35:13:@ 290ns :(报告说明):compteur1 = 15
  compteur.vhdl:35:13:@ 310ns :(报告说明):compteur1 = 0
  compteur.vhdl:35:13:@ 330ns :(报告说明):compteur1 = 1
  compteur.vhdl:35:13:@ 350ns :(报告说明):compteur1 = 2
  compteur.vhdl:35:13:@ 370ns :(报告说明):compteur1 = 3
  compteur.vhdl:35:13:@ 390ns :(报告说明):compteur1 = 4
  compteur.vhdl:35:13:@ 410ns :(报告说明):compteur1 = 5
  compteur.vhdl:35:13:@ 430ns :(报告说明):compteur1 = 6
  compteur.vhdl:35:13:@ 450ns :(报告说明):compteur1 = 7
  compteur.vhdl:35:13:@ 470ns :(报告说明):compteur1 = 8
  compteur.vhdl:35:13:@ 490ns :(报告说明):compteur1 = 9
  compteur.vhdl:38:17:@ 490ns :(报告说明):compteur2 = 2
  compteur.vhdl:35:13:@ 510ns :(报告说明):compteur1 = 10
  compteur.vhdl:35:13:@ 530ns :(报告说明):compteur1 = 11
  compteur.vhdl:35:13:@ 550ns :(报告说明):compteur1 = 12
  compteur.vhdl:35:13:@ 570ns :(报告说明):compteur1 = 13
  compteur.vhdl:35:13:@ 590ns :(报告说明):compteur1 = 14
  compteur.vhdl:35:13:@ 610ns :(报告说明):compteur1 = 15

并且正常退出(请参阅CLOCK过程中的if语句)。

在查看时间戳时,您还会看到compteur1在同一边缘上变为9,这是由使用变量引起的compteur2增量。

使用变量时,您可以考虑在递增之前进行评估:

UNLABELLED:
    process(H)
    begin
        if(rising_edge(H)) then
            if (compteur1 = 9) then
                compteur2 := compteur2 + 1;
                report "compteur2 = " & natural'image(compteur2);
            end if;
            if compteur1 = 15 then
                compteur1 := 0;
            else
                compteur1 := compteur1 + 1;
            end if;
            report "compteur1 = " & natural'image(compteur1);
        end if;
    end process;

这将与您使用信号的顺序相匹配:

  

compteur.vhdl:39:13:@ 490ns :(报告说明):compteur1 = 9
  compteur.vhdl:32:17:@ 510ns :(报告说明):compteur2 = 2
  compteur.vhdl:39:13:@ 510ns :(报告说明):compteur1 = 10
  compteur.vhdl:39:13:@ 530ns :(报告说明):compteur1 = 11

在下一个时钟边沿递增compteur2。

正如QuantumRipple指出

如果您只是回答问题而不是提供完整的解决方案,那么您可能会错过一些东西。在这种情况下,翻转对comptuer2的影响,可以通过对它做同样的事情来解决:

    process(H)
    begin
        if rising_edge(H) then
            if compteur1 = 9 then
                if compteur2 = 15 then
                    compteur2 := 0;
                else  
                    compteur2 := compteur2 + 1;
                end if;
                report "compteur2 = " & natural'image(compteur2);
            end if;
            if compteur1 = 15 then
                compteur1 := 0;
            else
                compteur1 := compteur1 + 1;
            end if;
            report "compteur1 = " & natural'image(compteur1);
        end if;
    end process;

在问题的原始代码中,至少有一个其他特性可以立即浮现在脑海中。计数器变量都不涉及信号分配,其中表示合成不会产生硬件。

答案 1 :(得分:0)

因为你有一个声明说当computer1 = 9时,然后使计算机2的值提前。这只发生一次。