许多场合下都需要在不同带宽总线之间进行数据的快速转换。例如,一个系统捕获视频信号并将其转换为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;
文章评论(0条评论)
登录后参与讨论