<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FPGA學習系列:內存128M的flash芯片設計

FPGA學習交流 ? 2018-09-14 11:49 ? 次閱讀

設計背景:

FLASH閃存閃存的英文名稱是"Flash Memory",一般簡稱為"Flash",它屬于內存器件的一種,是一種不揮發性( Non-Volatile )內存。閃存的物理特性與常見的內存有根本性的差異:目前各類 DDR 、 SDRAM 或者 RDRAM 都屬于揮發性內存,只要停止電流供應內存中的數據便無法保持,因此每次電腦開機都需要把數據重新載入內存;閃存在沒有電流供應的條件下也能夠長久地保持數據,其存儲特性相當于硬盤,這項特性正是閃存得以成為各類便攜型數字設備的存儲介質的基礎。

設計原理:

我們的設計用的是W25Q128FV 內存128M的flash芯片,大家可以自行在網上下載器件手冊具體看所應用的具體命令和自己項目具體的應用和想發來設計。

這款flash芯片的的存儲是一個扇區4KB,一個扇區可以存256個字,一個字是8位,一個塊是64KB,一共有256個塊組成一個存儲flash內存。

我在下面的講解中,將主要講實現一下字節的讀寫,我用的協議是SPI協議,這個芯片支持QSPI,雙端口SPI等。flash有三個狀態寄存器,每一個狀態寄存器的每一位都有各自的功能。大家可以具體的看器件手冊,我給大家簡單的講一下第一個狀態寄存器。

這個狀態寄存器第一位是可讀忙和不忙的標志位,大家可以在我們的設計中判斷芯片是否忙和不忙來是否進行下一步的操作。第二位是一個寫標志的信號,當寫使能打開的時候它位1,只有它為1的時候我們才可以進行寫,值得一說的不管是頁操作,還是擦除等命令后都會使這個標志位變成0。然后前面的命令算的上的是保護命令,具體有使用的邏輯功能。

在flash中我們寫數據前先要擦除數據你想擦除的地方,然后進行寫,如果沒有用過的flash芯片的話那么可以不用擦除。畢竟我們的flash可是掉電不丟失數據的。

我的設計思路是這樣的我們先讀出我們的器件廠商,和芯片ID,然后記性寫命令,寫使能打開,頁操作寫入數據(值得說明的是我們FLASH是新的所以沒進行擦除命令,建議擦除---關閉寫使能 -- 打開寫使能),然后讀第一個寄存器判斷芯片的第一位是否忙,不忙然后進行讀操作之后再數碼管上顯示出我們寫入的數據。

部分操作命令如下

我們的發送格式為在時鐘的上升沿寫入命令,在時鐘的下降沿讀出命令,我們用的是標準的SPI協議,端口IO0,和IO1,都是單向的。

寫使能時序:

讀使能時序:

之后別的時序我們將不展示,大家可以參考器件手冊。

設計架構圖:

我們的設計是用一個FSM控制器來控制發送什么命令,flash模塊判斷FSM發送過來的state信號來選擇應該執行什么操作,當命令寫入或者讀出后,會發送一個flag_done命令,這個命令讓我們判斷上個指令是否完成,如果完成后FAM將發送下一個命令。

設計代碼:

設計模塊

0modulefsm(clk,rst_n,flag_done,command,addr,state,data);

1

2 inputclk,rst_n;

3 inputflag_done;//輸入標志位

4 outputreg[7:0]command;//輸出命令

5 outputreg[23:0]addr;//輸出地址

6 outputreg[2:0]state; //輸出狀態模式

7 outputreg[7:0]data;//輸出寫入數據

8

9 reg[2:0]state_s;

10 reg[20:0]count;

11 always@(posedgeclk)

12 if(!rst_n)

13 begin

14 state_s <=0;

15 data <=8'd0;

16 addr <=24'd0;

17 command <=8'd0;

18 state <=0;

19 count <=0;

20 end

21 else

22 case(state_s)

23 0 : begin

24 if(count <200)//延遲一段時間

25 count <=count +1;

26 else

27 begin//發送讀廠商ID的命令

28 command <=8'h90;

29 addr <=24'd0;

30 state <=1;

31 count <=1;

32 end

33 if(flag_done)//檢查是否完成

34 state_s <=1;

35 end

36

37 1 : begin

