一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 6907|回复: 0
收起左侧

MAX II的UFM模块使用实例

[复制链接]
发表于 2009-11-21 22:50 | 显示全部楼层 |阅读模式
MAX II的UFM模块使用实例
MAX II的UFM模块使用实例
MAX II的UFM模块使用实例 - _6 ?* M0 x' k4 R9 d# c/ O
查看MAX II器件的Chip Planner:http://www.eda121.cn/Article/UploadFiles/200903/20090313101402401.GIF    其左下角这块黑色区域是用户不可用资源区,而在这片不可用区域里有一块绿色的方块是可用的。这块不可用的黑色区域叫做CFM block(配置Flash存储区),而那个绿色方块叫做UFM(用户可用的Flash存储区)。对于后者是我们今天讨论的重点,先看以下官方对此存储区作用的描述:
  v$ {& T# H: n0 Z" E0 ~9 XMAX II devices feature a single UFM block, which can be used like a serial EEPROM for storing non-volatile information up to 8,192 bits. The UFM block connects to the logic array through the MultiTrack interconnect,allowing any LE to interface to the UFM block. Figure 2–15 shows the UFM block and interface signals. The logic array is used to create customer interface or protocol logic to interface the UFM block data outside of the device. The UFM block offers the following features:
■ Non-volatile storage up to 16-bit wide and 8,192 total bits■ Two sectors for partitioned sector erase■ Built-in internal oscillator that optionally drives logic array■ Program, erase, and busy signals■ Auto-increment addressing■ Serial interface to logic array with programmable interface) n5 b4 n- m& w9 g; C0 m
http://www.eda121.cn/Article/UploadFiles/200903/20090313101403177.GIF
1 t7 a; M& g% D( i1 L5 T, k
也就是说,MAX II其实是内嵌了一块8Kbit的Flash。这个Flash原则上是不占用MAX II的其它可用逻辑资源的,不过这有个大前提:用户读写这块存储区使用altera本身的串行接口(遵循特定的通信协议)。但是这个协议也太繁琐了(个人感觉),因此,对于这块存储区读写接口altera提供了三种通用的接口供用户选择。■ I2C■ SPI■ Parallel■ None (Altera Serial Interface)最后一种就是不需要占用器件额外逻辑资源的接口,上面三种是需要消耗器件逻辑资源的接口。笔者添加了一个并行接口做测试,占用了EMP240内部86个LEs,对于资源比较紧张的应用还是很划不来的。3 p1 \% o( }: P& U" `' H
更多详细的关于UFM的信息请大家参考altera提供的MAX II datasheet。下面介绍一个使用并行接口读写UFM的实例,以及功能仿真。& z8 J9 c6 v! L0 ^. B/ G
新建一个工程,名为ufmtest,顶层模块ufmtest.v,代码如下:module ufmtest(7 j# l7 q/ T. Y" d4 G
. O5 [$ S) V! M
databus,addr,
+ v1 V& G. l. s( b
nerase,nread,nwrite,

! y; {9 q7 n! t5 Kdata_valid,nbusy

3 Z- P! m" Z  F& f) d);
inout[15:0] databus;
: A) s9 [& j7 L) n! S8 ^# T  `//Flash
数据总线 input[8:0] addr;8 ~- c, M4 @( k2 x6 s/ k1 S+ h
//Flash
地址总线input nerase;
/ k' i1 [: @0 Z//
擦除Flash某一扇区信号input nread;
! K5 b3 z8 ]% Q8 H' H//
读Flash信号input nwrite;
1 ?/ m* W! l6 f9 s! `9 D6 G+ H//
写Flash信号output data_valid;
9 h. b6 z4 D  O) Q2 I# y//Flash
数据输出有效信号output nbusy;
! g, {% M) B9 t//Flash
忙信号 assign databus = nwrite ? dataout:16'hzzzz; ! q% ^* O3 t' {0 y, i
//
写信号有效时,Flash数据总线作为输入assign datain = databus;. g7 A6 i( k1 s+ h) k
//
写入Flash数据总线连接 wire[15:0] datain;3 U9 P) M: D3 f* _# w
//Flash
写入数据wire[15:0] dataout;: t& T, p- N* P# L6 V* i
//Flash
读出数据 //例化UFM(Flash)模块para_ufm# ~& [8 t- a% q0 A+ M$ U& w
para_ufm_inst (
8 A1 K0 Z) }* q+ @& N
.addr ( addr ),
# g5 I% |# _" e
.datain ( datain ),

7 ~4 }. a& ^. v- [. O$ P; i.nerase ( nerase),

3 U' W4 Q/ ^! T# B4 v  x9 E.nread ( nread ),
( A+ ?, e9 i7 m5 r9 e
.nwrite ( nwrite),
0 m4 {' `2 A# E  G8 @$ c( W! r6 g5 w
.data_valid ( data_valid ),

9 h+ [6 A$ x5 V.dataout ( dataout ),
7 ]+ c& F6 T6 f3 b8 J
.nbusy ( nbusy )
. [& o* v' B! M
);
endmodule
1 g5 ~9 `2 w5 }* L6 Q. B
但是在例化UFM模块之前,大家需要先在MegaWizard Plug-In Manager里添加一个Flash模块。步骤如下:1,点击菜单栏里的ToolsàMegaWizard Plug-In Manager。弹出如下,点击next。& C" O& {. n- r3 j! Z
http://www.eda121.cn/Article/UploadFiles/200903/20090313101403427.GIF 2,接着选择Memory Compiler下的Flash Memory,然后在What name do you want for the output file?下路径的最后添加输出文件名为para_ufm,点击next.# y1 C6 f/ J. I( g
http://www.eda121.cn/Article/UploadFiles/200903/20090313101403895.GIF 3,接下来一路Next,需要更改设置的地方如下(我也不多废话,大家一看都明白):
3 Q& F& q7 v: mhttp://www.eda121.cn/Article/UploadFiles/200903/20090313101403333.GIF 7 F- Z+ ^8 t. P) F2 Y
http://www.eda121.cn/Article/UploadFiles/200903/20090313101404918.GIF 0 A5 K* I: Z+ k1 h1 B& [" Q4 `
完成上面步骤以后编译工程,编写testbench如下:`timescale 1ns/1nsmodule tb_ufmtest(); //inoutwire[15:0] databus;
$ L+ @# D1 ~- F+ ?2 T: |//Flash
数据总线 //inputwire data_valid;2 G( Z0 Z, `/ G' k2 a7 l
//Flash
数据输出有效信号wire nbusy;, P# q9 U- B/ F/ Y
//Flash
忙信号 //outputreg[8:0] addr;
, j1 U% k% |3 @+ X6 J0 p//Flash
地址总线reg nerase;$ \" |& V7 p4 u1 g' W% j4 U
//
擦除Flash某一扇区信号reg nread;: H$ x# y& {$ b5 z  ^  r, W5 j: z# w
//
读Flash信号reg nwrite;
& ~8 P1 E+ G7 b//
写Flash信号 reg[15:0] databus_r;1 n' o! ~/ F2 K
//
测试模块数据总线寄存器reg[15:0] rdback_data;
5 s5 C! ]/ H( p% t! r; e$ G5 J//
测试模块数据总线数据回读寄存器 assign databus = nwrite ? 16'hzzzz:databus_r; ufmtest* J7 k* l. B8 O
ufmtest(

1 n9 |9 `+ C/ w) O* E.databus(databus),
" Z( E1 {! [' O6 ?
.addr(addr),

9 \: Q* t, z- C.nerase(nerase),

$ V6 q+ [* j! O% ]# C8 j3 Y.nread(nread),

) z/ q! p: w8 s/ P& h+ V.nwrite(nwrite),
9 D1 o* M# V& ^. W1 L
.data_valid(data_valid),

) M& W+ l$ Z" I( _.nbusy(nbusy)

0 l6 p" ~, i9 F# f1 J);
parameter
  i7 O: V# P1 n  UDELAY_600US0 {8 @' W5 G+ y1 N$ G( h( G
= 600_000,
& h6 G( E! W- ]5 k1 p* m' Y//600us
延时
6 y% m6 F( z- G. c) \: P/ NDELAY_2US
- q6 [5 M5 x5 g1 d2 K" K% v, e; y= 2_000,2 V- `; e% I! I: p
//2us
延时
- N4 [# x. l  f5 k, d) t. KDELAY_5US
: O5 W4 V' T: ?9 P& s= 5_000;3 k- b6 s7 E0 ^/ N/ Q0 i
//5us
延时 initial begin( p4 u( p4 j" l6 Q8 J& L
nerase = 1;

2 [' f  q0 }6 N' jnread = 1;

& O. P0 e1 V3 E& Q- c* Jnwrite = 1;
$ S6 H3 m$ P6 A. l6 @2 Q
addr = 0;
: o9 m2 C6 q8 O; K! U. m
databus_r = 0;

: h. e, c. D: p3 u4 D
- Q* @+ u0 ]8 |; h
#DELAY_600US;- ?! _$ g" U+ n; G3 z! m: R- i  [
//0
地址写入数据99! s6 b+ z& f& ]% Y' k& L
databus_r = 99;

+ ~6 O1 ?! y: `addr = 9'd0;

5 R* [' H' r0 X1 q9 d3 gnwrite = 0;

0 g6 ]+ J5 ?  t9 T#DELAY_5US;% A# h. K( ^: G+ p9 L. z

# X& w. Y5 h; k- ~' b5 q- Qnwrite = 1;3 }9 s0 s- b; h* `! U( b5 o( r( s

3 H% u9 N9 q7 B1 l' ?5 P# a+ ^@ (posedge nbusy);

  C/ y0 `0 U. C% K0 y
! [( B: ^: V' W" ~, ]& m
#DELAY_5US;4 s5 T' E  L7 r# K" _9 j
//0
地址读出数据,保存到寄存器rdback_data中
3 {# ]6 o: {$ \6 j* Cdatabus_r = 16'hff;

) L: N4 U0 a7 V1 V/ Caddr = 9'd0;
4 w% p: l  A$ W: l; A$ w5 b
nread = 0;
0 U# l' L3 f1 L2 V
#DELAY_5US;6 r# a4 U( l2 p( ~4 g& s5 X# h$ i" F$ d
1 P, Y1 K0 Y1 d2 ~" [3 g) d
nread = 1;9 P4 r& E& r( Y! V. Y) ]- b
) \+ K' Q; V1 i% A' c
@ (posedge data_valid);

$ \- g% h# x9 wrdback_data = databus;

0 w7 r$ j- K. t6 g: |
! c% R7 p% `* w+ w9 h1 h# n: x6 N
#DELAY_600US;
6 x6 C( ^. C1 R$ b% i
$stop;% }% ^( J3 z" _; ?+ W
end endmodule 仿真波形如下:
9 y7 }8 J+ P; K: xhttp://www.eda121.cn/Article/UploadFiles/200903/20090313101404143.GIF 达到预期要求。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-5 17:59 , Processed in 0.048196 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表