求指教的,真心求帮忙指教的。

2019-07-15 22:15发布

附件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 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
半飞过
2019-07-16 03:18
LIBRARY ieee;
   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,在清零了。

一周热门 更多>