我被分配了使用VDHL创建转速计来编程设备的任务。我已经提供了一个引脚,输入信号将连接到该引脚,并且需要显示每秒发生的频率(频率)。以前只用VHDL编程了几次,我很难搞清楚如何实现代码:
到目前为止,我已经构建了设备需要采取的以下步骤
我这样做是通过创建一个依赖于input_singal的进程,并在input_signal中存在一个高位时递增一个变量
counthigh:process(input_signal) -- CountHigh process
begin
if (input signal = '1') then
current_count := current_count+1;
end if;
end process; -- End process
我不确定如何使用VHDL完成此操作。我提供了一个先前代码的过程,我用它来实现状态机。 c_clk是一个工作在5MHz / 1024(使用定时器div常数)的时钟,意味着周期等于2.048 * 10 ^ -4秒。所以每个上升沿之间的时间等于那个。
我想要做的是等待一定量的rising_edges(我想我可以定义另一个变量并等待它的倍数来更新显示并重置current_count变量)。
statereset:process -- StateReset process
begin
wait until rising_edge(c_clk); -- On each rising edge
if (reset='0') then
current_s <= s0; -- Default state on reset.
else
current_s <= next_s; -- Update the current state
end if;
end process; -- End process
从以前的代码中我已经有了一个名为SevenSeg的实体,我可以通过基本的数学来操作它来显示信号的当前频率。
我只想检查一下,通过使counthigh过程依赖于输入信号,过程将等待&#39;直到下一个std_logic_vector可用并读取,而不是多次从input_signal计数一个高。我是否能够等到一个进程中有一个rising_edge(input_singal),同时使另一个进程依赖于时钟速率?
如果有人有任何想法或反馈,我们将不胜感激。我知道我在问一个非常广泛和开放式的问题,但我想弄清楚如何完成这项任务。
干杯,NZBRU。
答案 0 :(得分:1)
counthigh:process(input_signal) -- CountHigh process
begin
if (input signal = '1') then
current_count := current_count+1;
end if;
end process; -- End process
我理解你想要实现的目标,但它不会起作用。在模拟中,每次input_signal
变高或变低都会计算,这很好,但这段代码不会合成。
计数器需要时钟,带时钟的进程需要rising_edge
。我希望你的输入频率低于你的工作时钟,所以我建议你使用一个使用你的时钟运行的边缘检测器。我将把它留作练习,但是here's a good reference。
等待1秒或其他任何事情,请使用计数器。如果您的时钟是5MHz,请使用一个从0到4_999_999的信号。当计数器为4_999_999时,重置计数器,边缘检测器并更新显示器。
顺便说一下,既然是初学者,请尝试使用信号而不是变量。变量与编程语言具有相似的行为,但在合成中使用它们时会遇到很多陷阱。对于初学者,我建议坚持使用信号,一旦你习惯了它们并且对VHDL的工作原理有所了解,你就可以回到使用变量了。在我自己的综合设计中,我有95%的信号,这是FPGA设计人员的标准。