38 if(count <200)//延遲一段時間

39 count <=count +1;

40 else

41 begin//寫使能

42 command <=8'h06;

43 state <=3;

44 count <=0;

45 end

46 if(flag_done)//檢查是否完成

47 state_s <=2;

48 end

49

50 2 : begin

51 if(count <200)//延遲一段時間

52 count <=count +1;

53 else

54 begin//頁操作

55 command <=8'h02;

56 addr <=24'd0;

57 state <=4;

58 data <=8'haa;

59 count <=0;

60 end

61 if(flag_done)//檢查是否完成

62 state_s <=3;

63 end

64

65 3 : begin

66 if(count <200)//延遲一段時間

67 count <=count +1;

68 else

69 begin//讀寄存器

70 command <=8'h05;

71 count <=0;

72 state <=5;

73 end

74 if(flag_done)//檢查是否完成

75 state_s <=4;

76 end

77

78 4 : begin

79 if(count <200)//延遲一段時間

80 count <=count +1;

81 else

82 begin//讀數據

83 command <=8'h03;

84 addr <=24'd0;

85 state <=2;

86 count <=0;

87 end

88 end

89

90 default:state_s <=0;

91 endcase

92

93endmodule

0moduleflash (clk ,rst_n,q0,q1,sclk,cs,command,addr,state, data,show_data,flag_done);

1

2 inputclk,rst_n;

3 inputq0;

4 outputregq1;

5 outputregsclk;

6 outputregcs;

7 input[7:0]command; //輸入命令

8 input[23:0]addr; //地址

9 input[2:0]state; //狀態

10 input[7:0]data; //數據

11 outputreg[23:0]show_data; //顯示

12 outputregflag_done; //命令完成標志

13

14 reg[5:0]count;

15 reg[5:0]cnt;

16 reg[31:0]temp;

17 reg[15:0]d;

18 reg[5:0]count_s;

19 reg[7:0]dou;

20 reg[39:0]xie;

21 reg[7:0]r_reg;

22

23 always@(posedgeclk)

24 if(!rst_n)

25 begin

26 sclk <=1;

27 count_s <=0;

28 end

29 elseif(cs)

30 begin

31 count_s <=0;

32 sclk <=1;

33 end

34 else

35 begin

36 if(count_s ==25-1) //產生1M的時鐘

37 begin

38 count_s <=0;

39 sclk <=~sclk;

40 end

41 else

42 count_s <=count_s +1;

43 end

44

45 reg[1:0]signle_s;

46

47 //邊沿檢測電路

48 always@(posedgeclk ornegedgerst_n)

49 if(!rst_n)

50 begin

51 signle_s <=2'b11;

52 end

53 else

54 begin

55 signle_s[0]<=sclk;

56 signle_s[1]<=signle_s[0];

57 end

58

59 assignpose_dge =signle_s[0]&&~signle_s[1];//上升沿脈沖

60 assignnege_dge =~signle_s[0]&&signle_s[1];//下降沿脈沖

61

62 reg[1:0]s;

63 reg[1:0]s1,s2,s3,s4;

64 always@(posedgeclk ornegedgerst_n)

65 if(!rst_n)

66 begin

67 q1 <=0;

68 count <=0;

69 cs <=1;

70 temp <=0;

71 d <=0;

72 cnt <=0;

73 s <=0;

74 s1 <=0;

75 s2 <=0;

76 s3 <=0;

77 flag_done <=0;

78 s4 <=0;

79 end

80 else

81 begin

82 if(state ==1)//state == 1進入讀芯片的廠商和ID

83 case(s)

84 0:begincs <=0;temp <={command,addr};s <=1; end

85

86 1 :begin

87 if(nege_dge) //下降沿發送數據

88 begin

89 if(count <32)

90 begin

91 q1 <=temp[31];

92 count <=count +1;

93 temp <= {temp[30:0],temp[31]};

94 end

95 else

96 begin

97 count <=0;

98 s <=2;

99 end

100 end

101 else

102 q1 <=q1;

103 end

104

105 2 : begin

106 if(pose_dge) //上升沿采集數據

107 begin

108 if(count <16)

109 begin

110 count <=count +1;

111 d <={d[14:0],q0};

112 end

113 else

114 begin

115 s <=3;

116 cs <=1;

