用VHDL实现连续平均

用VHDL实现连续平均,vhdl,hdl,moving-average,Vhdl,Hdl,Moving Average,我有一个关于VHDL编程的问题。我想计算连续平均值。我的示例代码是: process (clk, reset) begin if (reset = '1') then state<=idle; out-val=0; elsif(rising_edge(clk)) then case state is when idle => if req='1' then

我有一个关于VHDL编程的问题。我想计算连续平均值。我的示例代码是:

process (clk, reset)
begin
    if (reset = '1') then 
        state<=idle;
        out-val=0;
    elsif(rising_edge(clk)) then
        case state is

            when idle =>
                if req='1' then 
                    state= out-1;
                end if;

            when out-1 =>
                if done='1' then
                    out-val<=data-in (11 downto 0);
                    state <= done-st;
                endif;

            when done-st =>
                ack <='1';
                state <= idle;

            when others =>
                state <= idle;
        end case;
    end if;
end process;
过程(时钟、复位)
开始
如果(重置='1'),则
状态
如果req='1',则
状态=out-1;
如果结束;
当out-1=>
如果完成class='1',则

out val保持32个值的运行总数。您可以通过具有总计数的信号来保持一个运行总数。在每个时钟周期,您需要加上最新的值,减去最旧的值。这意味着您需要创建一个大的移位寄存器或FIFO来跟踪之前的32个值,以便按顺序删除它们


然后要得到平均值,只需右移除以32。

保持32个值的总和。您可以通过具有总计数的信号来保持一个运行总数。在每个时钟周期,您需要加上最新的值,减去最旧的值。这意味着您需要创建一个大的移位寄存器或FIFO来跟踪之前的32个值,以便按顺序删除它们


然后,为了得到平均值,只需右移除以32。

创建系数为1/32[1,1,…1]的32抽头FIR滤波器。

创建系数为1/32[1,1,…1]的32抽头FIR滤波器。

您应该使用下划线而不是破折号。看起来你在用状态机做数学题。“当出局1”是令人困惑的。实际上,我在我的原始代码中使用了下划线。我不知道我为什么在这里写“-1”。很抱歉造成混淆。您应该使用下划线而不是破折号。看起来你在用状态机做数学题。“当出局1”是令人困惑的。实际上,我在我的原始代码中使用了下划线。我不知道我为什么在这里写“-1”。很抱歉造成混淆。我是否必须为此创建单独的流程?我建议这样做。将状态机逻辑与运行平均值分开。@user3008991什么答案?我是否必须创建一个单独的进程来执行此操作?我建议这样做。将状态机逻辑与运行平均值分开。@user3008991什么答案?是的,我做了。那又怎样?是的。所以