EDN首页   博客首页

日志档案

发表于 2008-3-1 11:52:33

2

标签: FPGA  

fusion入门笔记

本文通过应用例子,切身处地地描述使用过程中的心得和遇到的困难,希望本人的介绍能够给您带来实实在在的帮助,同时也真诚地希望广大爱好者能够一起交流学习,共同进步。

文章主要介绍本人对周立公公司Fusion StartKitFPGA的初次使用心得,由于是初次接触和使用,文中不乏部分的个人观点和纰漏的地方,如发现错误,望读者见谅,同时期盼您的参与和支持。

阅读本文前,读者最好对Actel FPGA有一点儿认识,浅尝辄止就足够了,同时,如果是FPGA的初学者,最好就先看一下有关Libero软件的使用,至于你想用什么语言,那就各人喜好,本人就偏爱Verilog。当然,如果你以前使用过其他的FPGA和软件的话,那你使用Fusion就能更加得心应手。读者中高手如云,本人在此班门弄斧,恳请指教。

 

                                                         Yicheng

                                                          2008-2-18

 

 

 

 

 

第一例

SRAM和串口的应用

1.实验设备

(1)     硬件:PC机,Fusion StartKit 开发板全套

(2)     软件:Libero (Quartus II )

 

2.应用的器件

1SRAMIS61LV25616

2)串口

 

3.实验内容

     通过PC机,利用串口发送数据,保存到SRAM中,然后又把数据返回PC机,整个过程主要为了实现串口通信,阐明SRAM的读写方式和操作流程,加强对实验板上各器件之间的联合应用能力。

 

4.器件介绍

1IS61LV25616

     IS61LV25616ISSI公司的一款高速静态随机存取存储器,拥有264,144字,总共4,194,304位的存储空间。该芯片采用ISSI公司高性能的CMOS技术,结合先进的电路设计工艺,具有高性能、低功耗等优点的新型器件。快速存取,兼容TTL接口,三态输出等优势都使其倍受市场的青睐,应用日益广泛。

     IS61LV25616有几种不同的封装,用户应因地制宜,求其所好,但无论你的选择如何,芯片的功能引脚毫不例外的都是:地址总线(A0~A17),输入输出总线(I/O0~I/O15),片选(nCE),输出使能端(nOE),输入使能端(nWE),低字节选择端(nLB),高字节选择端(nUB),电源。

     IS61LV25616不但接口简单,控制也比较方便。以下特意从其技术文档中截取了几个时序图来加以说明。

     下图是读时序图,从图中可以看出,器件处于读状态时,nCEnOE为低电平,也就是片选和读操作有效,然后在地址总线有效的情况下输入数据被写入相应的存储空间,整个过程当然不能忽略各信号线的转换时延。由于这是一款16位的存储器,当然少不了高低位选择端nLBnUB,本例一概把数据写到低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:生成编程文件

    其中7910的菜单中如没有特殊要求就可以一路回车。

(6)在此特别提醒一下,生成编程文件前会有一个菜单,其中的选项要格外小心,事关你的芯片的命运。同时有的朋友可能不能生成编程文件,而且还会出现如下的错误。

E1:原因是没有连接网络。

E2:本人的经验所得就是因为上一次下载后没有把下载软件关闭,编程文件还被占用导致不能更改。关闭下载软件后问题将可迎刃而解。

 

7)问题解决后回到Libero软件中,可以看到前面的步骤都变绿色了,剩下来就可以下载进行硬件验证。

     FlsahPro软件中有几个地方值得注意:

1.                            如果P位置没有找到下载器,那么可以通过C位置的菜单来尝试寻找,同时一定要确保下载器和实验板已经正确连接。

2.                            点击PROGRAM键就可以开始下载了,虽然下载的时间比较长,但期间切勿断电。

6.上电实验

     经过一番折腾之后终于可以上电验证程序了,首先确保实验板的串口UART2与延长线正确连接。剩下来的就是自由发挥了。

    在串口通信的时候值得注意的就是波特率和数据格式的设置。

 

7.实验总结

实验虽然比较简单,但经过独立的设计,不但加深了对教程上例子的理解,更重要的是能过对器件的灵活应用。

 

 

 

 

下例预告:

标题:PS/2键盘和LCD的应用

语言:Verilog HDL

实验内容:

    了解PS/2LCD的工作原理,实验主要通过PS/2键盘输入字母或数字,然后在LCD上显示出来。

系统分类: CPLD/FPGA   |   用户分类: 无分类   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(637)    回复(3)  

投一票您将和博主都有获奖机会!

  • cqcrr

    2008-8-13 22:46:19

    为什么我总是对SRAM操作不对呢?可否指教一下?

  • cqcrr

    2008-8-13 22:50:05

    写是地址和数据在we的上升沿给出。oe=0,ce=0. assign we=inclk; always @ (posedge we) begin SRAM_add<= 100; SRAM_data<=100; end 读就是we=1,oe=0,ce=0 always @ (posedge inclk) begin SRAM_add<= 100; data<=SRAM_data; end

  • yicheng

    2008-8-21 15:47:54

    (1)首先我想知道你的电路有没有问题,暂且认为正确的, (2)用什么SRAM,要保证正确的读写时序。 如果你是买实验板的话,应该有例子的啊。