这里主要问题在于FPGA内部的双口RAM读写操作共用同一数据总线和地址总线,当同时进行读写操作的时候就会产生时序问题导致写入或读出的数据错误。在这两个过程中为了防止数据和地址总线冲突,在FPGA内部设计了一个中央总线仲裁器。根据公共数据传输的先后顺序,中央仲裁器先接受图像传感器的总线请求,当图像存储到RAM之中后,中央仲裁器才响应单片机系统的读信号请求。
这里给出双口RAM的构造及读写控制程序:
Entity dual_port_ram is
Generic(d_width:integer:=2;
Mem_depth:integer:=8);
Port(clk:in STD_LOGIC;
CS:in STD_LOGIC;
We: in STD_LOGIC;
Indata: in STD_LOGIC_VECTOR(7 downto 0);
Outdata:out STD_LOGIC_VECTOR(7 downto 0);
Raddr,waddr:in STD_LOGIC_VECTOR(1 downto 0));
End dual_port_ram ;
Architecture data of dual_port_ram is
Type mem_type is array(3 downto 0) of
STD_LOGIC_VECTOR(7 downto 0);
Signal mem:mem_type;
Begin
Process(clk,we,waddr)
Begin
If(rising_edge(clk))then
If(we='1')then
Mem(conv_integer(waddr))<=indata;
End if;
End process;
Process(raddr,clk)
Begin
If(rising_edge(clk))then
If(CS='0')then
Outdata<=mem(conv_integer(raddr));
End if;
End if;
End process;
End data;
在MAX Plux II中的波形仿真图如图3所示: