Vhdl 在VDHL中创建转速表

Vhdl 在VDHL中创建转速表,vhdl,Vhdl,我被分配了使用VDHL来编程设备的任务,创建一个转速表。我已经提供了一个引脚,其中一个输入信号将被连接,并从中需要显示每秒发生的频率(频率)。之前我只使用VHDL编程过几次,现在很难弄清楚如何实现代码: 到目前为止,我已经构建了设备需要采取的以下步骤 通过根据输入信号创建一个进程来计算输入信号中的逻辑值 我通过创建一个依赖于输入信号的过程来实现这一点,并在输入信号中出现高电平时增加一个变量 counthigh:process(input_signal) -- CountHigh process

我被分配了使用VDHL来编程设备的任务,创建一个转速表。我已经提供了一个引脚,其中一个输入信号将被连接,并从中需要显示每秒发生的频率(频率)。之前我只使用VHDL编程过几次,现在很难弄清楚如何实现代码:

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

  • 通过根据输入信号创建一个进程来计算输入信号中的逻辑值
  • 我通过创建一个依赖于输入信号的过程来实现这一点,并在输入信号中出现高电平时增加一个变量

    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秒。所以每个上升沿之间的时间等于

    我想做的是等待一定数量的上升沿(我想我可以定义另一个变量,然后等待它的倍数来更新显示并重置当前的计数变量)

    statereset:process——statereset进程
    开始
    等待上升沿(c_clk);--在每个上升沿上
    如果(reset='0'),则
    当前的
    我理解你想要达到的目标,但这是行不通的。在模拟中,每次
    输入信号
    变高或变低时,它都会计数,这很好,但此代码不会合成

    计数器需要时钟,有时钟的进程需要上升沿。我希望您的输入频率低于您的工作时钟,因此我建议您使用使用使用您的时钟运行的边缘检测器。我将把它作为练习,但是

    要等待1秒或其他时间,请使用计数器。如果您的时钟为5MHz,请使用信号从0到4_999_999进行计数。当计数器为4_999_999时,重置计数器、边缘检测器并更新显示器


    顺便说一句,既然你是初学者,试着用信号代替变量。变量的行为与编程语言类似,但在合成中使用时会有很多陷阱。对于初学者,我建议坚持使用信号,一旦你习惯了它们,并且更好地理解了VHDL的工作原理,你就可以重新使用变量了。在我自己的合成设计中,我有大约95%的信号,这是FPGA设计师的标准。

    这是学校作业吗?每周大学实验室(VHDL简介)输入信号的Fmax是多少?如果它比c_-clk慢得多,你可以将它同步到c_-clk并使用你当前的方法。否则,您将需要在2个时钟域中计数。这需要交叉时钟电路将启动/停止信号从1秒计时器交换到频率计数器。像这样的互联网搜索是一个很好的开始,你可以找到这篇文章:。
    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
    
    counthigh:process(input_signal)  -- CountHigh process
        begin
            if (input signal = '1') then
                current_count := current_count+1;
            end if;
    end process; -- End process