vhdl

2016-04-26 83 views
0

的时分(周期)选择我目前正在做一个VHDL项目,其中有一个计数器需要在100ms或1000ms内更新,如果按下一个键。vhdl

例子:

If Key3=0 then 
c=c+1 (100ms) 
elsif key3=1 then 
c=c+1 (1000ms) 

我想知道如何做到这一点的VHDL。

我相信我应该使用一个进程(时钟,Key3),但我不知道如何使计数器增加基于期限。

在此先感谢!

回答

1

我认为你是有一部分的方式:

我相信我应该用一个过程(时钟,密钥3)但我不知道如何使基于周期计数器增加。

将问题看作是数字设计问题,而不是编码问题。在真实的数字系统中,你会用什么来衡量时间的流逝?从那里使用这个参数来确定100ms还是1000ms已经过去。

一旦你可以测量时间,你如何确定一个特定的事件正在进行多久?

0

如果c的类型是时间的变量(一个过程),那么

if some_condition then 
    c := c + 100 ms; 
else 
    c := c + 1000 ms; 
end if; 

是有效的VHDL,并且将在模拟工作,虽然时间不是很顺利支持的合成。

最简单的解决方案是让C以时间步长(如多个时钟周期)进行计数,并添加其中的1个或10个。

例如,如果你有一个10MHz的时钟:

constant Clock_Period : time := 100 ns; 

constant ms_100 : natural := 100 ms/Clock_Period; 
constant ms_1000 : natural := 1000 ms/Clock_Period; 
signal c : natural; 
... 

    if some_condition then 
     c <= c + ms_100; 
    else 
     c := c + ms_1000; 
    end if; 

如果你改变时钟频率,调整clock_period声明相匹配。

+0

我们最近遇到了Vivado关于基于'time'类型生成常量和范围的问题。正如你上面所描述的那样,这完全优化到无。赛灵思承认,不支持'time'类型的对象。请参阅AR57964(http://www.xilinx.com/support/answers/57964.html) – PlayDough

+0

@PlayDough您链接的AR指示类型Time在Vivado中受支持,但效果不佳。因此,赛灵思对Vivado用户“不推荐”这种技术(也许他们在使用64位时使用32位算术???),而且Synplicity还存在其他问题。但在最高级别上最清楚地表示代码应该是正常的做法;在工具支持不足的情况下偏离它。 –

+0

够公平的。时间被支持 - 很差。但正如你指出的那样,我们受到我们使用的工具的限制。我们所做的是类似于:'constant Clock_Period:real:= 100.0e-9;'支持真正的值。 – PlayDough