文档库 最新最全的文档下载
当前位置:文档库 › FPGA及verilog经典语法总结

FPGA及verilog经典语法总结

FPGA及verilog经典语法总结
FPGA及verilog经典语法总结

2011-10-12 论坛笔记整理

第一部分vhdl程序中的基本问题总结 (1)

1.关于端口 (1)

2.信号和变量 (1)

3.位(矢量)与逻辑(矢量) (2)

4.关于进程 (3)

(一). 多余时钟的引入 (3)

(二). 输出多驱动 (4)

5.关于VHDL学习中的几点说明................................................................................................5 第二部分FPGA设计学习经验 (6)

1.FPGA学习的一些误区 (6)

2.设计方法经验 (9)

3.fpga设计的精髓—时序设计 (10)

(一)总体设计方案和逻辑详细设计方案 (10)

(二)如何提高电路工作频率(加约束,流水、切割状态) (11)

(三)做逻辑的难点在于系统结构设计和仿真验证 (12)

4.设计规范很重要 (13)

(一)设计必须文档化 (14)

(二)代码规范 (14)

(三)ALTERA参考设计准则 (16)

第三部分项目经验小结.....................................................................................................................17 经验

一...........................................................................................................................................17 经验

二 (18)

第一部分vhdl程序中的基本问题总结

1. 关于端口

VHDL 共定义了5 种类型的端口,分别是In, Out,Inout, Buffer 及Linkage,实际设计时只会用到前四种。In 和Out 端口的使用相对简单。这里,我们主要讲述关于buffer 和inout使用时的注意事项。

inout和buffer 区别

INOUT 为输入输出双向端口,即从端口内部看,可以对端口进行赋值,即输出数据。也可以从此端口读入数据,即输入;

BUFFER 为缓冲端口,功能与INOUT 类似,区别在于当需要读入数据时,只允许内部回读内部产生的输出信号,即反馈。举个例子,设计一个计数器的时候可以将输出的计数信号定义为BUFFER,这样回读输出信号可以做下一计数值的初始值。

buffer 顾名思义就是缓存,它是作为输出使用的,因为在模块内,是不可以将输出赋值给其他信号的,例如定义b: out std_logic;我们现在要将b 赋值给信号a,就会出错,但是如果b 的类型为buffer 就可以执行操作;

inout是双向端口,即可以作为输入也可以作为输出,跟buffer 的作用完全不同,要注意的是inout类型的数据在不作为输入使用时必须被置为高阻“Z”状态,否则它作为输出的功能将不能正确执行。

与Out 端口比,Buffer 端口具有回读功能,也即内部反馈,但在设计时好不要使用buffer,因为buffer 类型的端口不能连接到其他类型的端口上,无法把包含该类型端口的设计作为子模块元件例化,不利于大型设计和程序的可读性。若设计时需要实现某个输出的回读功能,可以通过增加中间信号作为缓冲,由该信号完成回读功能。

双向端口Inout是四种端口类型中为特殊的一种,难以学习和掌握,为此专门提供一个简单程序进行阐述,部分程序如下:

... …

① DataB<=Din when CE=’1’ and Rd=’0’ else

②(others=>’Z’);

③Dout<=DataB when CE=’1’ and Rd=’1’ else

④( others=>’1’ );

… …

程序中DataB为双向端口,编程时应注意的是,当DataB作为输出且空闲时,必须将其设为高阻态挂起,即有类似第②行的语句,否则实现后会造成端口死锁。而当DataB作为有效输入时,DataB输出必须处于高阻态,对于该例子中即,当CE=’1’ and Rd=’1’时,输出DataB应处于高阻态。

2. 信号和变量

常数、信号和变量是VHDL 中主要的对象,分别代表一定的物理意义。常数对应于数字电路中的电源或地;信号对应某条硬件连线;变量通常指临时数据的局部存储。信号和变量功能相近,用法上却有很大不同。

对于变量赋值操作无延迟,初学者认为这个特性对VHDL 设计非常有利,但这只是理论上的。

基于以下几点原因,我们建议,编程时还是应以信号为主,尽量减少变量的使用。

(1)变量赋值无延时是针对进程运行而言的,只是一个理想值,对于变量的操作往往被综

合成为组合逻辑的形式,而硬件上的组合逻辑必然存在输入到输出延时。当进程内关于变量的操作

越多,其组合逻辑就会变得越大越复杂。假设在一个进程内,有关于变量的3 个级连操作,其输出

延时分别为5ns,6ns,7ns,则其快的时钟只能达到18ns。相反,采用信号编程,在时钟控制下,往往

综合成触发器的形式,特别是对于FPGA 芯片而言,具有丰富的触发器结构,易形成流水作业,其

时钟频率只受控于延时大的那一级,而不会与变量一样层层累积。假设某个设计为3 级流水作业,

其每一级延时分别为10ns,11ns,12ns,则其快时钟可达12ns。因此,采用信号反而更能提高设计的

速度。

(2)由于变量不具备信息的相关性,只有当前值,因此也无法在仿真时观察其波形和状态

改变情况,无法对设计的运行情况有效验证,而测试验证工作量往往会占到整个设计70%~80%的

工作量,采用信号则不会存在这类问题。

(3)变量有效范围只能局限在单个进程或子程序中,要想将其值带出与其余进程、子模块

之间相互作用,必须借助信号,这在一定程度上会造成代码不够简洁,可读性下降等缺点。

当然,变量也具有其特殊的优点,特别是用来描述一些复杂的算法,如图像处理,多维数组变

换等。

3. 位(矢量)与逻辑(矢量)

bit 或其矢量形式bit_vector只有’0’和’1’两种状态,数字电路中也只有’0’和’1’两种逻辑,因此会给初

学者一个误区,认为采用位(矢量)则足够设计之用,而不必像std_logic那样出现’X’,’U’,’W’ 各种状态,增加编程难度。但实际情况却并非如此,以一个简单D 型触发器设计为例

… …

① process(clk)

② begin

③if clk’event and clk=’1’ then

④ Q<=D;

⑤ end if;

⑥ end process;

… …

实际中clk对数据端D 的输入有一定的时间限制,即在clk上升沿附近(建立时间和保持时间之内),D 必须保持稳定,否则Q 输出会出现亚稳态。

当clk和D 时序关系不满足时,由于bit 只有’0’或’1’,系统只能随机的从’0’和’1’中给Q 输出,

这样的结果显然是不可信的;而采用std_logic类型,则时序仿真时会输出为一个’X’,提醒用户建立

保持时间存在问题,应重新安排D 和clk之间时序关系。

此外,对于双向总线设计(前面已提及)、 FPGA/CPLD 上电配置等问题,如果没有’Z’,’X’等状态,根本无法进行设计和有效验证。

4. 关于进程

进程(Process)是VHDL 中为重要的部分,大部分设计都会用到Process 结构,因此掌握Process 的使用显得尤为重要。以下是初学和使用Process 经常会出错的例子。

(一). 多余时钟的引入

在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿时,执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需要程序设计

判断其上跳沿出现与否。这时,很容易写出如下程序:

① process(Ctl_a) -- Ctl_a即为该输入信号

② begin

③if Ctl_a’event and Ctl_a=’1’ then

④… … ; --执行相应操作

⑤ end if ;

⑥ end process;

由于出现第③行这类语句,综合工具自动默认Ctl_a为时钟,某些FPGA 更会强行将该输入约

束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的程序容易

造成多时钟现象,增加设计的难度。解决的办法可以如下,将Ctl_a增加一级状态Ctl_areg寄存,

通过对Ctl_a和Ctl_areg状态判断上跳与否,改正程序如下:

① process(clk)

② begin

③if clk’event and clk=’1’ then

④ Ctl_areg<=Ctl_a;--产生相邻状态

⑤if Ctl_areg=’0’ and Ctl_a=’1’ then--上跳判断

⑥… … ; --执行相应操作

⑦ end if;

⑧ end if;

⑨ end process;

程序中第④行用以产生两个相邻状态,第⑤行对前后状态进行判断是否有上跳现象发生。其中,需注意的是clk的时钟频率应明显快于Ctl_a信号的变化频率,以保证正确采样。

(二). 输出多驱动

误用Process 经常会引起输出多驱动源的发生,即在两个以上的进程内对同一信号赋值操作。

以下程序就出现了这类情况:

⑴ Proc_a: process(clk)

⑵ begin

⑶if clk’event and clk=’1’ then

⑷ Dout<=Din_A;

⑸ end if

⑹ end process;;

⑻ Proc_b:process(sel_en)

⑼ begin

⑽if sel_en=’1’ then

⑾ Dout<=Din_B;

⑿ end if;

⒀ end process;

进程Proc_a和Proc_b中都出现了对Dout的赋值语句,设计者原本的想法是,只要合理控制

好clk和sel_en输入,使其不发生冲突,即clk上升沿时sel_en不为’1’;sel_en为’1’时,不出现

clk的上升沿,这样Proc_a,Proc_b两个进程就不会发生冲突。但综合时,综合工具会将所有可能

情况全部罗列进去,包括第⑶行和第⑽行同时成立的情况,此时对于Dout就有Din_A和Din_B两

个输入驱动,Dout不知接收哪一个,因此该程序无法综合,改正的方法是只要将两个进程合并成一

个即可。

由于进程在VHDL 中的重要性,对此专门做了一个总结如下:

(1)一个进程中不允许出现两个时钟沿触发,(Xilinx 公司CoolRunner系列CPLD 支持单

个时双钟的双触发沿除外)

(2)对同一信号赋值的语句应出现在单个进程内,不要在时钟沿之后加上else 语句,如ifclk’event and clk=’1’ then - else … 的结构,现有综合工具支持不了这种特殊的触发器结构

(3)当出现多层IF 语句嵌套时,好采用CASE 语句替代,一是减少多层嵌套带来的延时,二来可以增强程序的可读性

(4)顺序语句如IF 语句、CASE 语句、LOOP 语句、变量赋值语句等必须出现在进程、函

数或子程序内部,而不能单独出现在进程之外

(5)进程内部是顺序执行的,进程之间是并行运行的;VHDL 中的所有并行语句都可以理

解为特殊的进程,只是不以Process 结构出现,其输入信号和判断信号就是隐含的敏感表。

5.关于VHDL 学习中的几点说明

