打印
[FPGA]

分享FPGA经验(连载)

[复制链接]
29872|164
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
andous|  楼主 | 2014-1-2 12:42 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
沙发
andous|  楼主 | 2014-1-20 16:10 | 显示全部楼层
看到有大家的回复,楼主内心激动啊。
最近主要是回家过年,各种抢火车票中,你也知道12306.....总之你们懂得,所以就没有时间顾得上,今天一看这么多人捧场,我能不激动嘛,谢谢大家捧场。
楼主说话算话,以后持续更新中

使用特权

评论回复
板凳
andous|  楼主 | 2014-1-20 16:25 | 显示全部楼层
谈FPGA之前,先说说生产厂商吧,科普一下
全球知名的FPGA生产厂商有:
1.Altera,开发平台是Quartus II
2.Xilinx 开发平台是ISE
3.Actel ,开发平台是Libero
4.Lattice
5.Atmel
其中
Altera作为世界老牌可编程逻辑器件的厂家,是可编程逻辑器件的发明者,开发软件MAX+PLUSII和QuartusII。记得上学的时候用的用的就是altera的芯片,当时的工具也是MAX,现在感觉当时的软件很强大了,现在感觉比较弱智了,下载FPGA就是用串口,当时的时钟速率也就是25M左右,用的是试验箱,就是一个大箱子,里面有板子和说明,板子上还有8位数码管和跳线,当时感觉好神奇啊,现在感觉那是个垃圾、废物,呵呵,忘记是那个厂家了。听导师说还挺贵,不过导师也不怎么懂。之前导师伟大,现在感觉也很弱智,呵呵,调侃一下
Xilinx是FPGA的发明者,拥有世界一半以上的市场,提供90%的高端65nmFPGA产品,开发软件为ISE,其产品主要用于军用和宇航。
毕业后就是xilinx的,altera的很少用,大家一定问为什么,我也毕业的时候也是这样问老大的,老大说altera的不好用,我也有点气不忿儿,现在看来确实是这样,总结几点:
1:xilinx的资源丰富,新手会说很杂不容易用,但是如果上手之后,里面的资源确实会为你处理带来方便,比如说BUFG,IODELAY,ODDR,OBUFT等等这些小的资源,还有一些IPcore,altera的好像要少些。
FAE水平高,比如我们坛主猴哥就是xilinx的。
2:xilinx逻辑量比较大,一些大容量的FPGA好像altera没有这么大的,比如V5,V6,V7,K7,这些altera是远远没有的。不过也带来了隐患,比如说散热
不过有一点xilinx好像没有altera的做的好,那就是高速查分线,xilinx叫GTP,GTX,GTH,现在好像也区别不大了
Altera和Xilinx主要生产一般用途FPGA,其主要产品采用RAM工艺。Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺。

使用特权

评论回复
地板
andous|  楼主 | 2014-1-20 16:26 | 显示全部楼层
Lattice的芯片也用过,主要还是CPLD,用着没有感觉到区别,感觉还可以。

使用特权

评论回复
5
andous|  楼主 | 2014-1-22 11:52 | 显示全部楼层
FPGA 语言verilog 和VHDL
讲到FPGA语言就不得不讲verilog 和VHDL
本人大学学的是VHDL,工作就一直在用VHDL
我觉得veilog更接近底层,关键是更接近C,所以被FPGA工程师所喜欢
HDL特别是Verilog HDL得到在第一线工作的设计工程师的特别青睐,不仅因为HDL与C语言很相似,学习和掌握它并不困难,更重要的是它在复杂的SOC的设计上所显示的非凡性能和可扩展能力。 在学习HDL语言时,笔者认为先学习VerilogHDL比较好:一是容易入门;二是接受Verilog HDL代码做后端芯片的集成电路厂家比较多,现成的硬核、固核和软核比较多。
实现起来
veilog更容易实现
比如说要例化多个模块,我们就可以用for语句,并且这个是可综合的
我们在申明总线时,由于比较繁琐的语句的时候,稍不注意还会有书写错误
也许在veilog里面,只需要一个for语句就能搞定
begin : loop
integer i;
for(i = 0; i <= 7; i = i + 1)
begin
            if(int_stat_clr[i] ==1)
                 int_stat[i]   <= 0 ;
              end
end // block: loop71
这就话的意思就是如果stat_clr寄存器某一位为1,那么相对应的stat下面的一位就为1,这样写是不是很简单

使用特权

评论回复
6
andous|  楼主 | 2014-1-23 16:16 | 显示全部楼层
ifpga 发表于 2014-1-22 16:13
不懂C,学FPGA最好
C用的时间太长了
学起FPGA反而麻烦