117 count <=0;

118 flag_done <=1;

119 show_data <=d;

120 end

121 end

122 else

123 begin

124 s <=2;

125 end

126 end

127

128 3 : begin

129 flag_done <=0;

130 end

131

132 endcase

133

134 elseif(state ==2) //state == 2進入讀模式

135 case(s1)

136 0:begincs <=0;temp <={command,addr};s1 <=1; end

137

138 1 :begin

139 if(nege_dge)

140 begin

141 if(count <32)

142 begin

143 q1 <=temp[31];

144 count <=count +1;

145 temp <={temp[30:0],temp[31]};

146 end

147 else

148 begin

149 count <=0;

150 s1 <=2;

151 end

152 end

153 else

154 q1 <=q1;

155 end

156

157 2 : begin

158 if(pose_dge)

159 begin

160 if(count <8)

161 begin

162 count <=count +1;

163 dou <={dou[6:0],q0};

164 s1 <=2;

165 end

166 else

167 begin

168 s1 <=3;

169 cs <=1;

170 count <=0;

171 flag_done <=1;

172 show_data <=dou;

173 end

174 end

175 else

176 begin

177 s1 <=2;

178 end

179 end

180

181 3 : begin

182 flag_done <=0;

183 end

184 endcase

185

186 elseif(state ==3) //state == 3 進入寫使能模式

187 case(s2)

188 0:begincs <=0;temp <={command,addr};s2 <=1; end

189

190 1 :begin

191 if(nege_dge)

192 begin

193 if(count <8)

194 begin

195 q1 <=temp[31];

196 count <=count +1;

197 temp <={temp[30:0],temp[31]};

198 end

199 else

200 begin

201 count <=0;

202 s2 <=2;

203 cs <=1;

204 flag_done <=1;

205 end

206 end

207 else

208 q1 <=q1;

209 end

210

211 2 :flag_done <=0;

212 endcase

213

214 elseif(state ==4) //state == 4 進入頁寫操作

215 case(s3)

216 0:begincs <=0;xie <={command,addr,data};s3 <= 1;end

217

218 1 :begin

219 if(nege_dge)

220 begin

221 if(count <40)

222 begin

223 q1 <=xie[39];

224 count <=count +1;

225 xie <={xie[38:0],xie[39]};

226 end

227 else

228 begin

229 count <=0;

230 s3 <=2;

231 cs <=1;

232 flag_done <=1;

233 end

234 end

235 else

236 q1 <=q1;

237 end

238

239 2 :flag_done <=0;

240

241 endcase

242

243 elseif(state ==5) //state == 5 進入讀第一個狀態寄存器 操作

244 case(s4)

245 0:begincs <=0;r_reg <=command;s4 <=1;end

246

247 1 :begin

248 if(nege_dge)

249 begin

250 if(count <8)

251 begin

252 q1 <=r_reg[7];

253 count <=count +1;

254 r_reg <={r_reg[6:0],r_reg[7]};

255 end

256 else

257 begin

258 count <=0;

259 s4 <=2;

260 end

261 end

262 else

263 q1 <=q1;

264 end

265

266 2 : begin

267 if(pose_dge)

268 begin

269 if(count <8)

270 begin

271 count <=count +1;

272 d <={d[14:0],q0};

273 end

274 else

275 begin

276 cs <=1;

277 count <=0;

278 if(!d[8])//判斷BUSY位忙不忙, 不忙進入下個狀態

279 begin

280 flag_done <=1;

281 s4 <=3;

282 end

283 else//忙繼續讀第一個寄存器

284 s4 <=0;

285 end

286 end

287 else

288 begin

289 s4 <=2;

290 end

291 end

292

293 3 :flag_done <=0;

294

295 endcase

296

297 end

298

299endmodule

SignalTap 采集圖

圖中顯示的和我們的設計一樣,發送的各個命令也是一樣的,我們寫入的是AA然后下班接收的也是AA。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1604

    文章

    21339

    瀏覽量

    594026