与软件语言相比,VHDL 重要的特点就在于它的并行运行特性,当设计好的电路上电后,器件

内部所有信号将同时并发工作,而不会以软件方式按照程序顺序执行,即使在进程内部也是趋向并

行工作的。例如以下程序:

①process(clk)

②begin

③if clk’event and clk=’1’ then

④<= ;

⑤<= ;

⑥end if;;

⑦end process;

综合的结果两个独立的 D 型触发器,虽然进程内部应按顺序执行,但是硬件实现后,只要采

样到时钟上升沿,和状态会同时翻转,而不会先执行的变化,然后才会去执行的转变。因此,VHDL 学习过程中,应加强硬件概念的理解,没有硬件概念或是硬件概念不强,在设计时,往往会

将VHDL 设计以软件编程的方式来处理,而得出一些不可思议的结果。

作为一门硬件描述语言,VHDL 几乎可以用来描述现有的大型系统数字电路、算法以及其它设计。但是,限于目前综合工具的水平,VHDL 中的许多语法还不能支持,例如:dout<=din after 5 ns;

综合时就无法达到如此精度,因此这条语句主要用来编写测试激励,而很少出现在设计实体中。类似的情况还有很多,目前VHDL 设计使用的也只是整个标准中的一部分,这也正是VHDL 的“可综合子集”性质,它一定程度上限制了VHDL 的广泛应用,但是随着综合技术的发展,这种情况会逐渐

得以改善,VHDL 也将在各个领域中发挥出愈来愈重要的作用。

第二部分FPGA设计学习经验

1. FPGA 学习的一些误区

(一)不熟悉FPGA的内部结构,不了解可编程逻辑器件的基本原理。

FPGA为什么是可以编程的?恐怕很多菜鸟不知道,他们也不想知道。因为他们觉得这是无关

紧要的。他们潜意识的认为可编程嘛,肯定就是像写软件一样啦。软件编程的思想根深蒂固,看到Verilog或者VHDL就像看到C语言或者其它软件编程语言一样。一条条的读,一条条的分析。如果这些菜鸟们始终拒绝去了解为什么FPGA是可以编程的,不去了解FPGA的内部结构,要想学会FPGA 恐怕是天方夜谭。虽然现在EDA软件已经非常先进,像写软件那样照猫画虎也能综合出点东西,但也许只有天知道EDA软件后综合出来的到底是什么。也许点个灯,跑个马还行。这样就是为什么很多菜鸟学了N久以后依然是一个菜鸟的原因。那么FPGA为什么是可以“编程”的呢?首先来

了解一下什么叫“程”。

启示“程”只不过是一堆具有一定含义的01 编码而已。

编程,其实就是编写这些01 编码。只不过我们现在有了很多开发工具,通常都不是直接编写这些01 编码,而是以高级语言的形式来编写,后由开发工具转换为这种01 编码而已。对于软件编程而言,处理器会有一个专门的译码电路逐条把这些01 编码翻译为各种控制信号,然后控制其内部的电路完成一个个的运算或者是其它操作。所以软件是一条一条的读,因为软件的操作是一步一步完

成的。而FPGA的可编程,本质也是依靠这些01 编码实现其功能的改变,但不同的是FPGA之所

以可以完成不同的功能,不是依靠像软件那样将01 编码翻译出来再去控制一个运算电路,FPGA里面没有这些东西。

FPGA内部主要三块:可编程的逻辑单元、可编程的连线和可编程的IO模块。可编程的逻辑单元是什么?其基本结构某种存储器(SRAM、FLASH等)制成的4 输入或6 输入1输出地“真值表”加上一个D触发器构成。任何一个4 输入1 输出组合逻辑电路,都有一张对应的“真值表”,同样的如果用这么一个存储器制成的4 输入1 输出地“真值表”,只需要修改其“真值表”内部值就可以等效出任意4 输入1 输出的组合逻辑。这些“真值表”内部值是什么?就是那些01 编码而已。如果要实现时序逻辑电路怎么办?这不又D触发器嘛,任何的时序逻辑都可以转换为组合逻辑+D触发器来完成。但这毕竟只实现了4 输入1 输出的逻辑电路而已,通常逻辑电路的规模那是相当的大哦。那怎么办呢?这个时候就需要用到可编程连线了。在这些连线上有很多用存储器控制的链接点,通过改写对应存储器的值就可以确定哪些线是连上的而哪些线是断开的。这就可以把很多可编程逻辑单元组合起来形成大型的逻辑电路。后就是可编程的IO,这其实是FPGA作为芯片级使用必须要注意的。任何芯片都必然有输入引脚和输出引脚。有可编程的IO可以任意的定义某个非专用引脚(FPGA中有专门的非用户可使用的测试、下载用引脚)为输入还是输出,还可以对IO的电平标准进行设置。总归一句话,FPGA之所以可编程是因为可以通过特殊的01代码制作成一张张“真值表”,并将这些“真值表”组合起来以实现大规模的逻辑功能。不了解FPGA内部结构,就不能明白终代码如何变到FPGA 里面去的。也就无法深入的了解如何能够充分运用FPGA。现在的FPGA,不单单是有前面讲的那三块,还有很多专用的硬件功能单元,如何利用好这些单元实现复杂的逻辑电

路设计,是从菜鸟迈向高手的路上必须要克服的障碍。而这一切,还是必须先从了解FPGA内部逻辑及其工作原理做起。

(二)错误理解HDL语言,怎么看都看不出硬件结构。

HDL 语言的英语全称是:Hardware Deion Language,注意这个单词Deion,而不是Design。老外为什么要用Deion 这个词而不是Design 呢?因为HDL 确实不是用用来设计硬件的,而仅仅是用来描述硬件的。

描述这个词精确地反映了HDL 语言的本质,HDL 语言不过是已知硬件电路的文本表现形式而已,只是将以后的电路用文本的形式描述出来而已。而在编写语言之前,硬件电路应该已经被设计出来了。语言只不过是将这种设计转化为文字表达形式而已。但是很多人就不理解了,既然硬件都已经被设计出来了,直接拿去制作部就完了,为什么还要转化为文字表达形式再通过EDA 工具这些麻烦的流程呢?其实这就是很多菜鸟没有了解设计的抽象层次的问题,任何设计包括什么服装、机械、广告设计都有一个抽象层次的问题。就拿广告设计来说吧,初的设计也许就是一个概念,设计出这个概念也是就是一个点子而已,离终拍成广告还差得很远。硬件设计也是有不同的抽象层次,每一个层次都需要设计。

高的抽象层次为算法级、然后依次是体系结构级、寄存器传输级、门级、物理版图级。使用HDL 的好处在于我们已经设计好了一个寄存器传输级的电路,那么用HDL 描述以后转化为文本的形式,剩下的向更低层次的转换就可以让EDA 工具去做了,这就大大的降低了工作量。这就是可综合的概念,也就是说在对这一抽象层次上硬件单元进行描述可以被EDA 工具理解并转化为底层的门级电路或其他结构的电路。在FPGA 设计中,就是在将这以抽象层级的意见描述成HDL 语言,就可以通过FPGA 开发软件转化为问题1 中所述的FPGA 内部逻辑功能实现形式。HDL 也可以描述更高的抽象层级如算法级或者是体系结构级,但目前受限于EDA 软件的发展,EDA 软件还无法理解这么

高的抽象层次,所以HDL 描述这样抽象层级是无法被转化为较低的抽象层级的,这也就是所谓的不可综合。所以在阅读或编写HDL 语言,尤其是可综合的HDL,不应该看到的是语言本身,而是要看到语言背后所对应的硬件电路结构。如果看到的HDL 始终是一条条的代码,那么这种人永远摆脱不了菜鸟的宿命。假如哪一天看到的代码不再是一行行的代码而是一块一块的硬件模块,那么恭喜脱

离了菜鸟的级别,进入不那么菜的鸟级别。

(三)FPGA本身不算什么,一切皆在FPGA之外这一点恐怕也是很多学FPGA的菜鸟难理解的地方。

FPGA是给谁用的?很多学校解释为给学微电子专业或者集成电路设计专业的学生用的,其实

这不过是很多学校受资金限制,卖不起专业的集成电路设计工具而用FPGA工具替代而已。其实FPGA是给设计电子系统的工程师使用的。这些工程师通常是使用已有的芯片搭配在一起完成一个

电子设备,如基站、机顶盒、视频监控设备等。当现有芯片无法满足系统的需求时,就需要用FPGA 来快速的定义一个能用的芯片。前面说了,FPGA里面无法就是一些“真值表”、触发器、各种连线以及一些硬件资源,电子系统工程师使用FPGA进行设计时无非就是考虑如何将这些以后资源

组合起来实现一定的逻辑功能而已,而不必像IC设计工程师那样一直要关注到后芯片是不是能够被

制造出来。本质上和利用现有芯片组合成不同的电子系统没有区别,只是需要关注更底层的资源而已。要想把FPGA用起来还是简单的,因为无非就是那些资源,在理解了前面两点再搞个实验板,

跑跑实验,做点简单的东西是可以的。而真正要把FPGA用好,那光懂点FPGA知识就远远不够了。因为终要让FPGA里面的资源如何组合,实现何种功能才能满足系统的需要,那就需要懂得更多更

广泛的知识。

目前FPGA的应用主要是三个方向:

第一个方向,也是传统方向主要用于通信设备的高速接口电路设计,这一方向主要是用FPGA

处理高速接口的协议,并完成高速的数据收发和交换。这类应用通常要求采用具备高速收发接口的FPGA,同时要求设计者懂得高速接口电路设计和高速数字电路板级设计,具备EMC/EMI设计知识,以及较好的模拟电路基础,需要解决在高速收发过程中产生的信号完整性问题。FPGA初以及到目

前广的应用就是在通信领域,一方面通信领域需要高速的通信协议处理方式,另一方面通信协议随

时在修改,非常不适合做成专门的芯片。因此能够灵活改变功能的FPGA就成为首选。到目前为止FPGA的一半以上的应用也是在通信行业。

第二个方向,可以称为数字信号处理方向或者数学计算方向,因为很大程度上这一方向已经大

大超出了信号处理的范畴。例如早就在2006 年就听说老美将FPGA用于金融数据分析,后来又见

到有将FPGA用于医学数据分析的案例。在这一方向要求FPGA设计者有一定的数学功底,能够理

