打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一天一个设计实例-静态随机存储器 SRAM 的 Verilog HDL/VHDL语言描述
01

态随机存储器 SRAM 的 Verilog HDL语言描述

代码31  SRAM 的 Verilog HDL语言描述

1.//****************************************************************************//  

2.//# @Author: 碎碎思  

3.//# @Date:   2019-04-01 20:39:25  

4.//# @Last Modified by:   zlk  

5.//# @WeChat Official Account: OpenFPGA  

6.//# @Last Modified time: 2019-04-01 22:20:36  

7.//# Description:   

8.//# @Modification History: 2019-04-01 22:20:36  

9.//# Date                By             Version             Change Description:   

10.//# ========================================================================= #  

11.//# 2019-04-01 22:20:36  

12.//# ========================================================================= #  

13.//# |                                                                       | #  

14.//# |                                OpenFPGA                               | #  

15.//****************************************************************************//  

16.module savemod_demo  

17.(  

18.    CLOCK,  

19.     RESET,  

20.     LED,  

21.       

22.       

23.     SRAM_A,  

24.     SRAM_DB,  

25.     SRAM_WE_N,  

26.     SRAM_OE_N,  

27.     SRAM_UB_N,  

28.     SRAM_LB_N,  

29.     SRAM_CE_N  

30.       

31.       

32.);     

33.      

34.       

35.       

36.     input CLOCK,RESET;  

37.      

38.     output reg [3:0]LED;  

39.  

40.  

41.       

42.     output reg[17:0]SRAM_A;  //2^18 == 256K  

43.    inout [15:0]SRAM_DB;  

44.    output SRAM_WE_N;  //sram write enable  

45.     output SRAM_OE_N;  //sram output enable  

46.     output SRAM_UB_N;  //sram Upper-byte control(IO15-IO8)  

47.     output SRAM_LB_N;  //sram Lower-byte control(IO7-IO0)  

48.     output SRAM_CE_N;  //sram Chip enable  

49.  

50.////////////////////////////////////////////  

51.reg[25:0] delay;    //延时计数器,不断计数,周期约为1.34s,用于产生定时信号。  

52.  

53.always @ (posedge CLOCK or negedge RESET)  

54.    if(!RESET) delay <= 26'd0;  

55.    else delay <= delay+1;     

56.      

57.////////////////////////////////////////////  

58.wire sram_wr_req;   // SRAM写请求信号,高电平有效,用于状态机控制。  

59.wire sram_rd_req;   // SRAM读请求信号,高电平有效,用于状态机控制。  

60.  

61.  

62.reg[15:0] wr_data;  // SRAM写入数据寄存器。  

63.reg[15:0] rd_data;  // SRAM读出数据寄存器。  

64.  

65.  

