首先,我很抱歉打扰你们这个非常棒的问题,但我对我的(ModelSim模拟)电路发生的事情没有任何意义。
这是我的代码,简单可以:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
ENTITY Counter IS
PORT(
enable : in std_logic;
clk : in std_logic;
count : out integer range 0 to 255);
END Counter;
ARCHITECTURE LogicFunction OF Counter IS
signal count_i : integer range 0 to 255;
begin
cnt : process(clk, enable, count_i)
begin
count <= count_i;
if (enable = '0') then
count_i <= 0;
else
count_i <= count_i + 1;
end if;
end process;
end LogicFunction;
我的问题是:当我使用ModelSim执行时序仿真时,使用时钟信号,&#34;启用&#34;是第一个&#39; 0&#39;然后&#39; 1&#39;,输出(&#34; count&#34;)始终保持为零。我尝试了很多不同的东西,比如设置&#34; count&#34;作为一个向量,做各种各样的演员,但它仍然保持不变。
增量&#34; count_i&lt; = count_i + 1;&#34;似乎是问题所在:我试图用&#34; count_i&lt; = 55&#34;之类的东西替换它,然后输出改变(到前一个例子中的&#34; 55&#34;)。 p>
我已经在该网页上的代码中看到了完全相同的增量,例如: http://surf-vhdl.com/how-to-connect-serial-adc-fpga/ 我创建了一个项目,模拟了它......它的工作原理!我真的没有得到那个我没做过的事情,除了一堆&#34; if&#34;在我的代码中我不需要。
非常感谢任何帮助,我花了3个小时的试用和错误......
提前Thanx!
答案 0 :(得分:1)
除了不使用时钟边沿递增i_count之外,你还使用了enable作为clear,因为它既在敏感列表中,又在if语句条件中遇到。
library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
entity counter is
port(
enable : in std_logic;
clk : in std_logic;
count : out integer range 0 to 255);
end counter;
architecture logicfunction of counter is
signal count_i : integer range 0 to 255;
begin
cnt : process (clk) -- (clk, enable, count_i)
begin
-- count <= count_i; -- MOVED
-- if (enable = '0') then -- REWRITTEN
-- count_i <= 0;
-- else
-- count_i <= count_i + 1;
-- end if;
if rising_edge(clk) then
if enable = '1' then
count_i <= count_i + 1;
end if;
end if;
end process;
count <= count_i; -- MOVED TO HERE
end architecture logicfunction;
您的代码被修改为使用clk的上升沿,并且在i_count增量之前需要enable ='1'。引用包numeric_std的多余use子句已被注释掉。您正在执行的唯一数字操作是整数,这些运算符是在包标准中预定义的。
请注意,替换if语句不会用括号括起它的条件。这不是一种编程语言,也不需要它们。
计数分配被移动到并发信号分配。这样就无需在灵敏度列表中使用i_count来更新计数。
投入测试平台以完成Miminal Complete and Verifiable Example:
library ieee;
use ieee.std_logic_1164.all;
entity counter_tb is
end entity;
architecture foo of counter_tb is
signal enable: std_logic := '0';
signal clk: std_logic := '0';
signal count: integer range 0 to 255;
begin
DUT:
entity work.counter
port map (
enable => enable,
clk => clk,
count => count
);
CLOCK:
process
begin
wait for 5 ns; -- 1/2 clock period
clk <= not clk;
if now > 540 ns then
wait;
end if;
end process;
STIMULUS:
process
begin
wait for 30 ns;
enable <= '1';
wait for 60 ns;
enable <= '0';
wait for 30 ns;
enable <= '1';
wait;
end process;
end architecture;
这就是:
这表明当enable为'0'时,计数器不会计数,也不会使enable ='0'重置i_count的值。
Quartus II手册第1卷设计与综合没有给出使用时钟边沿和没有异步清零或加载信号的使能的示例。
这里的秘密是使用时钟边沿指定的if语句条件内的任何内容都将与时钟同步。外面的任何条件都是异步的。
符合条件的合成顺序逻辑的形式源自现已撤销的IEEE Std 1076.6-2004 IEEE VHDL寄存器标准 转移水平(RTL)合成。使用这些行为描述可以保证您可以通过与模拟匹配的合成来生成硬件。