解并改进较为复杂的数学算法,并利用FPGA内部的各种资源使之能够变为实际的运算电路。目前

真正投入实用的还是在通信领域的无线信号处理、信道编解码以及图像信号处理等领域,其它领域

的研究正在开展中,之所以没有大量实用的主要原因还是因为学金融的、学医学的不了解这玩意。

不过近发现欧美有很多电子工程、计算机类的博士转入到金融行业,开展金融信号处理,相信随着

转入的人增加,FPGA在其它领域的数学计算功能会更好的发挥出来,而我也有意做一些这些方面

的研究。不过国内学金融的、学医的恐怕连数学都很少用到,就不用说用FPGA来帮助他们完成数

学_ 运算了,这个问题只有再议了。

第三个方向就是所谓的SOPC方向,其实严格意义上来说这个已经在FPGA设计的范畴之内,

只不过是利用FPGA这个平台搭建的一个嵌入式系统的底层硬件环境,然后设计者主要是在上面进

行嵌入式软件开发而已。设计对于FPGA本身的设计时相当少的。但如果涉及到需要在FPGA做专

门的算法加速,实际上需要用到第二个方向的知识,而如果需要设计专用的接口电路则需要用到第

一个方向的知识。

就目前SOPC方向发展其实远不如第一和第二个方向,其主要原因是因为SOPC以FPGA为主,或者是在FPGA内部的资源实现一个“软”的处理器,或者是在FPGA内部嵌入一个处理器核。

但大多数的嵌入式设计却是以软件为核心,以现有的硬件发展情况来看,多数情况下的接口都已经

标准化,并不需要那么大的FPGA逻辑资源去设计太过复杂的接口。而且就目前看来SOPC相关的

开发工具还非常的不完善,以ARM为代表的各类嵌入式处理器开发工具却早已深入人心,大多数以ARM为核心的SOC芯片提供了大多数标准的接口,大量成系列的单片机/嵌入式处理器提供了相关

行业所需要的硬件加速电路,需要专门定制硬件场合确实很少。通常是在一些特种行业才会在这方

面有非常迫切的需求。即使目前Xilinx将ARM的硬核加入到FPGA里面,相信目前的情况不会有太大改观,不要忘了很多老掉牙的8 位单片机还在嵌入式领域混呢,嵌入式主要不是靠硬件的差异而

更多的是靠软件的差异来体现价值的。我曾经看好的是cypress的Psoc这一想法。和SOPC系列

不同,Psoc的思想史载SOC芯片里面去嵌入那么一小块FPGA,那这样其实可以满足嵌入式的那

些微小的硬件接口差异,比如某个运用需要4 个USB,而通常的处理器不会提供那么多,就可以用

这么一块FPGA来提供多的USB接口。而另一种运用需要6 个UART,也可以用同样的方法完成。对于嵌入式设计公司来说他们只需要备货一种芯片,就可以满足这些设计中各种微小的差异变化。

其主要的差异化仍然是通过软件来完成。但目前cypress过于封闭,如果其采用ARM作为处理器内核,借助其完整的工具链。同时开放IP合作,让大量的第三方为它提供IP设计,其实是很有希望的。但目前cypress的日子怕不太好过,Psoc的思想也不知道何时能够发光。

(四)数字逻辑知识是根本。

无论是FPGA的哪个方向,都离不开数字逻辑知识的支撑。FPGA说白了是一种实现数字逻辑

的方式而已。如果连基本的数字逻辑的知识都有问题,学习FPGA的愿望只是空中楼阁而已。而这,恰恰是很多菜鸟不愿意去面对的问题。数字逻辑是任何电子电气类专业的专业基础知识,也是必须

要学好的一门课。很多人无非是学习了,考个试,完了。如果不能将数字逻辑知识烂熟于心,养成

良好的设计习惯,学FPGA到后仍然是雾里看花水中望月,始终是一场空的。以上四条只是我目前

总结菜鸟们在学习FPGA时所容易跑偏的地方,FPGA的学习其实就像学习围棋一样,学会如何在

棋盘上落子很容易,成为一位高手却是难上加难。要真成为李昌镐那样的神一般的选手,除了靠刻

苦专研,恐怕还确实得要一点天赋。

2. 设计方法经验

在做大系统时,一定要自顶向下的设计,当每个底层模块用语言设计完毕并且仿真调试OK 后,将其编译为图形模块,然后在顶层用原理图输入的方法调用这些模块,将各个模块用信号线连接起来,构成整个系统。这里所说的原理图输入的方法并不是一定要用各种标准的逻辑元件组装电路,

而是用语言设计的功能模块组成系统。看这样设计的顶层文件,系统结构一目了然,这和纯语言设

计前所做的系统逻辑框图是一样的,都是为了清晰的描述系统结构。

当然,是用纯语言设计好,还是用图形输入法设计顶层再调用用语言设计的底层模块也好,我

看这两种方法都好,应根据个人的爱好和习惯而定,就象用VHDL 语言或用Verilog HDL 语言都能

设计好的系统一样

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~

其实FPGA 不是学会的,是做会的。遇到问题,解决问题和总结经验,不断往复,水平就提高了。

刚开始做,谁都会遇到问题。这时候不要动不动就张口问别人,要自己多想一想,试一试。比如,刚焊好的板子,上电后,下载不了,这是一个新手经常遇到的问题。

一般来说,大多数人会去检查下载电路的原理图,如果发现和正确的原理图没有区别就没办法了,开始怀疑芯片是不是坏了,焊接是不是有问题,是不是哪里有干扰啊等等。

而有的细心一些的人,就会仔细的看看下载的原理,信号的时序,用示波器看看板上信号的时序,一步一步的找原因。如果没有找到,就会仔细检查FPGA 的电路,从电源设计,到去耦电容摆放等等方面去动手查找原因。如果觉得那里有问题,就动手改一看看,测一侧有没有改变,而不是坐着想哪里出问题。

可能后就是芯片坏了,或者没有焊接好,但是后者确在这个过程中学到了很多东西,至少对

f pga下载的原理了解的十分清楚。

以上是随便举的一个例子,还有一点要忠告大家的就是不要轻易的怀疑芯片有问题,如果电路工作不正常,那么99%的原因是和设计有关的,是可以找到确定的原因的,而不是偶然的,即使是噪声或者干扰。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~

fpga这东西需要的就是自己去实际动手编写程序,哪怕仅仅是编写一个737,只有在不断的编写调试的过程中才能找到感觉。同意楼上的观点,不要过分的去看语法,常用的其实不多。我刚开始也是认为整个系统全部用语言编写好,通过个人的经验教训才发现,顶层文件后用原理图。

还有个建议就是平时多自己编写联系一些东西,比如花点时间编一点任意分频器啊锁相环啊什么的,从中会找到很多乐趣。当然必须要遇到很多困难才有乐趣了。如果什么困难都没有,那只能说您是高手了。

还有就是要互相之间多讨论,每个人的观点都可能是你学习的内容。

3. fpga设计的精髓—时序设计

时序是设计出来的

我的boss 有在华为及峻龙工作的背景,自然就给我们讲了一些华为及altera做逻辑的一些东西,而我们的项目规范,也基本上是按华为的那一套去做。在工作这几个月中,给我感触深的是华为的那句话:时序是设计出来的,不是仿出来的,更不是湊出来的!

(一)总体设计方案和逻辑详细设计方案

在我们公司,每一个项目都有很严格的评审,只有评审通过了,才能做下一步的工作。以做逻辑为例,并不是一上来就开始写代码,而是要先写总体设计方案和逻辑详细设计方案,要等这些方案评审通过,认为可行了,才能进行编码,一般来说这部分工作所占的时间要远大于编码的时间。

总体方案主要是涉及模块划分,一级模块和二级模块的接口信号和时序(我们要求把接口信号的时序波形描述出来)以及将来如何测试设计。在这一级方案中,要保证在今后的设计中时序要收

敛到一级模块(后是在二级模块中)。什么意思呢?我们在做详细设计的时候,对于一些信号的时序

肯定会做一些调整的,但是这种时序的调整多只能波及到本一级模块,而不能影响到整个设计。记

得以前在学校做设计的时候,由于不懂得设计时序,经常因为有一处信号的时序不满足,结果不得

不将其它模块信号的时序也改一下,搞得人很郁闷。

在逻辑详细设计方案这一级的时候,我们已经将各级模块的接口时序都设计出来了,各级模块

内部是怎么实现的也基本上确定下来了。

由于做到这一点,在编码的时候自然就很快了,重要的是这样做后可以让设计会一直处于可控

的状态,不会因为某一处的错误引起整个设计从头进行。

(二)如何提高电路工作频率(加约束,流水、切割状态)

对于设计者来说,我们当然希望我们设计的电路的工作频率(在这里如无特别说明,工作频率

指FPGA 片内的工作频率)尽量高。我们也经常听说用资源换速度,用流水的方式可以提高工作频率,这确实是一个很重要的方法,今天我想进一步去分析该如何提高电路的工作频率。

我们先来分析下是什么影响了电路的工作频率。

我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clock skew 有关。在FPGA

内部如果时钟走长线的话,clock skew 很小,基本上可以忽略, 在这里为了简单起见,我们只考虑

信号的传播时延的因素。

信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样划分或许不是

很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作频率,我们就要在这三个时延

中做文章,使其尽可能的小。

我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变,所以我们只

能通过改变走线方式和减少组合逻辑的方法来提高工作频率。

1.通过改变走线的方式减少时延。

以altera的器件为例,我们在quartus里面的timing closure floorplan可以看到有很多条条块块,我们可以将条条块块按行和按列分,每一个条块代表1 个LAB,每个LAB 里有8 个或者是10 个LE。

它们的走线时延的关系如下:同一个LAB 中(快)<同列或者同行<不同行且不同列。

我们通过给综合器加适当的约束(不可贪心,一般以加5%裕量较为合适,比如电路工作在

100Mhz,则加约束加到105Mhz 就可以了,贪心效果反而不好,且极大增加综合时间)可以将相

关的逻辑在布线时尽量布的靠近一点,从而减少走线的时延。(注:约束的实现不完全是通过改进

布局布线方式去提高工作频率,还有其它的改进措施) 2.通过减少组合逻辑的减少时延。