66.assign sram_wr_req = (delay == 26'd9999);   //产生写请求信号  

67.assign sram_rd_req = (delay == 26'd19999);  //产生读请求信号  

68.      

69.always @ (posedge CLOCK or negedge RESET)   //写入数据每1.34s自增1。  

70.    if(!RESET) wr_data <= 16'd0;  

71.    else if(delay == 26'd29999) wr_data <= wr_data+1'b1;   

72.      

73.always @ (posedge CLOCK or negedge RESET)   //写入地址每1.34s自增1。  

74.    if(!RESET) SRAM_A <= 18'd0;  

75.    else if(delay == 26'd29999) SRAM_A <= SRAM_A+1'b1;     

76.      

77.always @ (posedge CLOCK or negedge RESET)   //每1.34s比较一次同一地址写入和读出的数据。  

78.    if(!RESET) LED[0] <= 1'b0;  

79.    else if(delay == 26'd20099) begin  

80.        if(wr_data == rd_data) LED[0] <= 1'b1;   //写入和读出数据一致,LED点亮  

81.        else LED[0] <= 1'b0;         //写入和读出数据不同,LED熄灭  

82.    end  

83.  

84.  

85.////////////////////////////////////////////  

86.//状态机控制SRAM的读或写操作。  

87.parameter   IDLE    = 4'd0,  

88.            WRT0    = 4'd1,  

89.            WRT1    = 4'd2,  

90.            REA0    = 4'd3,  

91.            REA1    = 4'd4;  

92.  

93.reg[3:0] cstate,nstate;   

94.  

95.////////////////////////////////////////////  

96.`define DELAY_80NS      (cnt==3'd7)     //用于产生SRAM读写时序所需要的延时。  

97.  

98.reg[2:0] cnt;   //延时计数器  

99.  

100.always @ (posedge CLOCK or negedge RESET)  

101.    if(!RESET) cnt <= 3'd0;  

102.    else if(cstate == IDLE) cnt <= 3'd0;  

103.    else cnt <= cnt+1'b1;  

104.      

105.////////////////////////////////////////////  

106.always @ (posedge CLOCK or negedge RESET)   //时序逻辑控制状态变迁。  

107.    if(!RESET) cstate <= IDLE;  

108.    else cstate <= nstate;  

109.  

110.always @ (cstate or sram_wr_req or sram_rd_req or cnt) begin    //组合逻辑控制不同状态的转换。  

111.    case (cstate)  

112.        IDLE: if(sram_wr_req) nstate <= WRT0;        //进入写状态。  

113.              else if(sram_rd_req) nstate <= REA0;   //进入读状态。  

114.              else nstate <= IDLE;  

115.        WRT0: if(`DELAY_80NS) nstate <= WRT1;  

116.              else nstate <= WRT0;             

117.        WRT1: nstate <= IDLE;          

118.        REA0: if(`DELAY_80NS) nstate <= REA1;  

119.              else nstate <= REA0;         

120.        REA1: nstate <= IDLE;          

121.        default: nstate <= IDLE;  

122.    endcase  

123.end  

124.  

125.////////////////////////////////////////////              

126.//SRAM读写数据的控制。  

127.reg sdlink;             // SRAM数据总线方向控制信号,改值取1为输出,取0为输入。  

128.  

129.always @ (posedge CLOCK or negedge RESET)       //在状态REA1时执行SRAM读数据操作。  

130.    if(!RESET) rd_data <= 16'd0;  

131.    else if(cstate == REA1) rd_data <= SRAM_DB;  

132.  

133.always @ (posedge CLOCK or negedge RESET)       //控制不同状态下SRAM数据总线的方向。SRAM只有在执行写操作时为输出,其他时候均为输入。  

134.    if(!RESET) sdlink <=1'b0;  

135.    else begin  

136.        case (cstate)  

137.            IDLE: if(sram_wr_req) sdlink <= 1'b1;  

138.                  else if(sram_rd_req) sdlink <= 1'b0;  

139.                  else sdlink <= 1'b0;  

140.            WRT0: sdlink <= 1'b1;  

141.            default: sdlink <= 1'b0;  

142.        endcase  

143.    end  

144.  

145.assign SRAM_DB = sdlink ? wr_data : 16'hzzzz;             

146.//assign SRAM_WE_N = ~sdlink;  

147.  

148.  

149.  

150.assign SRAM_UB_N = 1'b0;  

151.assign SRAM_LB_N = 1'b0;  

152.assign SRAM_CE_N = 1'b0;  

153.assign SRAM_WE_N = (~sdlink ? 1'b1 : 1'b0);  

154.assign SRAM_OE_N = (~sdlink ? 1'b0 : 1'b1);  

155./*SRAM读写结束*/  

156.  

157.endmodule  

02

静态随机存储器 SRAM 的 VHDL语言描述



代码32  SRAM 的 VHDL语言描述

1.library IEEE;  

2.use IEEE.std_logic_1164.all;  

3.use IEEE.std_logic_arith.all;  

4.use IEEE.std_logic_unsigned.all;  

5.  

6.entity sram_test is  

7.    port(  

8.        clk: in STD_LOGIC;        

9.        rst_n: in STD_LOGIC;          

10.        led: out STD_LOGIC;   

11.        sram_addr: buffer STD_LOGIC_VECTOR (14 downto 0);     

12.        sram_wr_n: out STD_LOGIC;     

13.        sram_data: inout STD_LOGIC_VECTOR (7 downto 0)  

14.    );  

15.end entity sram_test;  

16.  

17.architecture sram_randw of sram_test is  

18.    signal delay: STD_LOGIC_VECTOR (25 downto 0);     

19.    signal wr_data: STD_LOGIC_VECTOR (7 downto 0);  

20.    signal rd_data: STD_LOGIC_VECTOR (7 downto 0);    

21.    signal sram_wr_req: STD_LOGIC;    

22.    signal sram_rd_req: STD_LOGIC;    

23.    signal cnt: STD_LOGIC_VECTOR (2 downto 0);    

24.    type state is (IDLE,WRT0,WRT1,REA0,REA1);  

25.    signal cstate: state;  

26.    signal nstate: state;  

27.    signal sdlink: STD_LOGIC;     

28.begin  

29.----------------------  

30.    process(clk,rst_n)    

31.        begin  

32.            if (rst_n = '0') then     

33.                delay <= "00" & x"000000";  

34.            elsif (clk'event AND clk = '1') then      

35.                delay <= delay+1;      

36.            end if;  

37.    end process;  

38.    sram_wr_req <= '1' when (delay = 10#9999#) else   

39.                  '0';  

40.    sram_rd_req <= '1' when (delay = 10#19999#) else  

41.                  '0';  

42.----------------------  

43.    process(clk,rst_n)    

44.        begin  

45.            if (rst_n = '0') then     

46.                wr_data <= x"00";  

47.            elsif (clk'event AND clk = '1') then      

48.                if(delay = 10#29999#) then  

49.                    wr_data <= wr_data+'1';  

50.                end if;  

51.            end if;  

52.    end process;  

53.      

54.    process(clk,rst_n)    

55.        begin  

56.            if (rst_n = '0') then     

57.                sram_addr <= "000" & x"000";  

58.            elsif (clk'event AND clk = '1') then      

59.                if(delay = 10#29999#) then  

60.                    sram_addr <= sram_addr+'1';    

61.                end if;  

62.            end if;  

63.    end process;  

64.      

65.    process(clk,rst_n)    

66.        begin  

67.            if (rst_n = '0') then     

68.                led <= '0';  

69.            elsif (clk'event AND clk = '1') then      

70.                if(delay = 10#20099#) then  

71.                    if(wr_data = rd_data) then  

72.                        led <= '1';    

73.                    else  

74.                        led <= '0';                            

75.                    end if;  

76.                end if;  

77.            end if;  

78.    end process;      

79.----------------------  

80.    process(clk,rst_n)    

81.        begin  

82.            if (rst_n = '0') then     

83.                cnt <= "000";  

84.            elsif (clk'event AND clk = '1') then      

85.                if(cstate = IDLE) then  

86.                    cnt <= "000";      

87.                else   

88.                    cnt <= cnt+'1';  

89.                end if;  

90.            end if;  

91.    end process;  

92.----------------------  

93.    process(clk,rst_n)    

94.        begin  

95.            if (rst_n = '0') then     

96.                cstate <= IDLE;  

97.            elsif (clk'event AND clk = '1') then      

98.                cstate <= nstate;  

99.            end if;  

100.    end process;  

101.  

102.    process(cstate,sram_wr_req,sram_rd_req,cnt)  

103.        begin  

104.            case cstate is  

105.                when IDLE =>   

106.                    if (sram_wr_req = '1') then  

107.                        nstate <= WRT0;        

108.                    elsif (sram_rd_req = '1') then   

109.                        nstate <= REA0;    

110.                    else   

111.                        nstate <= IDLE;  

112.                    end if;  

113.                when WRT0 =>  

114.                    if (cnt = "111") then   

115.                        nstate <= WRT1;  

116.                    else  

117.                        nstate <= WRT0;            

118.                    end if;  

119.                when WRT1 =>  

120.                    nstate <= IDLE;        

121.                when REA0 =>  

122.                    if (cnt = "111") then   

123.                        nstate <= REA1;  

124.                    else   

125.                        nstate <= REA0;  

126.                    end if;  

127.                when REA1 =>   

128.                    nstate <= IDLE;        

129.                when others =>   

130.                    nstate <= IDLE;  

131.            end case;         

132.    end process;  

133.----------------------  

134.    process(clk,rst_n)    

135.        begin  

136.            if (rst_n = '0') then     

137.                rd_data <= x"00";  

138.            elsif (clk'event AND clk = '1') then  

139.                if (cstate = REA1) then  

140.                    rd_data <= sram_data;  

141.                end if;  

142.            end if;  

143.    end process;  

144.      

145.    process(clk,rst_n)    

146.        begin  

147.            if (rst_n = '0') then     

148.                sdlink <= '0';  

149.            elsif (clk'event AND clk = '1') then      

150.                case cstate is  

151.                    when IDLE =>  

152.                        if (sram_wr_req = '1') then  

153.                            sdlink <= '1';  

154.                        elsif (sram_rd_req = '1') then  

155.                            sdlink <= '0';  

156.                        else   

157.                            sdlink <= '0';  

158.                        end if;  

159.                    when WRT0 =>  

160.                        sdlink <= '1';  

161.                    when others =>  

162.                        sdlink <= '0';  

163.                end case;  

164.            end if;  

165.    end process;      

166.    sram_data <= wr_data when (sdlink = '1'else  

167.                "ZZZZZZZZ";           

168.    sram_wr_n <= NOT sdlink;   

169.end architecture sram_randw;  



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
他的画逼真且充满想象力,那只虎栩栩如生!
CORDIC算法理论与代码实现(VHDL)
我与FPGA的恋爱之任意分频和倍频
同步复位和异步复位有什么区别?
迷你时钟
1/2分频器的设计和仿真
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服