毕业论文同步复接器/分接器的FPGA设计与实现一. 复接器的设计本设计采用了将复接器通过软件来实现,尽可能用软件来实现更多的硬件电路[18~19]。
在FPGA设计中采用了分层设计,顶层为整个系统的原理框图(见图1),框图中包含了构成同步数字复接器的主要模块,然后按各模块的功能分别进行设计[20]。
图1 四路同步复接器的VHDL建模框图图1的四路同步复接器框图由分频器、内码控制器、时序产生器、内码产生器、输出电路等模块组成[21~22]。
分频器模块的作用是用来产生一个256KHZ的时钟信号,内码控制器模块的作用是通过三个地址控制端来控制内码发生器的码字依次输出,时序发生器模块的作用是产生四路时序来控制四路信号的输出,内码产生器模块的作用是将八路并行输入码通过串行输出,输出电路模块的作用是用一个三态门来控制四路信号分时输出,从而实现复接功能。
复接器的VHDL设计根据所划分的几大模块分别用VHDL语言去描述,最后用元件调用语句和例化语句将它们连接起来。
1. 分频器分频器实际是一个计数器,在本设计中,其作用是将由晶体震荡电路产生的4096KHZ的方波信号进行分频,其16分频(即256KHZ时钟)输出端作为内码控制器的控制输入端。
其建模流程图如图2所示。
图2 16分频计数器流程图分频器的VHDL描述程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count16 isport(clk: in std_logic;d,c,b,a: out std_logic);end count16;architecture rtl of count16 issignal count_4:std_logic_vector(3 downto 0);beginprocess(clk)beginif(clk'event and clk='1') thenif(count_4="1111") thencount_4<="0000";elsecount_4<=count_4+1;end if;end if;end process;d<=count_4(0);c<=count_4(1);b<=count_4(2);a<=count_4(3);end rtl;上述程序在Max+plus II时序仿真波形如图3所示。
图3 分频器的时序仿真波形图3中,a表示16分频输出,b表示8分频输出,c表示4分频输出,d表示2分频输出。
由图中可以看出,实际仿真波形图与理论预期一致。
2. 内码控制器内码控制器,实际也是一个分频器,一个输出端口输出三位并行信号作为内码产生器的地址控制端,另一输出端作为时序产生器的控制端。
内码控制器对内码产生器的控制功能表如表3.1所示。
表3.1 内码控制器对内码产生器的控制功能表表3.1中的A2、A1、A0分别表示内码控制器内的二进制分频器的8、4、2分频信号。
内码产生器应循环并依次输出从“000”、“001”、一直到“111”。
这样,内码发生器每个时钟节拍,输出一位码,通过输出电路送到合路信道上,最终形成一路串行码流。
3. 时序产生器时序产生器可产生脉宽为8个时钟周期的四路时序信号。
具体实现是:将内码控制器的二分频端通过一个32分频器,其16分频和32分频输出端作为2/4译码器的控制端,2/4译码器的四个输出端,在经过反相器后,便得出本设计所要求的四路时序。
译码器的建模流程图如图4所示。
图4 译码器的VHDL建模流程图译码器的VHDL描述程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yimaqi isport(f2,f1: in std_logic;y3,y2,y1,y0 : out std_logic );end ;architecture rtl of yimaqi issignal indata:std_logic_vector(1 downto 0);signal y:std_logic_vector(3 downto 0);beginindata<=f2&f1;process(indata)begincase indata iswhen"00"=>y<="1110";when"01"=>y<="1101";when"10"=>y<="1011";when"11"=>y<="0111";when others=>y<="0000";end case;end process;y3<=y(3);y2<=y(2);y1<=y(1);y0<=y(0);end architecture rtl;其时序仿真波形如图5所示。
图5 2/4译码器的时序仿真波形图图5中,f2表示分频器的32分频输出端,f1表示16分频输出端,y0为第1路译码输出,y1为第二路译码输出,y2为第3路译码输出,y3为第4路译码输出。
时序发生器的仿真波形及相位关系图如图6所示。
图6 时序发生器的仿真波形及相位关系图图6为译码器输出经过一个反向器处理后得出的仿真结果,图中S0、S1、S2、S3分别为四路的时序输出,由图中可以看出四路时序刚好组成一个完整的时序,仿真结果与理论预期一致。
4. 内码产生器四个内码产生器可生产四路独立的八位数码,并在内码控制器的控制下输出相应的数码,例如:C、B、A为三个地址控制端,Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0为八位码的输出,则二者的关系表3.2所示:表2 3/8控制关系图一个内码产生器的VHDL描述程序如下:library ieee;use ieee.std_logic_1164.all;entity neimacs0 isport(in0_8,in0_7,in0_6,in0_5,in0_4,in0_3,in0_2,in0_1,k3,k2,k1,sx0: in std_logic;out0: out std_logic);end entity neimacs0 ;architecture nm0 of neimacs0 iscomponent mux8_0port(d7,d6,d5,d4,d3,d2,d1,d0,d,c,b: in std_logic;y : out std_logic);end component;component tri_gate0port(din0,en: in std_logic;dout0:out std_logic);end component;signal l0: std_logic;beginu1:mux8_0port map(d7=>in0_8,d6=>in0_7,d5=>in0_6,d4=>in0_5,d3=>in0_4,d2=>in0_3,d1=>in0_2,d0=>in0_1,d=>k3,b=>k2,c=>k1,y=>l0);u2:tri_gate0 port map(din0=>l0,en=>sx0,dout0=>out0);end architecture nm0 ;library ieee;use ieee.std_logic_1164.all;entity mux8_0 isport(d7,d6,d5,d4,d3,d2,d1,d0:in std_logic;d,c,b:in std_logic;y :out std_logic );end mux8_0;architecture rtl of mux8_0 issignal sel:std_logic_vector(2 downto 0);beginsel<=d&c&b;with sel selecty<=d0 when "000",d1 when "001",d2 when "010",d3 when "011",d4 when "100",d5 when "101",d6 when "110",d7 when "111",'0' when others;end rtl;library ieee;use ieee.std_logic_1164.all;entity tri_gate0 isport(din0,en:in std_logic;dout0 :out std_logic);end tri_gate0 ;architecture zas of tri_gate0 isbegindout0<=din0 when en='1' else'Z';end zas;内码产生器的仿真波形如图7所示图7 内码产生器的仿真波形图图7中k3、k2、k1表示计数器的3位输入控制端,in0_8到in0_1表示8位并行输入码,out0表示一路串行输出码,由图中可以看出实际仿真结果与理论一致。
5. 输出电路在时序产生器产生的四路时序信号的控制下(时序与内码想与),按顺序依次将四路数码接入同一通道,形成了一路串行码,从而完成了四路数据码的复接。
实现的关键是三态与门的利用,就是当时序信号的上升沿到来,并且在高电平持续时间内,相应的八位码以Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7的顺序依次输出,而在其他情况下,则以高阻的形态出现,当经过一个时序周期(即32个码元)后,就输出一帧串行码,从而实现了四路数据的同步复接。
其中三态门的建模如图8所示。
N Y图8 三态门建模流程图三态门的VHDL描述程序如下:library ieee;use ieee.std_logic_1164.all;entity tri_gate0 isport(din0,en:in std_logic;dout0 :out std_logic );end tri_gate0 ;architecture zas of tri_gate0 isbegindout0<=din0 when en='1' else'Z';end zas;三态门的时序仿真波形如图9所示。