上面我们讲了可以通过加约束来提高工作频率,但是我们在做设计之初可万万不可将提高工作

频率的美好愿望寄托在加约束上,我们要通过合理的设计去避免出现大的组合逻辑,从而提高电路

的工作频率,这才能增强设计的可移植性,才可以使得我们的设计在移植到另一同等速度级别的芯

片时还能使用。

我们知道,目前大部分FPGA 都基于4 输入LUT 的,如果一个输出对应的判断条件大于四输入的话就要由多个LUT 级联才能完成,这样就引入一级组合逻辑时延,我们要减少组合逻辑,无非就是要输入条件尽可能的少,,这样就可以级联的LUT 更少,从而减少了组合逻辑引起的时延。

我们平时听说的流水就是一种通过切割大的组合逻辑(在其中插入一级或多级D 触发器,从而使寄存器与寄存器之间的组合逻辑减少)来提高工作频率的方法。比如一个32 位的计数器,该计数器的进位链很长,必然会降低工作频率,我们可以将其分割成4 位和8 位的计数,每当4 位的计数器计到15 后触发一次8 位的计数器,这样就实现了计数器的切割,也提高了工作频率。

在状态机中,一般也要将大的计数器移到状态机外,因为计数器这东西一般是经常是大于4 输入的,如果再和其它条件一起做为状态的跳变判据的话,必然会增加LUT 的级联,从而增大组合逻辑。以一个6 输入的计数器为例,我们原希望当计数器计到111100 后状态跳变,现在我们将计数器放到状态机外,当计数器计到111011 后产生个enable 信号去触发状态跳变,这样就将组合逻辑减少了。

上面说的都是可以通过流水的方式切割组合逻辑的情况,但是有些情况下我们是很去切割组合逻辑的,在这些情况下我们又该怎么做呢?

状态机就是这么一个例子,我们不能通过往状态译码组合逻辑中加入流水。如果我们的设计中有一个几十个状态的状态机,它的状态译码逻辑将非常之巨大,毫无疑问,这极有可能是设计中的关键路径。那我们该怎么做呢?还是老思路,减少组合逻辑。我们可以对状态的输出进行分析,对它们进行重新分类,并根据这个重新定义成一组组小状态机,通过对输入进行选择(case 语句)并去触发相应的小状态机,从而实现了将大的状态机切割成小的状态机。在ATA6 的规范中(硬盘的标准),输入的命令大概有20 十种,每一个命令又对应很多种状态,如果用一个大的状态机(状态套状态)去做那是不可想象的,我们可以通过case 语句去对命令进行译码,并触发相应的状态机,这样做下来这一个模块的频率就可以跑得比较高了。

总结:提高工作频率的本质就是要减少寄存器到寄存器的时延,有效的方法就是避免出现大的组合逻辑,也就是要尽量去满足四输入的条件,减少LUT 级联的数量。我们可以通过加约束、流水、切割状态的方法提高工作频率。

(三)做逻辑的难点在于系统结构设计和仿真验证

刚去公司的时候BOSS 就和我讲,做逻辑的难点不在于RTL 级代码的设计,而在于系统结构设计和仿真验证方面。目前国内对可综合的设计强调的比较多,而对系统结构设计和仿真验证方面似乎还没有什么资料,这或许也从一个侧面反映了国内目前的设计水平还比较低下吧。

以前在学校的时候,总是觉得将RTL 级代码做好就行了,仿真验证只是形式而已,所以对HDL 的行为描述方面的语法不屑一顾,对testbench也一直不愿意去学--因为觉得画波形图方便;对于系统结构设计更是一点都不懂了。

到了公司接触了些东西才发现完全不是这样。

其实在国外,花在仿真验证上的时间和人力大概是花在RTL 级代码上的两倍,现在仿真验证才是百万门级芯片设计的关键路径。仿真验证的难点主要在于怎么建模才能完全和准确地去验证设计的正确性(主要是提高代码覆盖),在这过程中,验证速度也是很重要的。

验证说白了也就是怎么产生足够覆盖率的激励源,然后怎么去检测错误。我个人认为,在仿真验证中,基本就是要做到验证的自动化。这也是为什么我们要写testbench的原因。在我现在的一个设计中,每次跑仿真都要一个小时左右(这其实算小设计)。由于画波形图无法做到验证自动化,如果用通过画波形图来仿真的话,一是画波形会画死(特别是对于算法复杂的、输入呈统计分布的设计),二是看波形图要看死,三是检错率几乎为零。那么怎么做到自动化呢?我个人的水平还很有限,只能简单地谈下BFM(bus function model,总线功能模型)。

以做一个MAC 的core 为例(背板是PCI 总线),那么我们需要一个MAC_BFM 和PCI_BFM 及PCI_BM(PCI behavior model)。MAC_BFM 的主要功能是产生以太网帧(激励源),随机的长度和帧头,内容也是随机的,在发送的同时也将其复制一份到PCI_BM 中;PCI_BFM 的功能则是仿PCI 总线的行为,比如被测收到了一个正确帧后会向PCI 总线发送一个请求,PCI_BFM 则会去响应它,并将数据收进来;PCI_BM 的主要功能是将MAC_BFM 发送出来的东西与PCI_BFM 接收到的东西做比较,由于它具有了MAC_BFM 的发送信息和PCI_BFM 的接收信息,只要设计合理,它总是可以自动地、完全地去测试被测是否工作正常,从而实现自动检测。

华为在仿真验证方面估计在国内来说是做的比较好的,他们已建立起了比较好的验证平台,大部分与通信有关的BFM 都做好了,听我朋友说,现在他们只需要将被测放在测试平台中,并配置好参数,就可以自动地检测被测功能的正确与否。

在功能仿真做完后,由于我们做在是FPGA 的设计,在设计时已经基本保证RTL 级代码在综合结果和功能仿真结果的一致性,只要综合布局布线后的静态时序报告没有违反时序约束的警告,就可以下到板子上去调试了。事实上,在华为中兴,他们做FPGA 的设计时也是不做时序仿真的,因为做时序仿真很花时间,且效果也不见得比看静态时序分析报告好。

当然了,如果是ASIC 的设计话,它们的仿真验证的工作量要大一些,在涉及到多时钟域的设计时,一般还是做后仿的。不过在做后仿之前,也一般会先用形式验证工具和通过静态时序分序报告去查看有没有违反设计要求的地方,这样做了之后,后仿的工作量可以小很多。

在HDL 语言方面,国内语言很多人都在争论VHDL 和verilog哪个好,其实我个人认为这并没有多大的意义,外面的大公司基本上都是用verilog在做RTL 级的代码,所以还是建议大家尽量学verilog。在仿真方面,由于VHDL 在行为级建模方面弱于verilog,用VHDL 做仿真模型的很少,

当然也不是说verilog就好,其实verilog在复杂的行为级建模方面的能力也是有限的,比如目前它还不支持数组。在一些复杂的算法设计中,需要高级语言做抽象才能描述出行为级模型。在国外,仿真建模很多都是用System C 和E 语言,用verilog的都算是很落后的了,国内华为的验证平台好像是用System C 写。

在系统结构设计方面,由于我做的设计还不够大,还谈不上什么经验,只是觉得必须要具备一些计算机系统结构的知识才行。划分的首要依据是功能,之后是选择合适的总线结构、存储结构和处理器架构,通过系统结构划分要使各部分功能模块清晰,易于实现。这一部分我想过段时间有一点体会了再和大家分享,就先不误导大家了。

4.设计规范很重要

工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。

在逻辑方面,我觉得比较重要的规范有这些:

(一)设计必须文档化

要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。(二)代码规范

a.设计要参数化。

比如一开始的设计时钟周期是30ns,复位周期是5 个时钟周期,我们可以这么写:

parameter CLK_PERIOD = 30; parameter

RST_MUL_TIME = 5; parameter RST_TIME =

RST_MUL_TIME * CLK_PERIOD;

...

rst_n = 1'b0;

# RST_TIME rst_n = 1'b1;

...

# CLK_PERIOD/2 clk<= ~clk;

如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD 进行重新例化就行了,从而使得代码更加易于重用。

b.信号命名要规范化

(1) 信号名一律小写,参数用大写。

(2) 对于低电平有效的信号结尾要用_n 标记,如rst_n。

(3) 端口信号排列要统一,一个信号只占一行,好按输入输出及从哪个模块来到哪个模块

去的关系排列,这样在后期仿真验证找错时后方便很多。如:

module a(

//input

clk,

rst_n, //globle signal wren,

rden, avalon_din, //related to avalon

bus sdi, //related to serial port

input

//output data_ready,

avalon_dout, //related to avalon

bus ...

);

(4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module 或者是一个entity。在多时钟域的设计中涉及到跨时钟域的设计中好有专门一个模块做时钟域的隔离。这样做可以让综合器综合出更优的结果。

(5) 尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止出现任何胶连逻辑(glue logic),哪怕仅仅是对某个信号取反。理由同上。

6) 在FPGA 的设计上禁止用纯组合逻辑产生latch,带D 触发器的latch 的是允许的,比如配置寄存器就是这种类型。

(7) 一般来说,进入FPGA 的信号必须先同步,以提高系统工作频率(板级)。所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也是极有好处的。

(9) 除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要用到门控时钟的地方,也要将门控信号用时钟的下降沿打一拍再输出与时钟相与。

(10) 禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的复杂性。如FPGA 的输入时钟是25M 的,现在系统内部要通过RS232 与PC 通信,要以rs232_1xclk 的速率发送数据。

不要这样做:

always (posedge rs232_1xclk or negedgerst_n) begin

...

end

而要这样做:

always (posedge clk_25m or negedgerst_n) begin

...

else if ( rs232_1xclk == 1'b1 )

...

end

(11) 状态机要写成3 段式的(这是标准的写法),即

...

always @(posedgeclk or negedgerst_n)

...

current_state<= next_state;

...

always @ (current_state ...)

...

case(current_state)

...

s1:

if ...

next_state = s2; ...

...

always @(posedgeclk or negedgerst_n)

...

else a <=

1'b0; c <=

1'b0;

c <= 1'b0; //赋默认值

case(current_state) s1:

a <= 1'b0; //由于上面赋了默认值,

这里就不用再对b、c 赋值了(b、

c 在该状

态为0,不会产生锁存器,下同)

s2:

b <= 1'b1; s3:

c <= 1'b1; default:

...

...

(三)ALTERA参考设计准则

1) Ensure Clock, Preset, and Clear configurations are free of glitches.

