序<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
本文通过应用例子,切身处地地描述使用过程中的心得和遇到的困难,希望本人的介绍能够给您带来实实在在的帮助,同时也真诚地希望广大爱好者能够一起交流学习,共同进步。
文章主要介绍本人对周立公公司Fusion StartKit的FPGA的初次使用心得,由于是初次接触和使用,文中不乏部分的个人观点和纰漏的地方,如发现错误,望读者见谅,同时期盼您的参与和支持。
阅读本文前,读者最好对Actel FPGA有一点儿认识,浅尝辄止就足够了,同时,如果是FPGA的初学者,最好就先看一下有关Libero软件的使用,至于你想用什么语言,那就各人喜好,本人就偏爱Verilog。当然,如果你以前使用过其他的FPGA和软件的话,那你使用Fusion就能更加得心应手。读者中高手如云,本人在此班门弄斧,恳请指教。
Yicheng
<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2008-2-18
第一例
SRAM和串口的应用
1.实验设备
(1) 硬件:PC机,Fusion StartKit 开发板全套
(2) 软件:Libero (Quartus II )
2.应用的器件
(1)SRAM:IS61LV25616
(2)串口
3.实验内容
通过PC机,利用串口发送数据,保存到SRAM中,然后又把数据返回PC机,整个过程主要为了实现串口通信,阐明SRAM的读写方式和操作流程,加强对实验板上各器件之间的联合应用能力。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
4.器件介绍
(1)IS61LV25616
IS61LV25616是ISSI公司的一款高速静态随机存取存储器,拥有264,144字,总共4,194,304位的存储空间。该芯片采用ISSI公司高性能的CMOS技术,结合先进的电路设计工艺,具有高性能、低功耗等优点的新型器件。快速存取,兼容TTL接口,三态输出等优势都使其倍受市场的青睐,应用日益广泛。
IS61LV25616有几种不同的封装,用户应因地制宜,求其所好,但无论你的选择如何,芯片的功能引脚毫不例外的都是:地址总线(A0~A17),输入输出总线(I/O0~I/O15),片选(nCE),输出使能端(nOE),输入使能端(nWE),低字节选择端(nLB),高字节选择端(nUB),电源。
IS61LV25616不但接口简单,控制也比较方便。以下特意从其技术文档中截取了几个时序图来加以说明。
下图是读时序图,从图中可以看出,器件处于读状态时,nCE和nOE为低电平,也就是片选和读操作有效,然后在地址总线有效的情况下输入数据被写入相应的存储空间,整个过程当然不能忽略各信号线的转换时延。由于这是一款16位的存储器,当然少不了高低位选择端nLB,nUB,本例一概把数据写到低8位,那么nLB一直为低电平,至于nUB就不作要求。
读写的过程大同小异,在此不再累赘,下图就是写时序图。
(3) 串口
串口这个词对于广大电子爱好者来说当然是再熟悉不过了,接触过单片机的朋友都知道串口是怎么的一回事,然而这里要介绍的却是有点不同,否则我都不会在此浪费篇幅。
单片机的串口是包含于硬件中,我们只要通过指令控制相应的寄存器,就可以通信无阻,然而FPGA就没有这样的免费午餐。但我们可以通过串口的通信原理,利用硬件语言生成一个拥有串口通信功能的模块,本人为其取名,美其名曰“串口”。
生成的串口模块一定要注意时钟问题,特别是在程序的移植过程中,系统时钟会直接影响串口的通信波特率。同时,串口的波特率也可以在允许的范围内适当修改。
上图是在Q2中的使用例子,只要通过把50M的时钟改为48M的时钟环境,就可以方便地移植到Fusion上来了,当然Fusion套件的例子中也有相应的模块,但在此不敢妄自公开。
程序原码如下:
module UART(rxd,clock,out,end_flag);
input clock; //系统时钟
input rxd; //接收
output[7:0] out; //接收到的8位数据
output end_flag;
reg[7:0] out;
reg end_flag;
reg recclk;//16倍于9600的时钟
reg[8:0]divcnt;//分频系数
reg[9:0]data_buf; //接收数据缓冲
reg[3:0]cnt;
reg[3:0]bitpos; //串行数据当前位
reg[7:0]sbuf;
reg[1:0]state;
parameter st0=2'b00, //状态机定义
st1=2'b01,
st2=2'b11;
// st3=2'b10;
always@(posedge clock) //时钟分频325, 产生9600 16倍的频率
begin //时钟分频162, 产生19200 16倍的频率
if(divcnt<9'd162)
begin
divcnt=divcnt+1'b1;
recclk=1'b0;
end
else
begin
divcnt=1'b0;
recclk=1'b1;
end
end
always@(posedge recclk)//16倍于9600的时钟
begin
case(state)
st0:begin
// end_flag=1'b1;
end_flag=1'b0;
if(rxd==1'b1)
begin
cnt=4'h0;
state=st0;//进入空闲状态
end
else
begin
cnt=cnt+1'b1;
end
if(cnt==4'h2)
begin
state=st1;
cnt=4'h0;
bitpos=0;
end
end
st1:begin
if(cnt==4'hf)
begin
cnt=4'h0;
data_buf[bitpos]=rxd;
bitpos=bitpos+1'b1;
if(bitpos==4'd9)//9个数据
begin
bitpos=4'd0;
state=st2;
end
end
else
begin
cnt=cnt+1'b1;
end
end
st2:begin//进入数据传送状态
// end_flag=1'b0; //下降
end_flag=1'b01;//接收完产生一个上降沿
sbuf=data_buf[7:0];
out=sbuf;
state=st0;
end
default:state=st0;
endcase
end
endmodule
以上程序中重点部分都均以注析,究其原理比较通俗,因此蜻蜓点水,一带而过,不再深入剖析。
5.软件编程
首先我要从新说明一下,我用的是Fusion StartKit板,所以编译和下载都非使用其相应的软件Libero,但我介绍过程中的流程和思想并不局限于此。
当我们对器件的性能和操作都有所了解后,我们就可以结合应用方案进行程序的构思,我想再强调一下,不一定要局限于应用的平台,因此,刚开始写程序时,我会使用自己相对比较熟练的Q2。
程序的构思给了我们一个程序的骨架,接下来就是程序的编写以及因人而异的编译次数。
当我们把几个模块的程序都在Q2中编译通过后,就可以移植到Libero中,至于移植后是否会产生错误,本人暂时还没遇到,警告就会因约束条件而异,但是这种方法只是权宜之计,长远来说还是熟练掌握Libero为妙。
下面就针对Libero软件来介绍一下工程的流程。
(1) 打开Libero软件,选择器件,新建工程这些都是在所难免。这些都不想罗嗦了,但不要用中文名字。
(2) 把刚才在Q2中编好的程序导入工程中,文件会立刻出现在工程菜单下。如图中红线圈内:
(3) 接下来就可以进行综合了,如果你不到下面的界面怎么来的话,可以先按图中1位置的按键,然后眼前一亮,当然就会看到下图。然后再按2位置的图标,进入综合的界面。
(4)综合的界面也不复杂,随手按下5位置的RUN键就可以了,直到6位置变成如图就预示离成功不远了。`
(5)返回工程界面,可以看见2的位置变绿色了,同时A位置也多了一个勾,也就是可以进行下面的步骤了,点击3位置,布局和布线的界面如下:
如果是第一次进入Design,那么需要先进行一些设置,如芯片型号,封状,速度等级等,只要选择跟你板相符合的选项就可以一直按OK键了,最后就看到上图界面,按照箭头方向和数值一路点击。
点击7:进行编译
点击8;进行引脚配置(如果引脚没有更改就可以进入9)
点击9:布局布线
点击10:生成编程文件
其中7,9,10的菜单中如没有特殊要求就可以一路回车。
(6)在此特别提醒一下,生成编程文件前会有一个菜单,其中的选项要格外小心,事关你的芯片的命运。同时有的朋友可能不能生成编程文件,而且还会出现如下的错误。
E1:原因是没有连接网络。
E2:本人的经验所得就是因为上一次下载后没有把下载软件关闭,编程文件还被占用导致不能更改。关闭下载软件后问题将可迎刃而解。
(7)问题解决后回到Libero软件中,可以看到前面的步骤都变绿色了,剩下来就可以下载进行硬件验证。
FlsahPro软件中有几个地方值得注意:
1. 如果P位置没有找到下载器,那么可以通过C位置的菜单来尝试寻找,同时一定要确保下载器和实验板已经正确连接。
2. 点击PROGRAM键就可以开始下载了,虽然下载的时间比较长,但期间切勿断电。
6.上电实验
经过一番折腾之后终于可以上电验证程序了,首先确保实验板的串口UART2与延长线正确连接。剩下来的就是自由发挥了。
在串口通信的时候值得注意的就是波特率和数据格式的设置。
7.实验总结
实验虽然比较简单,但经过独立的设计,不但加深了对教程上例子的理解,更重要的是能过对器件的灵活应用。
下例预告:
标题:PS/2键盘和LCD的应用
语言:Verilog HDL
实验内容:
了解PS/2和LCD的工作原理,实验主要通过PS/2键盘输入字母或数字,然后在LCD上显示出来。
用户158260 2008-9-17 21:15
用户1532875 2008-8-21 15:47
用户1359586 2008-8-13 22:50
用户1359586 2008-8-13 22:46
用户1373845 2008-4-9 22:57
用户39683 2008-4-8 11:39
xxmlyt 2008-4-4 17:32
用户21270 2008-3-25 22:28
Cybershu 2008-3-14 17:57
用户113790 2008-3-13 21:16