Process vhdl中的时分(周期)选择

Process vhdl中的时分(周期)选择,process,case,vhdl,clock,period,Process,Case,Vhdl,Clock,Period,我目前正在用VHDL做一个项目,在这个项目中,我有一个计数器,如果按下一个键,它需要在100毫秒或1000毫秒内更新 例如: If Key3=0 then c=c+1 (100ms) elsif key3=1 then c=c+1 (1000ms) 我想知道如何用VHDL实现它 我认为我应该使用一个进程(时钟,键3),但我不确定如何使计数器根据周期增加 提前谢谢 我想你已经做到了: 我认为我应该使用一个进程(时钟,键3),但我不确定如何使计数器根据周期增加 把这个问题看作是数字设计问题,而

我目前正在用VHDL做一个项目,在这个项目中,我有一个计数器,如果按下一个键,它需要在100毫秒或1000毫秒内更新

例如:

If Key3=0 then
 c=c+1 (100ms)
elsif key3=1 then
 c=c+1 (1000ms)
我想知道如何用VHDL实现它

我认为我应该使用一个进程(时钟,键3),但我不确定如何使计数器根据周期增加


提前谢谢

我想你已经做到了:

我认为我应该使用一个进程(时钟,键3),但我不确定如何使计数器根据周期增加

把这个问题看作是数字设计问题,而不是编码问题。在真正的数字系统中,你会用什么来测量时间的流逝?以此作为参考,确定是否通过了100ms或1000ms


一旦你可以测量时间,你如何确定一个特定事件的过程有多长?

我想你已经做到了:

我认为我应该使用一个进程(时钟,键3),但我不确定如何使计数器根据周期增加

把这个问题看作是数字设计问题,而不是编码问题。在真正的数字系统中,你会用什么来测量时间的流逝?以此作为参考,确定是否通过了100ms或1000ms


一旦你可以测量时间,你如何确定一个特定的事件在过程中有多长时间?

如果
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;
恒定时钟周期:时间:=100ns;
常数ms_100:自然:=100 ms/时钟周期;
常数ms_1000:自然:=1000 ms/时钟周期;
信号c:自然;
...
如果有什么条件的话

c如果
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;
恒定时钟周期:时间:=100ns;
常数ms_100:自然:=100 ms/时钟周期;
常数ms_1000:自然:=1000 ms/时钟周期;
信号c:自然;
...
如果有什么条件的话

c最近,我们遇到了一个与Vivado有关的问题,即基于
时间
类型生成常量和范围。如上所述,这将完全优化为零。Xilinx承认不支持
time
类型的对象。请参阅AR57964()@playmough。您链接的AR表示Vivado中支持类型时间,但支持程度很低。因此,Xilinx“不推荐”Vivado用户使用这种技术(当其他用户使用64位算法时,他们可能使用32位算法),并且Synplicity还有其他问题。但在最高层次上最清晰地表达代码应该是正常的做法;在工具支持不足的情况下偏离it。这很公平。时间是被支持的——很差。但正如你所指出的,我们受到我们使用的工具的限制。我们所做的是:
恒定时钟周期:real:=100.0e-9真实值可以很好地支持。@playmough:忘了说,谢谢你向Vivado报告这个问题,这是很有价值的信息。也有可能(可能?)将时间与实数正确混合,而时间和整数会受到32位(以飞秒计)的限制。但是我还没有测试…我们最近在Vivado中遇到了一个问题,关于基于
time
类型生成常量和范围。如上所述,这将完全优化为零。Xilinx承认不支持
time
类型的对象。请参阅AR57964()@playmough。您链接的AR表示Vivado中支持类型时间,但支持程度很低。因此,Xilinx“不推荐”Vivado用户使用这种技术(当其他用户使用64位算法时,他们可能使用32位算法),并且Synplicity还有其他问题。但在最高层次上最清晰地表达代码应该是正常的做法;在工具支持不足的情况下偏离it。这很公平。时间是被支持的——很差。但正如你所指出的,我们受到我们使用的工具的限制。我们所做的是:
恒定时钟周期:real:=100.0e-9真实值可以很好地支持。@playmough:忘了说,谢谢你向Vivado报告这个问题,这是很有价值的信息。也有可能(可能?)将时间与实数正确混合,而时间和整数会受到32位(以飞秒计)的限制。但我还没有测试。。。