2) Never use Clocks consisting of more than one level of combinatorial logic.

3) Carefully calculate setup times and hold times for multi-Clock systems.

4) Synchronize signals between flipflops in multi-Clock systems when the setup and

hold time requirements cannot be met.

5) Ensure that Preset and Clear signals do not contain race conditions.

6) Ensure that no other internal race conditions exist.

7) Register all glitch-sensitive outputs. Synchronize all asynchronous inputs.

9) Never rely on delay chains for pin-to-pin or internal delays.

10)Do not rely on Power-On Reset. Use a master Reset pin to clear all flipflops.

11)Remove any stuck states from state machines or synchronous logic.

其它方面的规范一时没有想到,想到了再写,也欢迎大家补充。

第三部分项目经验小结

经验一

1.要和人配合。以我们做硬件的工程师为例,测试的时候一般都需要软件的配合,一个对硬件来说无比复杂的工作,可能在软件工程师看来就是几行简单的代码。所以要和人配合,多听听别人的意见,这样必然可以产生新的 know-how 从而加快测试和开发的速度,退一步讲,至少没有坏处。

2.测试还是要别人来做。开发者看待自己的产品有如看待自己,大多是没有勇气去发现缺点的。

一是源自自尊心,二是为了避免额外的工作。所以就算有问题,如果不严重就藏着掖着。但是这对项目来说是不行的,所以测试,verification,一定要旁人来做。

3.多点时间思考。出现问题后,不要急着修改。要思考推测可能的原因,想清楚后把这些可能的原因都用debug pin 或者chipscope引出来。

4.注意复用已有的debug pin。很多时候,在测试过程中产生了一大堆测试信号,但是时间一长就忘了复用。实际上,当一个问题产生的时候,通过反复观察已有的debug-pin 或许足以发现问题根源,而无需再引出新的pin,并浪费时间去综合和PAR。

5.仿真加时序足矣。数字电路在时钟同步的设计原则下,其功能通过simulation 就可以验证。

simulation 的结果和PAR 后产生的FPGA-image 完全等价。当然FPGA 也要遵循同样的设计原则:即时钟同步。所以对于PAR 的结果首先就要确保其时钟同步的特性。体现为寄存器之间的path 必须在一个时钟周期内完成。(当然有其他约束的例外。)同时要满足FPGA 器件的setup 和hold 要求。一旦出现timing-error 必须通过各种途径消除error,因为error 的存在,意味着时钟同步的大前提已经被破坏,这时,simulation 取得的结果和FPGA 是不等价的,继续测试也毫无意义了。

6.注意不可控的接口部分。FPGA 内部的寄存器之间的timing 完全可以通过PAR 报告来确认是否有问题。但是和外界的接口部分却充满了疑问。我们一般通过假定的input-delay 和output-delay 来对接口部分进行约束。由于从一开始就施加的是假定的delay,所以即使没有

timing-error,其结果也存在诸多疑问。以我正在进行的测试为例,模块内部loopback 测试完全

正常,但是一过cable,传到对方FPGA,则马上产生很多误码。由于simulation 没有问题,所以

必然是我们的某个假定出现了问题,尤其是时钟同步的假定会得不到满足。这时候,就要想尽一切

办法,使接口也满足假定的条件,或者调整设计,将不理想的接口adapting 成理想的接口。

7.向直接上司汇报情况,寻求各种可能的许可。懒得向直接上司汇报情况时,万一出现进度

或者结果不符,所有责任都需要本人承担。如果提前向上司汇报情况并取得许可,则一切后果都在

可控范围内。比如,工作繁忙时又被派给新的任务,则不能一味逆来顺受。应该向上司说明困难,

并提前想好一个可行的解决方案供上司参考。

8.外部接口是大障碍。如前所述,FPGA 内部如果timing 没有问题的话,一般和仿真结果

是一致的,问题是外部的接口,包括cable 连线等,不在我们确切控制的范围内,比如其延时特性

在40Mhz 下仍然正常,但是在80Mhz 时可能出现不可预料的情况。所以应该尽量使用经过验证

的“cable--frequency”组合。或者通过设备测量并确认外部接口的延时特性。这样可以进行有针对

性的调整。我近的教训就是花了整整一个月调整并测试内部的结构,但是仍然失败。结果发现由于cable 的问题,80Mhz 的信号(数据+使能+others)无法正常并行传输。如果换成40Mhz 的信

号就通过了。

9.综合PR 后的结果要和代码等价。前面提到仿真加时序足矣,这里面的前提是PR 的结果

和原始代码要等价。为了确认这一点,就要把握syn和pr过程中的所有warning以及error,warning

的内容不是完全可以忽略的。要特别关注综合报表中的以下内容:unused ports, remov al of redundant logic, latch inference,simulation mismatch 等等。在报表中输入关键字查找即可。

经验二

(1) FPGA 工程师首先应该是一个硬件工程师,对所需要设计的系统的需求,架构,有深刻了解。

只有了解这些,才能知道那些可以功能可以或好在FPGA 中完成,应该如何估算需要资源,甚

至将来需要增加的功能,从而选择FPGA 型号,在设计上FPGA 内部的系统架构如何分解,各个功

能模块接口如何设计划分,以达到高稳定,可重用。

(2)语言设计的捷径

我偶尔到HDL 语言论坛去看看,看到很多人对语言的学习感到困难,其实语言的学习并不困难,其捷径是什么,答案:先用原理图设计,尤其是一些基本的逻辑功能单元。分频计数,开关,串并、并串等等。从某种角度来说语言的本质是原理图设计,如果您脑袋里想的原理图,手指在键盘上敲

出来的是语言,你可以不用担心代码可综合性。其实我学习语言是今两年的事情,我只看两三天Verilog 语言语法,然后看看基本逻辑单元的表示方法和例子,就可以用Verilog 进行设计了,当然会在设计过程中碰到一些语法表示的困难,翻翻书就可以了。

当然,不是语言不重要,功能的实现也需要语言准确的表达,例如case 语句如何避免LATCH。

法语最常用整理!!!精品!!两年时间积累的《新大学法语》教程语法!!~~~~~~~~~~

泛指代词 1 quelqu’un某人quelqu’une quelques-uns(unes)某些人某些物 (1) quelqu’un=someone 不分男女,都用阳性,表示虚指,“某人” (2) quel qu’une +de =one of …中的一个(阴性的人/物) quelques-uns(unes)+de= some of …中的几个(复数的人/物) (3) quelqu’un de (plus) adj(阳)/bien 2 personne 没有人,无人quelqu’un的否定形式。 (1) 跟ne一起使用,或在sans,sans que后面。=nobody/anybody (2)personne+de+adj(阳) 3 quelque chose某事,某物 (1)中性,虚指,只有单数,“某物”、“某事”或“什么”=sth (2) quelque chose+de+adj(阳)/ bien/ mal (3) =sth important eg. C’est ~ que ce projet. 4 rien没有……quelque chose的否定形式=nothing/anything (1)跟ne一起使用,或在sans,sans que后面,用法和personne相同。 (2) Rien+de+adj阳/pp. (3) 不能与pas/point连用能和plus/jamais连用 * Rien 作直宾,谓语为简单时态时,放谓语后,谓语复合时态,放 在助动词和pp之间 Je ne sais rien. *rien作不定式动词直宾时,放不定式动词前 :Il reste là sans rien dire. 5 chacun 只有单数 (1)~+de+ 复数n 每个人/每一个(物) (2)单独使用,仅用阳性,只指人=everyone 6.aucun(e)只有单数=none/any,chacun 否定 (1)一般+de+n(也可省略)跟ne一起使用,或在sans,sans que后 (2)不能与pas/point连用能和plus/jamais连用 7 Certains只有复数。 (1) 单独使用时,用阳性,只指人,虚指,“有些人” 知道但不明说 (2) certains de/ certaines de =some of 指人/物 8.plusieurs 只有复数,两性词形相同。 (1) 单独使用,只指人,“好几个人”“几个人”: (2)plusieurs +de 指人/物“几个”“好几个”: 9.Un(une) (1)un de+n,或与副代词en一同使用;性数一致,”一个人/事/东西”: (2) 如后面是关系从句,则起指示代词celui,celle作用,“……的人”:eg : Une dont je me méfie,c’est sa cousine. 否 1.tout..ne..pas不再2.ne...plus不再3.ne....jamais 4.ne...rien 什么也不 5.ne...personne 没人 泛指代词 tout(物,阳单,一切) tous(所有人,阳) toutes(人,阴) adj. tout(阳单), toute(阴单), tous,(阳复) toutes(阴复) adv. tout, toute(h开头阴单adj前), ,toutes (h开头阴复adj) 指示adj ce(cet.h/元)阳 cette阴 ces复 指代词 celui阳celle阴ce中ceux阳复 celles阴复 /ceci这cela=c,a那独立用法无需前面出现n,特指某类人,通常复数 ceux

基于FPGA的Verilog HDL数字钟设计 -

基于FPGA的Verilog HDL数字钟设计 专业班级姓名学号 一、实验目的 1.掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程; 2.熟悉一种EDA软件使用; 3.掌握Verilog设计方法; 4.掌握分模块分层次的设计方法; 5.用Verilog完成一个多功能数字钟设计; 6.学会FPGA的仿真。 二、实验要求 ?功能要求: 利用实验板设计实现一个能显示时分秒的多功能电子钟,基本功能: 1)准确计时,以数字形式显示时、分、秒,可通过按键选择当前显示时间范围模式; 2)计时时间范围00:00:00-23:59:59 3)可实现校正时间功能; 4)可通过实现时钟复位功能:00:00:00 扩展功能: 5)定时报:时间自定(不要求改变),闹1分钟(1kHz)---利用板上LED或外接电路实现。 6)仿广播电台正点报时:XX:59:[51,53,55,57(500Hz);59(1kHz)] ---用板上LED或外接 7)报整点时数:XX:00:[00.5-XX.5](1kHz),自动、手动---用板上LED或外接 8)手动输入校时; 9)手动输入定时闹钟; 10)万年历; 11)其他扩展功能; ?设计步骤与要求: 1)计算并说明采用Basys2实验板时钟50MHz实现系统功能的基本原理。 2)在Xilinx ISE13.1 软件中,利用层次化方法,设计实现模一百计数及显示的电路系 统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。 3)对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快 得出仿真结果)。 4)输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit文件。 5)在Basys2实验板上下载所生成的.bit文件,观察验证所设计的电路功能。