言之有理,FPGA主要是学会硬件思想,FPGA语句基本上是并行操作。在加上C语言的描述。至于说学好确实要磨练,靠几节课堂学习是不行的

使用特权

评论回复
7
andous|  楼主 | 2014-1-23 16:30 | 显示全部楼层
说说wire 和reg的区别
    我们可以说reg相当于存储单元,wire相当于物理连线,但是新学FPGA的会问,存储单元是什么,其实说白了就是D触发器,有人问D触发器是什么,我晕,兄弟,学习数电的时候是不是一直在睡觉,有木有啊!
如果还是搞不明白,那你可以这么认为,wire相当于物理连线,就当与铜丝,PCB板子的走线,reg相当于芯片。wire走线延时小,几乎可以忽略不计。reg一个时钟的延时,这样就够了。
    赋值:
    wire对应的是assign,always,reg对应的always或者initial。
    例如:
    assign a = b ;把b点和a点相连接
    always @(b)
    a =b ;
       表示变化出发
      always @(posedge clk)
    a<=b ;
       把b线经过一级D触发器给a
      可以看出
这时:
1、wire型的变量综合出来一般是一根导线;
2、reg变量在always块中有两种情况:
(1)、always后的敏感表中是b 形式的,也就是不带时钟边沿的,综合出来还是组合逻辑
(2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)

FPGA用的所有的信号赋值都是wire 和 reg ;
学会了这两个也就掌握了FPGA的基本
  

使用特权

评论回复
8
andous|  楼主 | 2014-2-11 16:55 | 显示全部楼层
春节归来

使用特权

评论回复
9
andous|  楼主 | 2014-2-16 15:12 | 显示全部楼层
       对不住啊,各位,让你们久等了。
    我们做的I2C设备终于稳定了。
    我们都知道FPGA一般作为主控芯片,I2C也一般是做主设备。
    但是大家有没有遇到过做从设备的情况,从设备稳定吗?
    一般情况下,I2C做从设备是不好做的,特别是做大容量的从设备。
    I2C看起来简单,但是里面还有很多问题,如果我们只考虑简单的7为device address,8 bit register address,数据读写位也是简单的8bit的话,另外读写只是简单的I2C interface的话,还简单些。
如果要考虑大容量的,如16bit的设备地址,读的情形考虑到简单的接口外还要考虑有restart的情况,就不好做了,如果要考虑的再细一点,特别是做图像处理的话,读写EDID的时候有个搜索device设备的过程,这种情形恐怕做好的就不容易了。
     如果你是大厂商,像一些AT的ROM,Flash等公司,做的也是巨烂,我们用他们的芯片,用ARM访问也是会有一些问题,就是他们考虑的不太周全。像一些图像驱动的厂商,做的I2C相对来说还好些;通信设备的I2C写的也是很差,控制起来比较麻烦,像一些光纤收发器的厂商,也就是光模块的厂商,有的时候你用ARM等标准设备访问的时候,也会有一些问题。
      所以你如果要做个I2C的从设备的话,要考虑的周全一些,这样我们的芯片健壮性就会比较高。

使用特权

评论回复
10
andous|  楼主 | 2014-2-16 15:48 | 显示全部楼层
如果我们用FPGA只是做个小程序实验实验我们的功能,应该说还是比较容易的;
如果我们用FPGA作产品,那么你要考虑的要很多,有的时候你觉得你的代码很完美,实验也没啥问题,那么你有没有让你的程序跑一年甚至是更远时间,你有没有把你的程序放在各种环境下实验。
如果说你认为这是芯片的问题和你的程序没有关系,这就大错特错了。
这些最终考究的就是你的代码的健壮性,也就是说的精品来自于千锤百炼。
所以年轻人让多磨练啊。
以此也写给自己。

使用特权

评论回复
11
andous|  楼主 | 2014-2-19 15:33 | 显示全部楼层
GoldSunMonkey 发表于 2014-2-17 21:22
我有些想法,想和兄弟一起讨论一下

啥想法,猴哥?

使用特权

评论回复
12
andous|  楼主 | 2014-2-22 16:38 | 显示全部楼层
c547629507 发表于 2014-2-21 23:27
for 可综合了?不是一直都是在testbench里面用的吗。。。

不是的,看你的for语句是否能产生的硬件。
比如我要生成8个A模块,那么你可以写成
generate
interager i
for(i==0,i<=7,i<= i+ 1)
A U_A
(.DATA(reg))
endgenerate
这样就是可以生成8个这个模块。
或者wire或则reg也可以这样写。
而你仿真用的,有可能是一个循环,不能综合成硬件,所以他就不能被综合,提示错误

使用特权

