Altera_Forum
Honored Contributor
12 years agoHow 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: avSigCReg(0) <= sigCReg(13) & sigCReg(13) & sigCReg(13) & sigCReg(13) & sigCReg; avSigCReg is is array (0 to 9) of signed(17 downto 0), I think this code is calculate the average value of 10 signal . But I dont understand it ? Thanks for giving your idea.