verilog基本语法

Verilog基本语法 【逻辑值】 逻辑0 表示低电平,GND 逻辑1 表示高电平,VCC 逻辑X 表示未知电平,可能是高电平,也可能是低电平 逻辑Z 表示高阻态,外部没有激励信号,是一个悬空状态 注:高阻态的实质:电路分析时高阻态可做开路理解。 可以把它看作输出(输入)电阻非常大,对下级电路无任何影响。 若为0、x、z则按照假处理;若为1,按真处理。 【进制】 二进制4'b0101 —4位二进制数0101 十进制数4’d2 —4位十进制数2 十六进制数4’ha —4位十六进制数a Verilog中若不指定位宽,默认32位;若不指定位宽不指定进制,默认32位宽的十进制数。 【标识符】 标识符可以是字母、数字、$和_(下划线)的组合,且开头必须是字母或下划线,区分大小写。不建议大小写混合使用。 【数据类型】 寄存器关键字reg,默认初始值位不定值X; reg[31:0] delay_cnt; //[31:0],指定寄存器位宽32位, reg key_reg; // 默认位宽为1. reg类型数据只能在always和initial语句中被赋值。 线网表示结构实体的物理连线,包括wire和tri类型 参数常量,用parameter定义。 parameter H_SYNC = 11'd41; 【运算符】 [条件操作符] ?: 例,a?b:c //如果a为真就选b,否则选择c。 result=(a>=b)?a:b; [逻辑运算符] !&& || [位运算符] ~ & | ^(按位异或) a&b; //自动将位宽小的数高位补零至较大数的位宽,然后按位与操作。[移位运算符] << >> 用0填补移出的空位。左移时位宽增加,右移位宽不变。 [位拼接运算符] {} 例,{a,b} //将a和b拼接起来,作为一个新信号,a为高位。 c={a,b[3:0]}; //a、b位宽均为8位,c为8+4=12位。

法语语法总结[1]

法语语法总结(连词篇) 复合句中的连词. 1.宾语从句 连接宾语连词有que,si,comment, quand, pourquoi,où ,ce que, ce qui ... Ex.Le directeur dit que c’est un bon vendeur. Il dit qu’il peut finir ce travail tout seul. Il demande si son père est là. Je sais pas comment/quand il viendra. Est-ce que tu sais quand / en quelle année la Tour Eiffel a été construit? Il se demande pourquoi il n’y a personne. Il ne sait pas d’où il vient. Dis-moi ce que tu as fait hier. Nous ne savons pas ce qui s’est passé dans la rue. Le prof nous dit que si nous travaillons, nous réussirons. 2.状语从句 时间状语从句quand, lorsque, dès que, aussit?t que, après que, a peine...que... Quand il est entrédans ma chambre, j’étais encore au lit. Dès que nous serons rentrés à la maison, nous vous téléphonerons. Dès qu’il a été arrivé, Jean s’est mis au travail. Aussit?t que je serai arrivéà Paris, je t’écrirai. A pein se fut-il levé, qu’on sonna à la porte. 注:以上连词均用直陈式,avant que用缀词ne,并用虚拟式 Il arrive avant que le train ne parte. 原因状语从句comme, puisque, parce que, car(注意此四词在句中的位置) Puisque tu viens, reste ici. Comme je dois rentrer dans deux jours, je viens chez mon ami pour lui dire au revoir. Je viens chez mon ami pour lui dire au revoir, parce que / car je dois rentrer. Comme elle arrive demain, il faut préparer une chambre. Il faut préparer une chambre, parce que / car elle arrive demain. 注:a cause de/ en raison de / grace à + n ;上述连词后跟句子 3.关系从句(详见第五点) 4.形容语从句que引导 Ex. Je suis content que tout le monde soit arrivé. 法语中副词的位置 1.副词修饰动词时,如果动词是简单形式(非复合形式,如复合过去时),副词一般放在 动词后面。 Il travaille beaucoup. Il dort peu. Il voyage souvent. 2.副词修饰动词时,如果动词是复合形式(如复合过去时),副词一般夹在助动词与过去 分词之间。 Je lui ai souvent dit cela.

新大学法语1·语法总结

新大学法语1·语法总结

[键入公司名称] [键入文档标题] [键入文档副标题] Administrator 2016/5/6

目录 一、名词 (1) (一)名词的阴阳性 (1) 1.名词的阴阳性 (1) 2阳性名词改为阴性名词: (1) (二)名词的单复数 (1) 1.名词的单复数 (1) 2.名词复数的构成: (1) (三)普通名词和专有名词 (2) 二、代词 (2) (一)人称代词 (2) 1.主语人称代词 (2) 2.重读人称代词 (2) 3.直接宾语人称代词 (2) 4.间接宾语人称代词 (3) (二)副代词“y”和“en” (3) 1.y (3) 2.en (3) (三)中性代词le (3) 1.作表语 (4) 2.作直接宾语 (4) (四)关系代词“qui” (4) 三、形容词 (4) (一)形容词的构成 (4) 1.阴性形容词的构成 (4) 2.复数形容词的构成 (4) (二)形容词的位置 (5) (三)疑问形容词和感叹形容词 (5) (三)主有形容词 (5) (四)指示形容词 (6) (五)泛指形容词 (6) 四、动词 (7) (一)及物动词与不及物动词 (7) (二)代词式动词 (7) 1.意义 (7) 2.代词式动词的命令式 (8) 3.代词式动词的复合过去时 (8) (三)无人称动词 (8) (四)动词变位 (8)

1.第一组规则动词的直陈式现在时动词变位 (8) 2.第二组动词的直陈式现在时动词变位 (9) 3.第三组不规则动词的直陈式现在时动词变位 (9) (五)过去分词 (9) 五、冠词 (10) (一)不定冠词和定冠词 (10) 1.形式 (10) 2.用法 (10) (二)缩合冠词 (10) (三)部分冠词 (11) 1.形式 (11) 2.用法 (11) (四)冠词的省略 (11) 六、介词 (11) (一)“à”和“de ” (11) (二)国名、洲名前所用的介词 (12) 1.en + 阴性国家名 (12) 2.au + 阳性国家名 (12) 3.aux + 复数国家名 (12) 七、命令式 (12) (一)命令式的形式与意义 (12) 1.形式与意义 (12) 2.特殊形式 (12) (二)宾语在命令式中的位置 (13) 1.名词宾语 (13) 2.代词宾语 (13) 八、疑问句 (13) (一)一般疑问句 (13) 1.结构 (13) 2.oui ,non ,si 的用法 (13) (二)特殊疑问句 (14) 九、强调表达法 (14) 十、复合句 (14) 1.平列句 (14) 2.并列句 (14) 3.主从复合句 (14) 十一、时间表达 (15) (一)年、季节、月、日、星期、钟点表达法 (15) 1.年 (15) 2.季节 (15) 3.月 (15) 4.日 (15)

最全的法语语法整理大全

〖代词相关〗 GRAMMAIRE I 主语人称代词 1. 1.1.词形 2. 如同英语中人称代词主格,用作主语。 1) 1)1)tu 用作家人、好友间; vous (您)礼貌、尊重。 2) 2)2)第三人称也可用作(它,它们) II 主有形容词 3. 3.1.词形 mon amie 。 4. 4.2.用法 1) 1)1)主有形容词的性、数与所限名词的性数一致,与所有者性别无关。son livre 2) 2)2)所有者为复数,所有物是每人一件时,一般用单数主有形容词。 Ouvrez votre livre à la page 20. (Open your books at page 20.) III 重读人称代词 1. 1.1.词形 1) 1)1)主语的同位语:A 单独用作同位语:

Lui, il conna?t le peintre de ce tableau. B 与另一人称代词或名词构成复合同位语 T oi et moi , nous allons au cinéma à vélo. 2) 用作介词的补语: Je travaille avec elle chez moi. 3) 用于c’est后,或无谓语的省略句中 Qui est Li Ming ? ——C’est lui. IV直接宾语人称代词 me, m’ (me)nous(us) te, t’(you)vous(you) le, l’(him/it)les(them) la, l’(her/it) 相当于英语中的宾格,但放在有关动词前: Ce texte n’est pas facile, le comprenez-vous ? —— Non, je ne le comprends pas. 肯定命令式中,放在动词后面,用连字号相连,有me的改为moi: Choisissez-les si vous voulez bien. Attendez-moi à la station, s’il vous pla?t. V泛指代词on 可代替口语中所有人称代词,相当于英语中的one , someone, they, people,动词谓语仅用第三人称单数 Ecoute, on frappe à la porte. (Listen, someone is knocking at the door.) III国家、城市名词前介词的用法 1.阴性国名或国名以元音开头,用en。en Chine, en Iran 2.阳性国名用à。Au Japon 3.城市前用à,从……来用de 4.de+ 阴性名词则无冠词,阳性变du。 VI间接宾语人称代词 1.1.1.词形 Ma soeur m’écrit quelquefois. Je vais lui demander un verre de lait. Ne leur dites pas cette nouvelle.

(完整版)Verilog实现的基于FPGA的五层楼电梯运行控制逻辑毕业设计论文

五层楼电梯运行控制逻辑设计 摘要:电梯是高层建筑不可缺少的运输工具,用于垂直运送乘客和货物,传统的电梯控制系统主要采用继电器,接触器进行控制,其缺点是触点多,故障率高、可靠性差、维修工作量大等,本设计根据电梯自动控制的要求利用Verilog语言编写并完成系统设计,在利用软件仿真之后,下载到了FPGA上进行硬件仿真。FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了之前的可编程器件门电路数有限及速度上的缺点。 关键词:电梯控制FPGA Verilog软件设计硬件设计 在当今社会,随着城市建设的不断发展,高层建筑的不断增多,电梯作为高层建筑中垂直运行的交通工具已与人们的日常生活密不可分。目前电梯控制系统主要有三种控制方式:继电路控制系统(早期安装的电梯多位继电器控制系统),FPGACPLD [1] 的控制系统、微机控制系统。继电器控制系统由于故障率高、可靠性差、控制方式不灵活以及消耗功率大等缺点,目前已逐渐被淘汰,而微机控制系统虽在智能控制方面有较强的功能,但也存在抗扰性差,系统设计复杂,一般维修人员难以掌握其维修技术等缺陷。而FPGACPLD控制系统由于运行可靠性高,使用维修方便,抗干扰性强,设计和调试周期较短等优点 [2] ,倍受人们重视等优点,已经成为目前在电梯控制系统中使用最多的控制方式,目前也广泛用于传

