【正文】
ogic_vector(7 downto 0):=00000000。 regester 為八位移位寄存器用于捕獲同步碼 ,singlecount 為單幀計數(shù)器 signal doublecount:std_logic_vector(8 downto 0):=000000000。雙幀計數(shù)器 以位為單位 signal catch:std_logic:=39。039。同步碼捕捉狀態(tài)標志 0 表捕捉態(tài), 1 表示同步態(tài) signal syncount,lostcount:std_logic_vector(1 downto 0):=00。同步計數(shù)器以位為單位 27 與失步計數(shù)器 begin P1:process(clkin)利用移位寄存器暫存當前輸入碼,敏感信號為時鐘上升沿 即當時鐘上升沿到達時該進程執(zhí)行一次 begin if clkin39。event and clkin=39。139。 then時 鐘上升沿有效暫存輸入數(shù)據(jù) regester=regester(6 downto 0)amp。datain。 end if。 end process P1。 P2:process(clkin)同步碼捕捉,同步保持比較 begin if clkin39。event and clkin=39。039。 then時鐘下降沿有效驗證是否為同步碼 及驗證落后于暫存剛好半個時鐘周期,敏感信號為時鐘下降沿,即時鐘下降沿到達一次程序執(zhí)行一次 doublecount=doublecount+1。 singlecount=doublecount(7 downto 0)+1。借用雙幀第八位單幀計數(shù) if catch=39。039。 then catch 為 0 時為捕捉態(tài) if syncount=00 then if regester=10011011 then syncount=syncount+1。doublecount=000000111。 表示第一次捕捉到同步碼,將其 次數(shù)加一,并且讓輸出變?yōu)榈诎宋? end if。 elsif doublecount=000000110 then 已捕捉到同步碼的同時驗證捕獲 if regester=10011011 then if syncount=10 then catch=39。139。syncount=00。 驗證同步次數(shù)達到 3 次時轉(zhuǎn)為同步狀態(tài) else syncount=syncount+1。 end if。 else syncount=00。 驗證不是同步碼時轉(zhuǎn)為重新捕獲狀態(tài) end if。 end if。 else catch 為 1,同步態(tài)時,同步保持比較 if doublecount=000000110 and regester/=10011011 then 表示同步時驗證不是同步碼 if lostcount=10 then catch=39。039。 lostcount=00。 驗證失步次數(shù)達到三次時轉(zhuǎn)為捕捉狀態(tài) else lostcount=lostcount+1。 end if。 end if。 end if。 end if。 28 end process P2。 P3:process(clkin,singlecount,catch)時鐘上升沿有效,譯碼輸出 begin if clkin39。event and clkin=39。139。 then if catch=39。139。 then dataout=datain。 if singlecount=00000111and singlecount=00001110then A1=39。139。else A1=39。039。end if。 if singlecount=00001111and singlecount=00010110then A2=39。139。else A2=39。039。end if。 if singlecount=00010111and singlecount=00011110then A3=39。139。else A3=39。039。end if。 if singlecount=00011111and singlecount=00100110then A4=39。139。else A4=39。039。end if。 if singlecount=00100111and singlecount=00101110then A5=39。139。else A5=39。039。end if。 if singlecount=00101111and singlecount=00110110then A6=39。139。else A6=39。039。end if。 if singlecount=00110111and singlecount=00111110then A7=39。139。else A7=39。039。end if。 if singlecount=00111111and singlecount=01000110then A8=39。139。else A8=39。039。end if。 if singlecount=01000111and singlecount=01001110then A9=39。139。else A9=39。039。end if。 if singlecount=01001111and singlecount=01010110then A10=39。139。else A10=39。039。end if。 if singlecount=01010111and singlecount=01011110then A11=39。139。else A11=39。039。end if。 if singlecount=01011111and singlecount=01100110then A12=39。139。else A12=39。039。end if。 if singlecount=01100111and singlecount=01101110then A13=39。139。else A13=39。039。end if。 if singlecount=01101111and singlecount=01110110then A14=39。139。else A14=39。039。end if。 if singlecount=01110111and singlecount=01111110then A15=39。139。else A15=39。039。end if。 if singlecount=10000111and singlecount=10001110then A17=39。139。else A17=39。039。end if。 if singlecount=10001111and singlecount=10010110then A18=39。139。else A18=39。039。end if。 if singlecount=10010111and singlecount=10011110then A19=39。139。else A19=39。039。end if。 29 if singlecount=10011111and singlecount=10100110then A20=39。139。else A20=39。039。end if。 if singlecount=10100111and singlecount=10101110then A21=39。139。else A21=39。039。end if。 if singlecount=10101111and singlecount=10110110then A22=39。139。else A22=39。039。end if。 if singlecount=10110111and singlecount=10111110then A23=39。139。else A23=39。039。end if。 if singlecount=10111111and singlecount=11000110then A24=39。139。else A24=39。039。end if。 if singlecount=11000111and singlecount=11001110then A25=39。139。else A25=39。039。end if。 if singlecount=11001111and singlecount=11010110then A26=39。139。else A26=39。039。end if。 if singlecount=11010111and singlecount=11011110then A27=39。139。else A27=39。039。end if。 if singlecount=11011111and singlecount=11100110then A28=39。139。else A28=39。039。end if。 if singlecount=11100111and singlecount=11101110then A29=39。139。else A29=39。039。end if。 if singlecount=11101111and singlecount=11110110then A30=39。139。else A30=39。039。end if。 if singlecount=11110111and singlecount=11111110then A31=39。139。else A31=39。039。end if。 end if。 end if。 end process P3。 clkout=clkin。 end behave。 仿 真圖: 30 + 位同步程序與仿真圖 library IEEE。 相位比較模塊 use 。 use 。 use 。 entity phase_pare is port(Reset :in std_logic。 Clk_Est :in std_logic。 Date_In :in std_logic。 Phase_Error :out std_logic_vector(1 downto 0) )。 end phase_pare。 architecture rtl of phase_pare is signal Temp_SampleA :std_logic。 signal Temp_SampleB :std_logic。 signal Temp_SampleC :std_logic。 begin process(Reset,Clk_Est) begin if(Reset=39。039。)then Temp_SampleA=39。039。 Temp_SampleC=39。039。 elsif(Clk_Est39。event and Clk_Est=39。039。)then 31 Temp_SampleA=Temp_SampleC。 Temp_SampleC=Date_in。 end if。 end process。 process(Reset,Clk_Est) begin if(Reset=39。039。)then Temp_SampleB =39。039。 elsif(Clk_Est39。event and Clk_Est=39。139。)then