原创 用PLD和FIFO来转换总线带宽

2009-7-6 11:05 2504 6 6 分类: 汽车电子

许多场合下都需要在不同带宽总线之间进行数据的快速转换。例如,一个系统捕获视频信号并将其转换为8位数字信号,但系统用的是32位微处理器;在这种情况下8位数据必须用某种方法存储配置后才能和32位带宽总线进行通信。这就使FIFO缓存有了应用的可能。如图所示电路是由四个FIFO和一个可编程逻辑器件(SPLD)组成,这个电路提供了一个将8位数据转换成32位数据的解决方案。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


8位数据按顺序存入4个FIFO中,且数据写入FIFO的动作是由可编程逻辑器件PALC22V10D来控制。其中有源低端EN电平用于控制22V10输出信号。当FIFO复位时,有源低端reset信号可以使所有输出信号都为低电平。当EN电平升高时,/WEN1为低电平,这时8位带宽总线上的数据写入FIFO1中。在下一个时钟周期,/WEN1断开,/WEN2为低电平,则下一个8位数据存入到FIFO2中。FIFO3和FIFO4用同样的方法写入数据。FIFO4写完后,计数器计数后,数据又能存入FIFO1中了。重复上述操作,8位数据就能顺序存入FIFO中了。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


    P_O3]%3RDE9B%0X}ZWJ]YJ0.jpg


上图是一个实用小电路,它用于不同带宽总线的通信;它是将8位数据转换成32位带宽总线的数据,同样也可以通过改变FIFO和对PLD重新编程的办法,能很快也很容易地应用于其他系统和不同微处理器。数据读取线(REN)用于FIFO数据阵的输出,处理器从FIFO并行地读出数据。处理器以1/4写时钟速率用一个读时钟信号来读取,否则它能以更快的速度读取大量的数据。处理器通过FIFO的可编程标志位的空/满状态来知道什麽时候可以读取FIFO的数据。这种电路给很多带宽不匹配的系统提供了一个简单的解决方案,通过对逻辑器件进行重新编程和改变FIFO,我们能把它用于不同系统和不同微处理器的情况。


下面用于是22V10 FIFO控制器的程序代码:


library ieee;


                       use ieee.std_logic_1164.all;


                       USE work.STD_ARITH.all;


                      entity control is port(


                          clk, en, reset: in std_logic;


                          wen: buffer std_logic_vector(3 downto 0));


                       end control;


 


                       architecture archcontrol of control is


                       signal count: std_logic_vector(1 downto 0);


                       signal intwen: std_logic_vector(3 downto 0);


                       begin


                       upcount: process (clk)


                         begin


                            if (clk'event and clk = '1') then


                               if reset = '0' then


                                  count <= "00";


                               elsif en = '0' then


                                  count <= count + 1;


                               end if;


                            end if;


                         end process upcount;


 


                       demux: process (clk)


                         begin


                            if (clk'event and clk = '1') then


                               if en = '0' then


                                  case count is


                                      WHEN "00" => intwen <= "1110";


                                      WHEN "01" => intwen <= "1101";


                                      WHEN "10" => intwen <= "1011";


                                      WHEN "11" => intwen <= "0111";


                                      WHEN others => intwen <= "1111";


                                  end case;


                               else


                                  intwen <= "1111";


                               end if;


                            end if;


                         end process demux;


                        wen(0) <= intwen(0) and reset;


                        wen(1) <= intwen(1) and reset;


                        wen(2) <= intwen(2) and reset;


                        wen(3) <= intwen(3) and reset;


                        end archcontrol;

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条