统继电器控制系统的技术改造。 随着现代化城市的高度发展,每天都有大量人流及物流需要输送,因此在实际工程应用中电梯的性能指标相当重要,主要体现在:可靠性,安全性,便捷快速性。电梯的可靠性非常重要,直接或间接的影响着人们的生产,生活,而电梯的故障主要表现在电力拖动控制系统中,因此要提高可靠性也要从电力拖动控制系统入手。 本次设计尝试用Verilog实现电梯控制器部分,进行了多层次的电梯控制,也进行了软件及硬件上的仿真验证,时序分析以保证设计的正确。在设计中先用软件进行模拟仿真,然后又下载到FPGA开发板上进行硬件仿真,以确保设计的正确性。 1电梯的设计分析 1.1 系统的需求分析及系统描述 设计一个电梯运行控器,该电梯有5层楼,设计的电梯调度算法满足提高服务质量、降低运行成本的原则;电梯的内部有一个控制面板,它负责按下请求到的楼层,并且显示当前尚未完成的目的地请求,当到达该楼层以后自动撤销本楼层的请求,即将面板灯熄灭;除1层和5层分别只有上和下按钮外,其余每个楼层(电梯门口旁)的召唤面板都有两个按钮,分别指示上楼和下楼请求。当按下后,对应按钮灯亮。如果电梯已经到达该楼层,按钮灯熄灭;电梯的外部面板会显示电梯当前所在的楼层,及上行还是下行(暂停显示刚才运行时的状态);电梯向一个方向运行时,只对本方向前方的请求进行应答,直到本方向前方无请求时,才对反方向的请求进行应答。当前内部控制面板上有的请求,只要经过所在楼层均会立即响应.

法语语法总结

Grammaire Article 不定冠词:①构成:un une des ②用法:A初次提到,不确指的,或表示数量1。Une lettre pour toi。 B 否定句中,直接宾语,不定冠词;不定冠词变de。 Il n’y a pas de photos . ⑵定冠词:①构成:le la les ②用法:A前面已经提到的人或物。Il y a une photo,la photo est belle。 B有关名词以被其他成分限制。La famille de Sophie。 C唯一的或特指的人、事、物。Le soleil D人、事、物总体概念。L’homme est mortel. ⑶部分冠词:①构成:du de la des ②用法:不定冠词的一种,放在表物质或抽象概念的名词前,表不确定或部分概念。“一点儿,一些”。écouter de la musique. A 吃,喝等物质名词前用部分冠词。Je prends du vin. B在数量副词或数量名词后要省去,也就是combien de,beaucoup de,un peu de后直接加名词,不用冠词。 C否定句中,直接宾语,部分冠词;部分冠词变de。 D表整体与确指时用定冠词。Preférer 与aimer 后永远接定冠词。 ⑷缩合冠词:①构成:与de 缩合:du de la des (de l’)用在以元音或哑音h开头的阳性或阴性名词前. 与à缩合:au à la aux(à l’)用在以元音或哑音h开头的阳性或阴性名词前. Adjectif 1主有形容词:⑴构成:mon ma mes;ton ta tes;son sa ses notre notre nos;votre votre vos;leur leur leurs ⑵用法:放在名词前,与名词性数一致;如名词是以元音或哑音h开始,ma,ta,sa变mon,ton,son 例如: mon amie 2指示形容词:⑴构成:ce(cet),cette。ces ⑵用法:放在名词前,与名词性数一致;cet放在以元音或哑音h开始的阳性名词前。 例如:cet étudiant 3品质形容词:法语中大多是这类形容词,一般放在名词后,但有少数可放在名词前,又可放在名词后 (grand,petit,jeune,beau,vieux, nouveau, seul, joli, cher, chaque, ancien, gras, bon, mauvais, plusieurs,一般放名词前) Prénom 1 人称代词:⑴主语人称代词:je tu il/elle nous vous ils/elles 只能做主语 ⑵重读人称代词:moi toi lui/elle nous vous eux /elles 用法:一般放在c’est及介词后,还可做同谓语 c’est moi./ c’est une lettre pour toi. / moi, j’ai faim. 几个人称同时出现时顺序是:你,我,他(她,它) ⑶宾语人称代词:直接宾语人称代词:me te le/la nous vous les 间接宾语人称代词:me te lui nous vous leur 自反代词:me te se nous vous se 位置:1除肯定命令式以外的其他句型,放在相关动词前. 2肯定命令式中放在动词后,且me,te变moi,toi 3在最近将来时及最近过去时中,放在动词原应前 .4复合过去时放助动词前。 用法:①直接宾语人称代词:直接宾语且是人称时用

新大学法语第一册U1-9语法知识点整理

新大学法语第一册U1-9语法知识点整理新大学法语第一册UNITE1-9语法知识点整理Unité 2---Texte A 名词见名词知识点整理 Unité 2---Texte B 法语的钟点表达法: 1、表示钟点用无人称短语il est... Il est neuf heures, 现在九点钟。 Il est midi. 中午 Il est minuit. 午夜十二点。 2、表示―半‖ Il est neuf heures et demie. 九点半。注意这里的―demie‖用的 是阴性形式,因为heure是阴性名词。 3、表示―刻‖ Il est une heure et quart. 一点一刻 Il est sept heures trois quarts. 九点三刻=十点差一刻4、表示―分‖ Il est huit heures une (minute). 八点零一分 Il est trois heures vingt-cinq. 三点二十五分5、表示―差‖ Il est cinq heures moins quatre. 五点差四分 - 1 - 新大学法语第一册UNITE1-9语法知识点整理 Il est sept heures moins le quart. 七点差一刻。注意这里的 ―le‖,千万不能少。 6、欧洲大陆日常生活中使用二十四小时制。如果一个法国 人说sept / huit / neuf / dix / onze heures, 他通常说的是早晨

7/8/9/10/11点。有时也会用12小时制,为了避免混淆,在钟 点后加上du matin, de l'après-midi, du soir。写小时时,法国人 用字母 "h"来代替。如: 9:00 = 9h, 10:30 = 10h30. 介词à 和de的用法 A通常引出时间、地点或愿望: A demain ! 明天见A votre santé !为健康干杯Nous habitons à Jinhua我们住在金华 Je vais aller à Shanghai我要去上海 De通常表示起点、来源或从属,即―来自……‖、―从……‖。 Il est originaire de Shanghai.他是上海人。C’est l’étudiante de professeur Wang这是汪老师的学生 否定式 常见的形式是:ne + 动词 + pas (ne 碰到以元音字母或哑音 h开头的动词时变成 n' EX:Aujourd'hui je n'ai pas faim. Je ne déjeunerai pas. Je n'aime pas le vin blanc. Pierre n'habite pas chez ses parents. - 2 - 新大学法语第一册UNITE1-9语法知识点整理 Unité 3---Texte A 法语疑问句 法语的疑问句有多种形式,主要为两大类:一般疑问句和特殊疑问句。 一般疑问句:

基于FPGA的verilog的电子密码锁设计

一、概述 1.1 电子密码锁的现状 随着我国对外开放的不断深入,高档建筑发展很快,高档密码锁具市场的前景乐观。我国密码锁具行业对密码锁具高新技术的投入正逐年增大,高档密码锁的市场需求也逐年增加。在安防工程中,锁具产品是关系到整个系统安全性的重要设备,所以锁具产品的优劣也关系了整个安防工程的质量和验收。 目前,市场上比较先进的智能电子密码锁分别有:IC卡电子密码锁、射频卡式电子密码锁、红外遥控电子密码锁、指纹识别电子密码锁和瞳孔识别电子密码锁等。IC卡电子密码锁成本低,体积小,卡片本身无须电源等优点占领了一定的市场份额,但是由于有机械接触,会产生接触磨损,而且使用不太方便,在一定程度上限制了它的应用;射频卡式电子密码锁是非接触式电子密码锁,成本也不太高,体积跟IC卡密码锁相当,卡片使用感应电源,重量很轻,技术成熟,受到了广泛的欢迎,但是与IC卡电子密码锁相比,成本偏高;指纹识别电子密码锁和瞳孔识别电子密码锁可靠性很高,安全性是目前应用系统中最高的,但是成本高昂,还没进入大众化使用阶段。 在国外,美国、日本、德国的电子密码锁保密性较好,并结合感应卡技术,生物识别技术,使电子密码锁系统得到了飞跃式的发展。这几个国家的密码锁识别的密码更复杂,并且综合性比较好,已经进入了成熟期,出现了感应卡式密码锁,指纹式密码锁,虹膜密码锁,面部识别密码锁,序列混乱的键盘密码锁等各种技术的系统,它们在安全性,方便性,易管理性等方面都各有特长,新型的电子密码锁系统的应用也越来越广。 基于FPGA的电子密码锁是新型现代化安全管理系统,它集微机自动识别技术和现代安全管理措施为一体,它涉及电子,机械,计算机技术,通讯技术,生物技术等诸多新技术。它是解决重要部门出入口实现安全防范管理的有效措施,适用各种场合,如银行、宾馆、机房、军械库、机要室、办公间、智能化小区、工厂、家庭等。 在数字技术网络技术飞速发展的今天,电子密码锁技术得到了迅猛的发展。它早已超越了单纯的门道及钥匙管理,逐渐发展成为一套完整的出入管理系统。它在工作环境安全、人事考勤管理等行政管理工作中发挥着巨大的作用。在该系统的基础上增加相应的辅助设备可以进行电梯控制、车辆进出控制,物业消防监控、餐饮收费、私家车库管理等,真正实现区域内一卡智能管理。

从Verilog到VHDL(上)基本语法