评论回复
13
andous|  楼主 | 2014-3-5 22:18 | 显示全部楼层
谢谢大家的支持,这段时间确实有点忙,等忙完这段或者闲暇时间给大家更新。
大家都想知道什么内容,我好有的放矢,呵呵

使用特权

评论回复
14
andous|  楼主 | 2014-3-21 17:28 | 显示全部楼层
     谢谢大家的支持和肯定,这是我继续写下去的动力和源泉。
   大家觉得FPGA的难点在哪?
   

使用特权

评论回复
15
andous|  楼主 | 2014-4-9 16:56 | 显示全部楼层
重新归来,等会上传延时的问题

使用特权

评论回复
16
andous|  楼主 | 2014-4-9 17:57 | 显示全部楼层
做FPGA代码,其中一个最重要的步骤,那就是仿真。
仿真简单的说,就是验证代码是否正确。里面就包含了很多仿真的东西,测试平台的搭建,库的建立等等。

最让我们忽略的恐怕就是线延时了。

有的时候我们仿真正确,但是加载到FPGA里面就不正确了,这是为什么呢?

你忽略了一个问题,那就是线延时。

你的接口从FPGA到接口芯片肯定铺铜线过去了,中间这段走线是有延时。

所以在我们仿真的时候,测试平台要在库和顶层之间加上一定的延时。

这样来保证我们代码的正确。

使用特权

评论回复
17
andous|  楼主 | 2014-4-9 18:15 | 显示全部楼层
关于FPGA的延时以及时序等要求,基本上是skew,width,period,hold&set time。
检查时钟和控制信号在指定事件之间的时间间隔,包括:skew、width、period和nochange。 skew:$skew (reference_event, data_event, limit, notifier); 限制最大偏斜 $skew (posedge clk1, posedge clk2, 1, notifier); 当data_event time - reference_event > limit,则会报告skew time violations。 $skew是基于事件(event-based)的,如果监测到一个reference_event,那么就开始评估脉宽,只要监测到一个data_event,就会生成相应的报告,直到监测到下一个reference_event,才重新开始新的监测。如果在监测到一个data_event之前,又监测到一个reference_event,那么就放弃本次评估,重新开始新的评估。 width:$width (controlled_reference_event, limit, threshold, notifier); 限制最小脉宽 $width (posedge in, 2, notifier); 这里data_event是隐含的,它等于reference_event的相反边缘,当width < limit时,就会报告width time violations。 period:$period (controlled_reference_event, limit, notifier); 限制最小周期 $period (negedge clk, 10, notifier); 这里data_event是隐含的,它等于reference_event的相同边缘,当period < limit时,就会报告period time violations。 nochange:$nochange (reference_event, data_event, start_edge_offset, end_edge_offset, notifier); 当leading reference event time - start_edge_offset < data_event < trailing reference event time + end_edge_offset时,就会报告nochange time violations。例如: $nochange (posedge clk, data, 0 , 0); 当在clk高电平期间,data发生任何变化,就会报告nochange time violations。 有时候,路径上的时序检查是在一定条件成立的前提下进行的,这就需要引入条件操作符:&&&。需要注意的是,当存在两个及以上的条件时,要求这些条件首先在specify块外部经过适当的组合逻辑产生一个新的控制信号,然后再引入到specify块内部使用。 例如: and u1 (clr_and_set, clr, set); specify $setup (negedge data, posedge clk &&& clr_and_set, 3, notifier); endspecify
在xilinx里面,我们看post %route里面有个tinming的报告,我们在这里面可以清楚的看到这些东西

使用特权

评论回复
18
andous|  楼主 | 2014-4-16 23:29 | 显示全部楼层
fwfjndx 发表于 2014-4-13 11:38
楼主,你做IIC总线读取PCF8563时读取字节有没有出错过?我的老是显示00,不知道为什么 ...

那你已经成功了,老显示FF说明,说明你的时序不对,I2C总线是高电平,如果显示00说明你读没问题,是反馈的数据

使用特权

评论回复
19
andous|  楼主 | 2014-4-16 23:30 | 显示全部楼层
188598686 发表于 2014-4-14 15:19
建议重新开贴详细系统的讲讲,这样让学习者效率降低了不少

我也想系统的讲啊,可惜网站不给我资金和技术支持啊,呵呵,以后我要做讲师了,可以系统的给大家讲讲

使用特权

评论回复
20
andous|  楼主 | 2014-4-16 23:30 | 显示全部楼层
fwfjndx 发表于 2014-4-13 11:38
楼主,你做IIC总线读取PCF8563时读取字节有没有出错过?我的老是显示00,不知道为什么 ...

也可以试着看下上拉电阻是否正确

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

275

帖子

8

粉丝