library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity sram_fifo is
port(
clk:in std_logic;
clr:in std_logic;
datain:in std_logic_vector(15 downto 0);
sh:in std_logic;
wr_clk:in std_logic;--be equal to dataclk
--USB signal
start:in std_logic;
flag_full:in std_logic;
u_ifclk ut std_logic;
u_addr1 ut std_logic;
u_addr0 ut std_logic;
slwr ut std_logic;
dataout ut std_logic_vector(15 downto 0);
SLRD:OUT STD_LOGIC;
--led
led0 ut std_logic;
led1 ut std_logic;
led2 ut std_logic;
led3 ut std_logic;
--sram:is61lv51216 signal
sram_addr ut std_logic_vector(17 downto 0);
sram_data:inout std_logic_vector(15 downto 0);
sram_ub:out std_logic;
sram_lb:out std_logic;
oe:out std_logic;--low valid
we:out std_logic;--low valid
ce:out std_logic--low valid
);
end entity;
architecture behav of sram_fifo is
signal sh_en:std_logic;
type states is(idle,wr_begin,wr_on,wr,wr_end,rd_begin,rd_on,rd,rd_end);
signal current_state:states;
signal sram_addr_s:std_logic_vector(17 downto 0);
SIGNAL SRAM_DATA_FIFO:STD_LOGIC_VECTOR(15 downto 0);
signal usb_data_fifo:std_logic_vector(15 downto 0);
signal wr_flag:std_logic;
signal rd_flag:std_logic;
begin
--read 7680 values per frame:sh_en :enable
a0:
process(wr_clk,sh)
variable cnt1:integer range 0 to 7681:=0;
begin
if(sh='0')then
if(wr_clk'event and wr_clk='1')then
if(cnt1=7681)then
cnt1:=cnt1;
else cnt1:=cnt1+1;
if(cnt1<=7680)then
sh_en<='0';
else
sh_en<='1';
end if;
end if;
end if;
else
cnt1:=0;
sh_en<='1';
end if;
end process a0;
--write and read respectively
a1:
process(clk,start)
begin
if(clk'event and clk='1')then
if(clr='1')then
oe<='1';
we<='1';
sram_addr_s<="000000000000000000";
wr_flag<='0';
rd_flag<='0';
u_addr1<='0';
u_addr0<='0';
slwr<='1';
led0<='0';
led1<='0';
led2<='0';
led3<='0';
--cnt2:=0;
current_state<=idle;
else
case current_state is
when idle=> wr_flag<='0';
rd_flag<='0';
LED0<='0';
led1<='0';
led2<='0';
led3<='0';
oe<='1';
we<='1';
sram_addr_s<="000000000000000000";地址从1开始写的,没用地址0.
u_addr1<='0';
u_addr0<='0';
slwr<='1';
if(start='1')then
current_state<=wr_begin;
else
current_state<=idle;
end if;
when wr_begin=> wr_flag<='1';
if(sh_en='0')then
current_state<=wr_on;
else
current_state<=wr_begin;
end if;
when wr_on=> if(sh_en='0')then
sram_addr_s<=sram_addr_s+'1';
SRAM_DATA_FIFO<=datain;
we<='1';
oe<='0';
current_state<=wr;
else
current_state<=wr_begin;
end if;
when wr => if(sram_addr_s/="100101100000000000")then
we<='0';
oe<='0';
current_state<=wr_on;
else
led0<='1';
we<='1';
oe<='1';
wr_flag<='0';
current_state<=wr_end;
end if;
when wr_end => wr_flag<='0';
sram_addr_s<="000000000000000000";
current_state<=rd_begin;
led2<='1';
when rd_begin=> u_addr1<='1';
u_addr0<='0';
oe<='0';
we<='1';
wr_flag<='0';
rd_flag<='1';
sram_addr_s<=sram_addr_s+'1';
current_state<=rd_on;
when rd_on => if(flag_full='1')then
slwr<='0';
dataout<=usb_data_fifo;
current_state<=rd;
else
slwr<='1';
current_state<=rd_on;
end if;
when rd => --slwr<='1';
if(sram_addr_s/="100101100000000000")then
sram_addr_s<=sram_addr_s+'1';
oe<='0';
we<='1';
led3<='1';
current_state<=rd_on;
else
--SLWR<='1';
sram_addr_s<="000000000000000000";
oe<='1';
we<='1';
led1<='1';
rd_flag<='0';
current_state<=rd_end;
end if;
when rd_end => slwr<='1';
wr_flag<='0';
rd_flag<='0';
if(start='0')then
current_state<=idle;
else
current_state<=rd_end;
end if;
when others => current_state<=idle;
end case;
end if;
end if;
end process;
sram_data<=SRAM_DATA_FIFO when (wr_flag='1' and rd_flag='0') else (others=>'Z');
usb_data_fifo<=sram_data when (rd_flag='1' and wr_flag='0') else (others=>'0');
sram_addr<=sram_addr_s;
ce<='1';
SLRD<='1';
u_ifclk<=wr_clk;
--oe<='0';
sram_ub<='0';
sram_lb<='0';
end behav;
这是我用FPGA控制SRAM读写,然后传给USB(68013a),我想问一下我的程序哪里出错了,为什么读不出数来呢,从USB上读出来的都是FF.
start来自USB,FPGA接收到后就开始写SRAM,写到指定书目后即153600个数据后,停止写,开始读数,并给USB传输。SH_EN是一帧数据中的有用信号标志。低电平说明是信号有效。求大侠们帮忙呀!小弟在此谢过了...... |