从Verilog 到VHDL(上)基本语法 16 六 从学校里开始,我所接触的就一直是VerilogHDL 而非更老牌的VHDL, 而且后续接触的项目中也多半是Verilog 的用户,坦白的讲,Verilog 的活力也确实更足一些,从 IEEE1800-2005 开始的SystemVerilog 的标准化,将 Verification 和Design 的一体化的尝试,我个人认为,是走在正确的道路上。 所以,我确实想不到,我竟然也要回头学起VHDL 来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL ,看来终究是绕不过去的了正如一个Design Verification 工程师在目前想完全的不和SpecmanE 打交道是很难的一样。 面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来 没有接触过VHDL ,当然会存在很多非常初级的东西。 而在本文之后,打算再写一篇简单阐述下结合Cadence 的IUS 工具,使用SystemVerilog 对VHDL 进行验证的基本方

法。 起手式从Verilog 撞进VHDL 的世界,有些东西要先搞清 楚,否则会一头雾水: 1. 大小写敏感:Verilog 是大小写敏感的,VHDL 则非; 2.注释:Verilog 的行注释为// ,块注释为/**/;VHDL 只 支持 行注释–;[1. 这个算是不方便的一个地方了,不过不 基本结构 论是在Vim 还是Emacs 当中,批量做行注释也很容易实现;] VHDL 被认为是要求更严格,更多讲究的语言,相比和 C 类 似的Verilog ,架构上更严谨一些: 1.基本结构:从上往下为 USE 定义区(调用库和包);Package 定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规 格); [2. Entity 感觉像是 C 的头文件定义之类的东西,而在Verilog 当中,这些其实都是被整合在Module 里头一起完成 了。]Architecture 定义区(描述内部功能);[3. 同 上,相当于Verilog 的Module 内部实现。]Configuration 定义区(决定那个Architecture 被使用)[4. 这也许就是 之所以要分开 Arch 和Entity 的原因,类似的效果在Verilog 里实现,则

【法语语法】qui quoi que用法总结

qui quoi que用法总结如下: I. que的用法 1)que, qu'est-ce que用在直接疑问句中,直接疑问句中,que后主谓语的位置倒置。日常用语中直接疑问句主要用qu'est-ce que. Que dit-il? Qu'est-ce que tu as fait? 2)ce que用在间接疑问句中。 Ne fais pas attention, il a trop bu: il ne sait pas ce qu'il dit. Je ne te dirai pas qu'est-ce que (ce que) j'ai fait hier. 3)que, qu'est-ce que , ce que 用在直接感叹句中. Qu'il fait beau aujourd'hui! Qu'est-cd qu'elle peut etre ennuyeuse cette fille! Ce qu'il est gentil, quand meme! 4)ce que用在间接感叹句中,例如: Tu as vu ce qu'elle est belle! 5)que作从句的直接宾语,Ces fleurs que tu m'as offertes sont vraiment tres jolies! 6)ce que可以起各种语法作用,不管它前面有没有介词。 J'ai vu ce que tu m'as apporte, c'est tres gentil de ta part. Tu as pense a ce que je t'ai dit hier? 7)que在并列从句中相当于第一个从句的连词。 On partira quand le film sera fini et que nous aurons mange. 8)que相当于动词后的quoi -- Que dit-il? -- Il dit quoi? II qui的用法 1)qui(pron. interr.), qui est-ce qui, qui est-ce que在日常用语中,只用在直接疑问句或间接疑问句中。 Qui est-ce qui vient avec nous au theatre? On a sonne, qui est-ce? -- Qui a telephone? -- Quelqu'un, mais je ne sais pas qui. Chez qui est-ce que tu vas dimanche? -- On t'a demande? -- Qui ca? 2)ce qui用在问物的间接疑问句中,它只作主语。 Dis-moi ce qui se passe. Tu sais ce qui vient ensuite? (你知道后面还有什么吗?) 3)qui [pron.rel.]的先行词可以是表示人的名词;在这种情况下,它可以作主语或前面有介词的间接宾语。当qui作主语时,动词和作表语的形容词或分词要和先行词配合。 Je connais l'homme avec qui tu parlais tout a l'heure. Moi, Aline , qui suis gentille. 4)qui的先行词还可以是表示物或动物的名词,这里它只用作主语。

基于FPGA的VerilogHDL数字钟设计

基于FPGA的Verilog-HDL数字钟设计--

————————————————————————————————作者:————————————————————————————————日期:

基于FPGA的Verilog HDL数字钟设计 专业班级姓名学号 一、实验目的 1.掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程; 2.熟悉一种EDA软件使用; 3.掌握Verilog设计方法; 4.掌握分模块分层次的设计方法; 5.用Verilog完成一个多功能数字钟设计; 6.学会FPGA的仿真。 二、实验要求 功能要求: 利用实验板设计实现一个能显示时分秒的多功能电子钟,基本功能: 1)准确计时,以数字形式显示时、分、秒,可通过按键选择当前显示时间范围模式; 2)计时时间范围00:00:00-23:59:59 3)可实现校正时间功能; 4)可通过实现时钟复位功能:00:00:00 扩展功能: 5)定时报:时间自定(不要求改变),闹1分钟(1kHz)---利用板上LED或外接电路实现。 6)仿广播电台正点报时:XX:59:[51,53,55,57(500Hz);59(1kHz)] ---用板上LED或外接 7)报整点时数:XX:00:[00.5-XX.5](1kHz),自动、手动---用板上LED或外接

8)手动输入校时; 9)手动输入定时闹钟; 10)万年历; 11)其他扩展功能; 设计步骤与要求: 1)计算并说明采用Basys2实验板时钟50MHz实现系统功能的基本原理。 2)在Xilinx ISE13.1 软件中,利用层次化方法,设计实现模一百计数及显示的电路系 统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。 3)对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快 得出仿真结果)。 4)输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit文件。 5)在Basys2实验板上下载所生成的.bit文件,观察验证所设计的电路功能。 三、实验设计 功能说明:实现时钟,时间校时,闹铃定时,秒表计时等功能 1.时钟功能:完成分钟/小时的正确计数并显示;秒的显示用LED灯的闪烁做指示; 时钟利用4位数码管显示时分; 2.闹钟定时:实现定时提醒及定时报时,利用LED灯代替扬声器发出报时声音; 3.时钟校时:当认为时钟不准确时,可以分别对分钟和小时位的值进行调整; 4.秒表功能:利用4个数码管完成秒表显示:可以实现清零、暂停并记录时间等功能。 秒表利用4位数码管计数; 方案说明:本次设计由时钟模块和译码模块组成。时钟模块中50MHz的系统时钟clk分频产

法语基础语法总结

I主语人称代词 如同英语中人称代词主格,用作主语。 1)1)1)tu 用作家人、好友间;vous(您)礼貌、尊重。 2)2)2)第三人称也可用作(它,它们) * 抽象名词前,一般用定冠词Je n’aime pas le café. * 名词作表语,表身份、职业、国籍时,可省冠词Je suis étudiant. * 定冠词le les前有介词à, de 时,要缩合au(à + le) , aux (à + les) , du ( de + le ) , des ( de + les )。Nous allons au magasin. III名词 1.1.1.阴阳性人与动物的自然性别或固定用法un étudiant/ une étudiante le frère/ la so e ur une valise mon bureau 某些行业无阴性,但可用于女性un professeur 2.2.2.复数词尾加s 但不发音;un stylo/des stylos, une chaise / des chaises;-s –x –z 单复数相同un cours / des cours;-eau, -au, -eu结尾复数加x 但不发音un tableau / des tableaux;-al结尾复数改为-aux un journal/ des journaux 3.3.3.种类月份、星期、语种在法语中不属于专用名词,词首不用大写décembre, fran?ais IV动词变位 法语按动词变位分为三组: 第一组-er结尾;第二组-ir结尾;第三组-re, -oir, -ir结尾 直陈式现在时(英语中的现在进行时和一般现在时)中,第一组动词变位如下: parler je parle vous parlez tu parles nous parlons il parle ils parlent V一般疑问句 1.陈述句型,语调上升V ous parlez anglais ? 2.主谓倒置,中加- Etes-vous médecins ? 第三人称单数不以t, d结尾时A-t-il un manuel de fran?ais ? 3.疑问词放前Est-ce qu’elle a un manuel de fran?ais ? GRAMMAIRE I主有形容词

新大学法语第二学期语法

第一册:Unité 9 ●强调句型:c’est ... qui / c’est ... que 1. 强调主语用c’est ... qui, 如果主语是代词,必须用其重读形式 2. 强调主语以外的成分用c’est ... que 3. 强调复数,用ce sont ... qui / ce sont ... que 4. 强调部分前有介词,将介词一起放在强调短语之间 5. 被强调成分是间接宾语代词时,强调短语中换为“à+重读人称代词” Mon oncle m’a aidé à obtenir cet empl oi---c’est mon oncle qui m’a aidé à obtenir cet emploi. Mon frère a acheté une voiture---c’est une voiture que mon frère a acheté. Il part pour Paris aujourd’hui---c’est aujourd’hui qu’il part pour Paris. J’ai envie d’une crème glacée àla framboise---c’est d’une crème glacée à la framboise que j’ai envie. Attention !: Elle parle de Frédéric---C’est de Frédéric qu’elle parle. Elle parle à Frédéric---C’est àFrédéric qu’elle parle. Je suis arrivée en retard à cause de Frédéric.---C’est à cause de Frédéric que Je suis arrivée en retard. ●中性代词le,无性数变化 作直宾,代替一个不定式动词Partons, il le faut.我们走吧,必须走。 作表语,代替一个表示身份或职业的名词Ta mère est médecin, je crois que tu le seras un jour 作表语,代替一个形容词V ous voyez ces deux jumeaux, quand l’un est content, l’autre le ser a aussi. 代替一个句子Tu n’as pas bien écrit, je le sais, dit le petit Paul。 Unité 10 ●最近过去时 意义:表示刚刚发生或刚刚完成的动作 构成:venir(直陈式现在时)+de+inf. 例句:Je viens de finir mon travail. - Il vient d’être dix heures. - Nous venons d’entrer dans la classe. ●最近将来时 意义:表示立即要发生的动作 构成:aller(直陈式现在时)+inf. 例句:Je vais partir à dix heures. - Il va être dix heures. - Nous allons apprendre la grammaire de l’ unité 10.

相关文档