基于FPGA的UART 16倍頻采樣的VHDL設計
起始位檢測8個連續脈沖的另一個更重要的原因是,采用16倍頻采樣的時鐘,第8個采樣脈沖所對應的數據波形正好是該位數據位波形的正中點(以時鐘上升沿采樣),在該處讀寫數據應該是最安全點。
在設計時,充分抓住異步數據的特征進行設計:起始位為低電平、停止位為高電平、每幀數據幀結構相同。根據異步數據這些特征就可設計出以下相應程序:
process(clk16x,start) --產生clk1x時鐘進程
begin
if start=’0’ then
q=0001;
elsif clk16x’event and clk16x=’1’
then
q=q+1;
end if;
end procESS ;
clk1x=q(3);
process(clk16x,i,serialin,rst) --起始位檢測進程
begin
if rst=’1’ then
start=’0’;
elsif rising_edge(clk16x) then if serialin=’0’ then
start=’1’ ;
elsif over=’0’ then
start=’1’;
else start=’0’;
end if;
end if;
end process;
process(clk1x,serialin,i,rst) --讀數據進程
begin
if rst=’1’ then
buff= (others => ’1’);
Dout_P= (others => ’1’);
i=0;
over=’1’;
elsif rising_edge(clk1x) then
if i>
buff21=serialin;
i=i+1;
over=’0’; else
i=0;
over=’1’;
Dout_P=buff;
end if;
end if;
end process ;
本設計采用VHDL硬件描述語言來進行描述。clk16x為16倍頻采樣時鐘,clk1x是檢測到真正起始位后由clk16x時鐘分頻產生的采樣時鐘,start為開始接收數據信號(接收數據期間為高電平)、serialin為異步數據輸入端口。平常,接收器按clk16x時鐘上升采樣serialin。當采樣時鐘檢測到低電平時輸出一個高電平給start信號,clk1x分頻計數器啟動。如果連續采集8個脈沖都為低電平(起始位之半),即確定該低電平為起始位,輸出一個低電平給接收數據完信號over(接收數據期間為低電平,接收完數據為高電平),over信號在低電平檢測共同作用下保持start為高電平。start長時間保持高電平(8個clk16周期T)產生clk1x時鐘。反之判別為假起始位,over仍然為高電平,start卻變為低電平,clk1x分頻計數器復位,一直等到下次檢測serialin為低電平才重新啟動。可見,只有確定了起始位,clk1x時鐘才會產生,否則不產生。而clk16x時鐘始終存在,保證不會錯過每次接收線上的數據采樣。
結語
按常規的16倍頻采樣方法接收異步數據,其抗干擾性、移植性等都優于3倍頻采樣方法。實際應用表明,提高采樣倍數,接收準確性相應提高;在一定范圍內,提高數據波特率不會影響接收準確性。
fpga相關文章:fpga是什么












評論