Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
12 years ago

How to make a averager in VHDL

I have just readed a piece of VHDL code. It is used to average the signal value from AD(14 bit).

The code i write below here:

process(CLK80) begin

if(CLK80'event and CLK80='1') then

if(samplingTriggerReg='1') then -- synchronization with the sampling trigger

avCStateReg <= "00000";

else

case avCStateReg is

when "00000"=> if(sigCLatchReg='1') then avCStateReg<="00001"; end if;

when "00001"=> if(sigCLatchReg='1') then avCStateReg<="00011"; end if;

when "00011"=> if(sigCLatchReg='1') then avCStateReg<="00111"; end if;

when "00111"=> if(sigCLatchReg='1') then avCStateReg<="01111"; end if;

when "01111"=> if(sigCLatchReg='1') then avCStateReg<="11111"; end if;

when "11111"=> if(sigCLatchReg='1') then avCStateReg<="11110"; end if;

when "11110"=> if(sigCLatchReg='1') then avCStateReg<="11100"; end if;

when "11100"=> if(sigCLatchReg='1') then avCStateReg<="11000"; end if;

when "11000"=> if(sigCLatchReg='1') then avCStateReg<="10000"; end if;

when "10000"=> if(sigCLatchReg='1') then avCStateReg<="00000"; end if;

when others => avCStateReg<="00000";

end case;

end if;

end if;

end process;

dfTrigCReg <= '1' when avCStateReg="10000" else '0';

process(CLK80) begin

if(CLK80'event and CLK80='1') then

if(samplingTriggerReg='1') then -- synchronization with the sampling trigger

avSStateReg <= "00000";

else

case avSStateReg is --gray counter?

when "00000"=> if(sigSLatchReg='1') then avSStateReg<="00001"; end if;

when "00001"=> if(sigSLatchReg='1') then avSStateReg<="00011"; end if;

when "00011"=> if(sigSLatchReg='1') then avSStateReg<="00111"; end if;

when "00111"=> if(sigSLatchReg='1') then avSStateReg<="01111"; end if;

when "01111"=> if(sigSLatchReg='1') then avSStateReg<="11111"; end if;

when "11111"=> if(sigSLatchReg='1') then avSStateReg<="11110"; end if;

when "11110"=> if(sigSLatchReg='1') then avSStateReg<="11100"; end if;

when "11100"=> if(sigSLatchReg='1') then avSStateReg<="11000"; end if;

when "11000"=> if(sigSLatchReg='1') then avSStateReg<="10000"; end if;

when "10000"=> if(sigSLatchReg='1') then avSStateReg<="00000"; end if;

when others => avSStateReg<="00000";

end case;

end if;

end if;

end process;

dfTrigSReg <= '1' when avSStateReg="10000" else '0';

process(CLK80)

begin

if (CLK80'event and CLK80='1') then

if (sigCLatchReg='1') then

avSigCReg(0)

<= sigCReg(13) & sigCReg(13) & sigCReg(13) & sigCReg(13) & sigCReg;

for I in 1 to 9 loop

avSigCReg(I) <= avSigCReg(I-1)

+ (sigCReg(13) & sigCReg(13) & sigCReg(13) & sigCReg(13) & sigCReg);

end loop;

end if;

end if;

end process;

process(CLK80)

begin

if (CLK80'event and CLK80='1') then

if (sigSLatchReg='1') then

avSigSReg(0)

<= sigSReg(13) & sigSReg(13) & sigSReg(13) & sigSReg(13) & sigSReg;

for I in 1 to 9 loop

avSigSReg(I) <= avSigSReg(I-1)

+ (sigSReg(13) & sigSReg(13) & sigSReg(13) & sigSReg(13) & sigSReg);

end loop;

end if;

end if;

end process;

i dont konw why the designer do this&#65306; avSigCReg(0) <= sigCReg(13) & sigCReg(13) & sigCReg(13) & sigCReg(13) & sigCReg;

avSigCReg is is array (0 to 9) of signed(17 downto 0)&#65292;

I think this code is calculate the average value of 10 signal .

But I dont understand it ? Thanks for giving your idea.

13 Replies