【发布时间】:2026-02-10 03:15:02
【问题描述】:
我被分配了使用 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
- 在设定的时间后停止计数并使用 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