附件1是SDRAM读写的VHDL的语言代码,是根据附件2verilog HDL例程改写的,环境是Quartus II9.1,附件2里有
芯片的手册。代码还望各位指正下,还有就是波形怎么
仿真,因为自己已经研究了一段时间,也问了些人,并没有解决仿真出现的问题。 我的qq505403998, 讲真,谢谢那些能帮忙的。
-
-
write.rar
下载积分: 积分 -1 分
476.1 KB, 下载次数: 5, 下载积分: 积分 -1 分
-
-
SRAM write.rar
下载积分: 积分 -1 分
3.68 MB, 下载次数: 4, 下载积分: 积分 -1 分
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY write IS
PORT (
clk : IN STD_LOGIC;--50MHZ
rst_n : IN STD_LOGIC;
led : OUT STD_LOGIC;
sram_addr : OUT STD_LOGIC_VECTOR(17 DOWNTO 0);
sram_wr_n : OUT STD_LOGIC;
sram_data : INOUT STD_LOGIC_VECTOR(15 DOWNTO 0)
);
END write;
ARCHITECTURE trans OF write IS
SIGNAL delay : STD_LOGIC_VECTOR(25 DOWNTO 0);
SIGNAL wr_data : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL rd_data : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL addr_r : STD_LOGIC_VECTOR(17 DOWNTO 0);
SIGNAL sram_wr_req : STD_LOGIC;
SIGNAL sram_rd_req : STD_LOGIC;
SIGNAL led_r : STD_LOGIC;
SIGNAL cnt : STD_LOGIC_VECTOR(2 DOWNTO 0);
CONSTANT IDLE : INTEGER := 0;
CONSTANT WRT0 : INTEGER := 1;
CONSTANT WRT1 : INTEGER := 2;
CONSTANT REA0 : INTEGER := 3;
CONSTANT REA1 : INTEGER := 4;
SIGNAL cstate : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL nstate : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL sdlink : STD_LOGIC;
BEGIN
PROCESS (clk, rst_n)
BEGIN
IF (rst_n = '0') THEN
delay <= "00000000000000000000000000";
ELSIF (clk'EVENT AND clk = '1') THEN
delay <= delay + "00000000000000000000000001";
END IF;
END PROCESS;
sram_wr_req<='1' when(delay="00000000000010011100001111");
sram_rd_req<='1' when(delay="00000000000100111000011111");
PROCESS (clk, rst_n)
BEGIN
IF (rst_n = '0') THEN
wr_data <= "0000000000000000";
ELSIF (clk'EVENT AND clk = '1') THEN
IF (delay = "0000000000111010100101111") THEN
wr_data <= wr_data + "0000000000000001";
END IF;
END IF;
END PROCESS;
PROCESS (clk, rst_n)
BEGIN
IF (rst_n = '0') THEN
addr_r <= "000000000000000000";
ELSIF (clk'EVENT AND clk = '1') THEN
IF (delay = "00000000000111010100101111") THEN
addr_r <= addr_r + "000000000000000001";
END IF;
END IF;
END PROCESS;
PROCESS (clk, rst_n)
BEGIN
IF (rst_n = '0') THEN
led_r <= '0';
ELSIF (clk'EVENT AND clk = '1') THEN
IF (delay = "00000000000100111010000011") THEN
IF (wr_data = rd_data) THEN
led_r <= '1';
ELSE
led_r <= '0';
END IF;
END IF;
END IF;
END PROCESS;
led <= led_r;
PROCESS (clk, rst_n)
BEGIN
IF (rst_n = '0') THEN
cnt <= "000";
ELSIF (clk'EVENT AND clk = '1') THEN
IF (cstate =IDLE) THEN
cnt<="000";
ELSE
cnt <= cnt + "001";--延时计数器
END IF;
END IF;
END PROCESS;
PROCESS (clk, rst_n)
BEGIN
IF (rst_n = '0') THEN
cstate <="0000";
ELSIF (clk'EVENT AND clk = '1') THEN
cstate <= nstate;
END IF;
END PROCESS;
PROCESS (cstate, sram_wr_req, sram_rd_req, cnt)
BEGIN
CASE cstate IS
WHEN "0000" =>IF (sram_wr_req = '1') THEN
nstate <= "0001";
ELSIF (sram_rd_req = '1') THEN
nstate <= "0011";
ELSE
nstate <= "0000" ;
END IF;
WHEN "0001" =>
IF (cnt = "111") THEN
nstate <= "0010";
ELSE
nstate <="0001";
END IF;
WHEN "0010" =>
nstate <= "0000";
WHEN "0011" =>
IF (cnt = "111") THEN
nstate <="0100";
ELSE
nstate <= "0011";
END IF;
WHEN "0100"=>
nstate <= "0000";
WHEN OTHERS =>
nstate <= "0000";
END CASE;
END PROCESS;
sram_addr <= addr_r;
PROCESS (clk, rst_n)
BEGIN
IF (rst_n = '0') THEN
rd_data <= "0000000000000000";
ELSIF (clk'EVENT AND clk = '1') THEN
IF (cstate = "0100") THEN
rd_data <= sram_data;
END IF;
END IF;
END PROCESS;
PROCESS (clk, rst_n)
BEGIN
IF (rst_n = '0') THEN
sdlink <= '0';
ELSIF (clk'EVENT AND clk = '1') THEN
CASE cstate IS
WHEN "0000" =>
IF (sram_wr_req = '1') THEN
sdlink <= '1';
ELSIF (sram_rd_req = '1') THEN
sdlink <= '0';
ELSE
sdlink <= '0';
END IF;
WHEN "0001" =>
sdlink <= '1';
WHEN OTHERS =>
sdlink <= '0';
END CASE;
END IF;
END PROCESS;
--sdlink
sram_data <= wr_data WHEN (sdlink = '1') ELSE --sdlink 1
"00000000ZZZZZZZZ";
sram_wr_n <= NOT(sdlink);
END trans;
VHDL语言改写的,波形仿真不对,delay总是加到50,在清零了。
一周热门 更多>