该设计主要完成数据锁存和并行转串行的功能<br />顶层模块为YBK 其中主要包含4种模块<br /><br />MCLK1 MCLK2为时钟分频模块 功能基本类似<br />MCC1 MCC2<br />LATCH1 LATCH2为一16位锁存器<br />其中LATCH1为上升沿触发 LATCH2为下降沿触发<br />D1 D2为LATCH1类型 D3 D4 为LATCH2类型<br />SHIFT为一锁存加移位寄存器<br />UD1UD2UD3UD4为该类型寄存器<br /><br />这里主要讨论C0 C1 和 DIN 输出 TMP_R1 TMP_G1 TMP_R2 TMP_G2<br />一般我的输入 波形会如下 <br /> ___ ____ ____________________<br /> | | | |<br /> | | | |<br />C0 |____| |____|<br /> ____<br /> | | <br /> | |<br />C1_ ____________________| |_____________<br /><br />DIN__/R1\_/G1\_/R2\_/G2\____________________<br />(16b)\__/ \__/ \__/ \__/<br /><br /><br />C0的下降沿 会触发D3D4 锁存R1 R2<br /><br />C0的上升沿 会触发D1D2 锁存G1 G2<br /><br />在C1的上升沿 MCC1 MCC2的计数被启动 <br />MCC2产生16个正脉冲DCLK <br />MCC1产生32个正脉冲pclk 通过触发产生Q<br />Q的相位与dclk延迟180度<br /><br />DCLK连接到UD1UD2UD3UD4<br /><br />通过dclk串行输出4路 16bit的串行数据 <br /><br /><br />症状:输入为全零时 TMP_R1 有时会被误触发成1<br /><br /><br />请大虾们分析一下<br /><br /><br />library ieee;<br />use ieee.std_logic_1164.all;<br />use ieee.std_logic_unsigned.all;<br /><br />entity LATCH1 is<br />port(<br /> din :in std_logic_vector(15 downto 0); <br /> dout :out std_logic_vector(15 downto 0); <br /> store :in std_logic<br />);<br />end LATCH1;<br />architecture LATCH1 of LATCH1 is<br />signal tmp: std_logic_vector(15 downto 0); <br />begin<br /><br />process(store)<br /> begin<br /> if(store'event and store='1')then<br /> tmp<=dIN;<br /> end if;<br /> end process;<br /> dout<=tmp;<br />end Latch1;<br /><br /><br /><br /><br />library ieee;<br />use ieee.std_logic_1164.all;<br />use ieee.std_logic_unsigned.all;<br /><br />entity LATCH2 is<br />port(<br /> din :in std_logic_vector(15 downto 0); <br /> dout :out std_logic_vector(15 downto 0); <br /> store :in std_logic<br />);<br />end LATCH2;<br />architecture LATCH2 of LATCH2 is<br />signal tmp: std_logic_vector(15 downto 0); <br />begin<br /><br />process(store)<br /> begin<br /> if(store'event and store='0')then<br /> tmp<=dIN;<br /> end if;<br /> end process;<br /> dout<=tmp;<br />end Latch2;<br /><br /><br />library ieee;<br />use ieee.std_logic_1164.all;<br />use ieee.std_logic_unsigned.all;<br /><br />entity mclk is<br />port(<br /> clkin :in std_logic;<br /> quickclk :in std_logic;<br /> count :out std_logic_vector(5 downto 0); <br /> pclk :out std_logic<br />);<br />end mclk;<br />architecture mclk of mclk is<br />signal count_tmp: std_logic_vector(5 downto 0); <br />signal flag:std_logic;<br /><br />begin<br />-----------------------<br />count<=count_tmp;<br />-----------------------<br />process(quickclk,clkin,count_tmp)<br />begin <br /> if clkin='1' then<br /> if count_tmp<37 then<br /> if quickclk'event and quickclk='1' then <br /> count_tmp<=count_tmp+1;<br /> if count_tmp>4 then<br /> flag<='1';<br /> end if;<br /> end if;<br /> elsif quickclk='0' then<br /> flag<='0';<br /> end if;<br /> elsif clkin='0' then<br /> count_tmp<="000000";<br /> flag<='0';<br /> end if;<br />end process;<br />-----------------------<br />--clkout<=quickclk when (count_tmp<4 and clkin='1') else '0';<br />-- pclk<=count_tmp(0) when flag='1' else '0';<br />pclk<=quickclk when flag='1' else '0';<br /> -----------------------<br />end mclk;<br />library ieee;<br />use ieee.std_logic_1164.all;<br />use ieee.std_logic_unsigned.all;<br /><br />entity mclk1 is<br />port(<br /> clkin :in std_logic;<br /> quickclk :in std_logic;<br /> count :out std_logic_vector(5 downto 0); <br /> pclk :out std_logic<br />);<br />end mclk1;<br /><br />architecture mclk1 of mclk1 is<br />signal count_tmp: std_logic_vector(5 downto 0); <br />signal flag:std_logic;<br /><br />begin<br />-----------------------<br />count<=count_tmp;<br />-----------------------<br />process(quickclk,clkin,count_tmp)<br />begin <br /> if clkin='1' then<br /> if count_tmp<36 then<br /> if quickclk'event and quickclk='1' then <br /> count_tmp<=count_tmp+1;<br /> if count_tmp>3 then<br /> flag<='1';<br /> end if;<br /> end if;<br /> elsif quickclk='0' then<br /> flag<='0';<br /> end if;<br /> elsif clkin='0' then<br /> count_tmp<="000000";<br /> flag<='0';<br /> end if;<br />end process;<br />-----------------------<br />--clkout<=quickclk when (count_tmp<4 and clkin='1') else '0';<br />-- pclk<=quickclk when flag='1' else '0';<br />pclk<=count_tmp(0) when flag='1' else '0';<br /> -----------------------<br />end mclk1;<br /><br /><br /><br />--16bit shiftreg 并行到串行转换 <br />library ieee;<br />use ieee.std_logic_1164.all;<br />use ieee.std_logic_unsigned.all;<br /><br />entity shift is<br />port(<br /> dIN :in std_logic_vector(15 downto 0);<br /> count :in std_logic_vector(5 downto 0);<br />-- CLKIN :in std_logic;<br /> pCLk :in std_logic;<br /> quickclk :in std_logic;<br /> sout :out std_logic<br />);<br />end shift;<br /><br />architecture rtl of shift is<br /> signal tmp :std_logic_vector(16 downto 0);--<br /> begin<br /> PROCESS(COUNT,pclk,quickclk)<br /> BEGIN<br /> if(count="000010") then<br /> tmp(15 downto 0)<=din;<br /> else<br /> --if(count(0)'event and count(0)='1') then <br /> if(pclk='1') then <br /> if(quickclk'event and quickclk='0') then<br /> tmp<=tmp(15 downto 0) & '0' ;<br /> end if;<br /> end if;<br /> end if;<br /> END PROCESS;<br /> sout<=tmp(16);<br />end rtl;<br />--16bit shiftreg 并行到串行转换 <br /><br />--clk assign<br />LIBRARY IEEE;<br />USE IEEE.STD_LOGIC_1164.ALL;<br />USE IEEE.STD_LOGIC_UNSIGNED.ALL;<br /><br />ENTITY CLKASSIGN IS<br /> PORT(<br /> -- OE_C,STR_C STR,OE, ,A,B,C,D :IN STD_LOGIC;<br /> CLK :IN STD_LOGIC;<br /> S :IN STD_LOGIC_VECTOR(2 DOWNTO <br /><br />0); <br /> -- CLK_2 :OUT STD_LOGIC;--<br /> -- SOE,SSTRSA,SB,SC,SD, :OUT STD_LOGIC;--,CLK_2<br /> SCLK :OUT STD_LOGIC_VECTOR(7 DOWNTO 0)<br /> );<br />END CLKASSIGN;<br /><br /><br />ARCHITECTURE CLKASSIGN OF CLKASSIGN IS<br /> SIGNAL SCLK_B :STD_LOGIC_VECTOR(7 DOWNTO 0);<br /> SIGNAL TMP_SOE,TMP_SSTR :STD_LOGIC;<br /> SIGNAL COUNTER :STD_LOGIC_VECTOR(1 DOWNTO 0);<br />BEGIN<br /> <br /><br /><br /> <br /> SCLK(0)<=SCLK_B(0) AND ((CLK));<br /> SCLK(1)<=SCLK_B(1) AND ((CLK));<br /> SCLK(2)<=SCLK_B(2) AND ((CLK));<br /> SCLK(3)<=SCLK_B(3) AND ((CLK));<br /> SCLK(4)<=SCLK_B(4) AND ((CLK));<br /> SCLK(5)<=SCLK_B(5) AND ((CLK));<br /> SCLK(6)<=SCLK_B(6) AND ((CLK));<br /> SCLK(7)<=SCLK_B(7) AND ((CLK));<br /><br /> <br /> PROCESS(S)<br /> BEGIN<br /> CASE S IS<br /> WHEN "000"=><br /> SCLK_B<=(0=>'1',OTHERS=>'0');<br /> WHEN "001"=><br /> SCLK_B<=(1=>'1',OTHERS=>'0');<br /> WHEN "010"=><br /> SCLK_B<=(2=>'1',OTHERS=>'0');<br /> WHEN "011"=><br /> SCLK_B<=(3=>'1',OTHERS=>'0');<br /> WHEN "100"=><br /> SCLK_B<=(4=>'1',OTHERS=>'0');<br /> WHEN "101"=><br /> SCLK_B<=(5=>'1',OTHERS=>'0');<br /> WHEN "110"=><br /> SCLK_B<=(6=>'1',OTHERS=>'0');<br /> WHEN "111"=><br /> SCLK_B<=(7=>'1',OTHERS=>'0');<br /><br /> WHEN OTHERS=><br /> NULL;<br /> END CASE;<br /> END PROCESS;<br /><br />-- CLK_2<=COUNTER(0);<br />-- PROCESS(CLK)<br />-- BEGIN<br />-- IF(CLK'EVENT AND CLK='1')THEN<br />-- COUNTER(1 DOWNTO 0)<=COUNTER(1 DOWNTO 0)+1;<br />-- END IF;<br />-- END PROCESS;<br /><br />END CLKASSIGN;<br /><br />--YBK VHD<br />LIBRARY IEEE;<br />USE IEEE.STD_LOGIC_1164.ALL;<br />USE IEEE.STD_LOGIC_UNSIGNED.ALL;<br /><br />ENTITY YBK IS<br /> PORT(<br /> OE_C,STR_C :IN STD_LOGIC;<br /> C :IN <br /><br />STD_LOGIC_VECTOR(1 DOWNTO 0);<br /> clkout :out STD_logic;<br /> STR,OE :IN STD_LOGIC;--<br /><br />-,CLK,A,B,C,D,LATCH,LOAD<br /> S :IN <br /><br />STD_LOGIC_VECTOR(2 DOWNTO 0);<br /> S3 :IN STD_LOGIC;<br /> SS3,B_SS3 :OUT STD_LOGIC;-- <br /><br />SA,SB,SC,SD,<br /> DIN :IN <br /><br />STD_LOGIC_VECTOR(15 DOWNTO 0);<br /> QUICKCLK :IN STD_LOGIC;--,CLKIN <br /><br /> <br /> R485_232,DATA_C :IN STD_LOGIC;<br /> TXD,RXD232,RXD485 :IN STD_LOGIC;<br /> RXD,TXD485,TXD232 :OUT STD_LOGIC;<br /> SOE,SSTR :OUT STD_LOGIC;-- <br /><br />SA,SB,SC,SD,<br /> RD1,RD2,GD1,GD2 :OUT STD_LOGIC;<br /> WORKING,TRANSFER :OUT STD_LOGIC;<br /> --PWM :IN STD_LOGIC;<br /> pclk :buffer std_logic;<br /> dclk :buffer std_logic;<br /> -- COUNT :buffer std_logic_vector(5 downto <br /><br />0);<br /> SCLK :OUT STD_LOGIC_VECTOR(7 DOWNTO 0)<br /> );<br />END YBK;<br /><br /><br />ARCHITECTURE YBK OF YBK IS<br /> SIGNAL CLK_2,BD :STD_LOGIC;<br /> SIGNAL TMP_RD1,TMP_RD2 :STD_LOGIC;<br /> SIGNAL TMP_GD1,TMP_GD2 :STD_LOGIC;<br /> SIGNAL CLKIN :STD_LOGIC;<br /><br />--寄存器组<br /><br /> SIGNAL T1,T2,T3,T4 :std_logic_vector(15 downto 0);<br /> SIGNAL R1,R2,R3,R4 :std_logic_vector(15 downto 0);<br /> <br /> SIGNAL COUNT :std_logic_VECTOR(5 DOWNTO 0);<br /> SIGNAL CLK :std_logic;<br /> --signal pclk : std_logic;<br /><br /> signal Q :std_logic;<br /> <br /> <br /> component MCLK<br /> port(<br /> clkin :in std_logic;<br /> quickclk :in std_logic;<br /> count :out std_logic_vector(5 downto 0);<br /> pclk :out std_logic<br /> );<br /> end component;<br /> component MCLK1<br /> port(<br /> clkin :in std_logic;<br /> quickclk :in std_logic;<br /> count :out std_logic_vector(5 downto 0);<br /> pclk :out std_logic<br /> );<br /> end component;<br /> <br /> component LATCH1 <br /> port(<br /> STORE :in std_logic;<br /> DIN :IN STD_LOGIC_VECTOR(15 DOWNTO <br /><br />0);<br /> DouT :out STD_LOGIC_VECTOR(15 DOWNTO 0)<br /> );<br /> end component;<br /><br /> component LATCH2 <br /> port(<br /> STORE :in std_logic;<br /> DIN :IN STD_LOGIC_VECTOR(15 DOWNTO <br /><br />0);<br /> DouT :out STD_LOGIC_VECTOR(15 DOWNTO 0)<br /> );<br /> end component;<br /> component SHIFT<br /> port(<br /> dIN :in std_logic_vector(15 downto 0);<br /> sout :out std_logic;<br /> pclk :in std_logic;<br /> quickclk :in std_logic;<br /> count :in std_logic_vector(5 downto 0)<br /> );<br /> end component;<br /><br /><br /> component CLKASSIGN<br /> port(<br /> CLK :IN STD_LOGIC;<br /> S :IN STD_LOGIC_VECTOR(2 DOWNTO <br /><br />0);<br /> SCLK :OUT STD_LOGIC_VECTOR(7 DOWNTO 0)<br /> );<br /> end component;<br />BEGIN<br /> UD1:SHIFT port map( DIN=>R1, sout=>TMP_RD1, pclk=>dclk, <br /><br />count=>count,quickclk=>quickclk);<br /> UD2:SHIFT port map( DIN=>R2, sout=>TMP_GD1, pclk=>dclk, <br /><br />count=>count,quickclk=>quickclk);<br /> UD3:SHIFT port map( DIN=>R3, sout=>TMP_RD2, pclk=>dclk, <br /><br />count=>count,quickclk=>quickclk);<br /> UD4:SHIFT port map( DIN=>R4, sout=>TMP_GD2, pclk=>dclk, <br /><br />count=>count,quickclk=>quickclk);<br /><br /><br /><br /> D1:LATCH1 PORT MAP(DIN=>DIN, DOUT=>R4,STORE=>C(0));<br /> D2:LATCH1 PORT MAP(DIN=>R4, DOUT=>R2,STORE=>C(0));<br /> D3:LATCH2 PORT MAP(DIN=>DIN, DOUT=>R3,STORE=>C(0));<br /> D4:LATCH2 PORT MAP(DIN=>R3, DOUT=>R1,STORE=>C(0));<br /> <br /> <br /> MCC:MCLK port map(CLKIN=>CLKIN,pclk=>pclk, QUICKCLK=>QUICKCLK);<br /><br /><br /><br /> MCC1:MCLK1 port map(CLKIN=>CLKIN,pclk=>dclk, QUICKCLK=>QUICKCLK,count=>count);--<br /><br /><br /> UCLK:CLKASSIGN PORT MAP(CLK=>Q,SCLK=>SCLK,S=>S);<br /> <br /> --CLK<=quick;<br /> <br /> CLKOUT<=quickclk;<br /> WORKING<=STR;<br /> TRANSFER<=TXD;<br /> SS3<=S3;<br /> B_SS3<=NOT S3;<br /> <br /> <br /> CLKIN<=C(1);<br /> <br /> <br />PROCESS(pclk,clkin)<br /> BEGIN<br /> if(clkin='1') then<br /> if (pclk'event and pclk='1') then<br /> Q<= not Q;<br /> end if;<br /> else <br /> Q<='0';<br /> end if;<br /> END PROCESS;<br /><br /> PROCESS(DATA_C)<br /> BEGIN<br /> IF(DATA_C='1')THEN<br /> RD1<=TMP_RD1;--RD1<=not T11(0); --<br /> RD2<=TMP_RD2;--RD2<=not T21(0); --<br /> GD1<=TMP_GD1;--GD1<=not T12(0); --<br /> GD2<=TMP_GD2;--GD2<=not T22(0); --<br /> ELSE<br /> RD1<=NOT(TMP_RD1);--RD1<=T11(0); --<br /> RD2<=NOT(TMP_RD2);--RD2<=T21(0); --<br /> GD1<=NOT(TMP_GD1);--GD1<=T12(0); --<br /> GD2<=NOT(TMP_GD2);--GD2<=T22(0); --<br /> END IF;<br /> END PROCESS;<br /> PROCESS(R485_232)<br /> BEGIN<br /> IF(R485_232='0')THEN<br /> RXD<=RXD485;<br /> TXD485<=TXD;<br /> ELSE<br /> RXD<=RXD232;<br /> TXD232<=TXD;<br /> END IF;<br /> END PROCESS;<br /><br /> PROCESS(OE_C)<br /> BEGIN<br /> IF(OE_C='0')THEN<br /> -- SSTR<=not(STR);<br /> SOE<=OE;-- AND PWM;<br /> ELSE<br /> -- SSTR<=not(STR);<br /> SOE<=NOT(OE);-- AND PWM;<br /> END IF;<br /> END PROCESS;<br /><br /> PROCESS(STR_C)<br /> BEGIN<br /> IF(STR_C='0')THEN<br /> SSTR<=STR;<br /> -- SOE<=OE;-- AND PWM;<br /> ELSE<br /> SSTR<=NOT(STR);<br /> -- SOE<=OE;-- AND PWM;<br /> END IF;<br /> END PROCESS;<br />END YBK;<br /><br /><br /><br /> <br /> |
|