收藏 人收藏

    評論

    相關推薦

    基于FPGA內存128M flash芯片控制器設計方案

    這款flash芯片的的存儲是一個扇區4KB,一個扇區可以存256個字,一個字是8位,一個塊是64KB,一共有256個塊組成一個存儲flash內存。
    發表于 04-19 09:52 ?364次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>內存</b><b class='flag-5'>128M</b> <b class='flag-5'>flash</b><b class='flag-5'>芯片</b>控制器設計方案

    內存故障維修與經驗

    128M DDR內存,但是開機顯示內存顯示128M,偶爾顯示256M。   故障分析:打開機箱檢查,發現兩條
    發表于 01-05 16:46

    TMS320DM8168有8片DDR3,每片128M,每四片一個bank,每個bank 512M,怎么理解Ti8168_evm.h 代碼是寫的每個bank 1G?

    本帖最后由 一只耳朵怪 于 2018-5-25 15:41 編輯 大家好!我最近有一個問題很疑惑,我的TI 原裝的TMS320DM8168的開發板上有8片DDR3,每片128M,每四片一個
    發表于 05-25 00:25

    想用DM6446做圖像處理,板子DDR是128M,請問我應該怎么修改 才能符合我自己的應用?

    本帖最后由 一只耳朵怪 于 2018-6-22 10:36 編輯 我想用DM6446做圖像處理, 我目前的板子是合眾達的,DDR是128M,而TI的默認文檔都是256M內存的配置,請問我應該怎么修改 才能符合我自己的應用?
    發表于 06-22 05:53

    普冉NOR FLASH產品列表:4M/16M/32M/64M/128M/256M都有現貨

    P25Q256HFlashSPI256M2.3-3.6v 普冉P25Q128HFlashSPI128M2.3-3.6v 普冉P25Q640HFlashSPI64M2.3-3.6v 普冉
    發表于 02-22 16:36

    Kintex超級設備的BPI Flash編程的選擇列表是哪個?

    嗨,我的BPI Flash制造商部件號是內存大小為2G(128M x16)的PC28F00BP33EF,在生成MCS文件并嘗試Flash theBPI后,它顯示了附件中附帶的設備列表
    發表于 04-24 08:20

    合肥求購威綸通 iE系列觸摸屏TK系列觸摸屏

    `合肥求購威綸通 iE系列觸摸屏***王姍姍參數:TFT16.7M | 24±20%V | 2個串口/1個USB/1個以太網 | 128M訂貨號:MT8050iE型號:MT8050iE威綸通 TK
    發表于 06-15 08:53

    請問在NuMirco?系列芯片Flash內存中包括哪些?

    在NuMirco?系列芯片Flash內存中包括哪些?
    發表于 12-11 07:17

    深圳回收內存芯片優勢 收購內存芯片

    ,收購三星內存芯片 收購現代內存芯片,回收美光內存芯片,回收閃迪
    發表于 08-20 16:33

    外部FLASH芯片內存

    提要:外部FLASH芯片據說通常用來放置字庫,圖形庫,反正它的大內存讓我可以避免在寫程序時因為其中的數據過大而無法編譯成功。 軟件:KEIL C51、stc-isp-15xx-v6.87C 硬件:STC8A8K64S4A12、
    發表于 12-13 06:00

    麻雀加核計劃:MQ增加雙核內置128M版本,MQ-Pro則增加四核版本

    麻雀加核計劃:MQ增加雙核內置128M版本,MQ-Pro則增加四核版本
    發表于 03-15 14:45

    通過EIM總線連接的imx6和fpga, 這個128MB EIM內存的物理位置在哪里?

    你好。 我們正在使用通過 EIM 總線連接的 imx6 和 fpga。 當cpu發生中斷時,從EIM Memory中讀取CS0的數據。 我們基本上把CS0分配為一個128M的區域。 我有個
    發表于 05-19 08:50

    紐曼s999固件升級 (含內存4G和128M)

    紐曼s999固件升級:S999TV4.0支持N制CA卡固件(機身內存128M)和S999TV4.0增加股票信息(機身內存4G)。
    發表于 04-25 18:47 ?186次下載

    Winbond -DRAM 64M 128M 256M SD

    Winbond -DRAM 64M 128M 256M SDRAM 產品規格 ‧64M 128M 256M SDRAM ‧128M 256M DDR1
    發表于 01-08 16:59 ?1478次閱讀

    K9F1G08_datasheet

    sunsumg 128m flash(128M x 8 Bit / 64M x 16 Bit NAND Flash Memory)
    發表于 12-21 11:12 ?5次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>