我遇到了一个问题,我不明白为什么...... 例如,我做了这样的声明:
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只运行一次?
答案 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的值提前。这只发生一次。