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

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

代码3‑1  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语言描述

代码3‑2  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;

(0)

相关推荐

  • 二进制转BCD码

    应用: 用fpga实现对数码管显示,以前通常的方法是进行整除和取余进行运算,但是fpga并不擅长乘法除法运算,所以可以用BCD码来转换. BCD码:通俗的可以理解为用四位二进制数表示一位十进制数字.例 ...

  • 他的画逼真且充满想象力,那只虎栩栩如生!

    广州一高焰2020-10-29 01:02:43 Joel Rea Joel Rea是一位备受赞誉的澳洲艺术家,以其超现实的寓言画而闻名. Rea的布面油画介于超写实主义,照片写实主义和文艺复兴时期的 ...

  • 一天一个设计实例-基于FPGA的模数、数模转换器应用设计

    基于FPGA的模数.数模转换器应用设计 本节设计采用黑金ADDA模块,模块硬件结构如下: 图7‑32 硬件结构 数模转换( DA) 电路 如硬件结构图所示, DA 电路由高速 DA 芯片. 7 阶巴特 ...

  • 一天一个设计实例-基于FPGA的数模转换器应用设计

    基于FPGA的数模转换器应用设计 1.1.1带 EEPROM 存储器的 12 位MCP4725应用设计 7.4.1.1 MCP4725简介 MCP4725 是低功耗.高精度.单通道的 12 位缓冲电压 ...

  • 一天一个设计实例-基于FPGA的模数转换器应用设计

    基于FPGA的模数转换器应用设计 1.1.1八通道AD7606应用设计 7.3.1.1 AD7606简介 AD7606 是一款集成式 8 通道数据采集系统,片内集成输入放大器.过压保护电路.二阶模拟抗 ...

  • 一天一个设计实例-AD转换器原理

    AD转换器原理 A/D 转换器的基本原理 图7‑2 A/D转换器功能示意图 A/D转换器(Analog-to-Digital Converter)又叫模/数转换器,即是将模拟信号(电压或是电流的形式) ...

  • 一天一个设计实例-LCD12864的应用设计

    LCD12864的应用设计 LCD12864的应用基本和LCD1602的自定义字库非常类似,下面就简单介绍下LCD12864. 12864 中文 汉字图形点阵液晶显示模块,可显示汉字及图形,内置 81 ...

  • 一天一个设计实例-​LCD1602的应用设计

    LCD1602的应用设计 1.1.1LCD1602的简介 工业字符型液晶,能够同时显示16x02即32个字符.(16列2行) 图6‑16 LCD1602实物图 注:为了表示的方便 ,后文皆以1表示高电 ...

  • 一天一个设计实例-LED显示模块设计

    LED显示模块设计 LED点阵模块指的是利用封装8*8的模块组合点元板形成模块,而LED模组应用中一般指两类产品:一种是用插灯或表贴封装做成的单元板,常用户外门头单红屏.户外全彩屏,室内全彩屏等:另外 ...

  • 一天一个设计实例-GPIO PWM应用

    GPIO PWM 1.1.1PWM简介 脉冲宽度调制脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对 ...

  • 一天一个设计实例-PS/2键盘及鼠标的应用设计

    PS/2键盘及鼠标的应用设计 1.1.1键盘与单次操作 PS/2接口用于许多现代的鼠标和键盘,由IBM最初开发和使用.物理上的PS/2接口有两种类型的连接器:5脚的DIN和6脚的mini-DIN.图1 ...