新闻  |   论坛  |   博客  |   在线研讨会
用PLD和FIFO来转换总线带宽
mayer | 2009-07-23 18:10:51    阅读:1477   发布文章

用PLD和FIFO来转换总线带宽

 

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

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

    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;

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客