【问题标题】:Creating a tachometer in VDHL在 VHDL 中创建转速计
【发布时间】:2026-02-10 03:15:02
【问题描述】:

我被分配了使用 VDHL 创建转速计以对设备进行编程的任务。我已经获得了将连接输入信号的引脚,并且需要显示每秒发生的频率(频率)。以前只用 VHDL 编程过几次,我很难弄清楚如何实现代码:

到目前为止,我已经构建了设备需要采取的以下步骤

  1. 通过创建一个依赖于它的进程来计算输入信号中的逻辑值

我通过创建一个依赖于 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
  1. 在设定的时间后停止计数并使用 input_signal 的频率更新显示

我不确定如何使用 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 进程依赖于输入信号,该进程将“等待”直到下一个 std_logic_vector 可用并读取它,而不是从 input_signal 中多次计数高。我是否可以等到一个进程中出现上升沿(input_singal),同时让另一个进程依赖于时钟频率?

如果有人有任何想法或反馈,我们将不胜感激。我知道我在问一个非常广泛和开放式的问题,但我正在尝试弄清楚如何完成这项任务。

干杯,NZBRU。

【问题讨论】:

  • 这是学校作业吗?
  • 每周大学实验室(VHDL简介)
  • input_signal 的 Fmax 是多少?如果它比 c_clk 慢得多,您可以将其同步到 c_clk 并使用您当前的方法。否则,您将需要计入 2 个时钟域。这需要跨时钟电路来交换信号,例如从 1 秒定时器到频率计数器的启动/停止。
  • this 这样的互联网搜索是一个不错的起点,您可以找到这篇论文:FPGA Implementation of a Digital Tachometer

标签: vhdl


【解决方案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 设计人员的标准。

【讨论】: