我被分配了使用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
- 在设定的时间后停止计数,并使用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计数高 . 我是否能够等到一个进程中有一个rising_edge(input_singal),同时使另一个进程依赖于时钟速率?
如果有人有任何想法或反馈,将不胜感激 . 我知道我在问一个非常广泛和开放式的问题,但我想弄清楚如何完成这项任务 .
干杯,NZBRU .
1 回答
我理解你想要实现的目标,但它不会起作用 . 在模拟中,它会在每次
input_signal
变为高或低时计数,这很好,但此代码不会合成 .计数器需要时钟,带时钟的进程需要
rising_edge
. 我希望你的输入频率低于你的工作时钟,所以我建议你使用一个使用你的时钟运行的边缘检测器 . 我会把它留作练习,但是here's a good reference .要等待1秒钟或其他任何事情,请使用计数器 . 如果您的时钟是5MHz,请使用一个从0到4_999_999的信号 . 当计数器为4_999_999时,重置计数器,边缘检测器并更新显示器 .
顺便说一句,既然是初学者,请尝试使用信号而不是变量 . 变量与编程语言具有相似的行为,但在合成中使用它们时会遇到很多陷阱 . 对于初学者,我建议坚持使用信号,一旦习惯了它们并且了解VHDL如何工作,你可以回到使用变量 . 在我自己的综合设计中,我有95%的信号,这是FPGA设计人员的标准 .