首页 文章

在VDHL中创建转速计

提问于
浏览
0

我被分配了使用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 回答

  • 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设计人员的标准 .

相关问题