搜档网
当前位置:搜档网 › verilog学习心得.

verilog学习心得.

verilog学习心得.
verilog学习心得.

verilog学习心得

1.数字电路基础知识:布尔代数、门级电路的内部晶体管结构、组合逻辑电路分析与设计、触发器、时序逻辑电路分析与设计

2.数字系统的构成:传感器AD 数字处理器DA 执行部件

3.程序通在硬件上的执行过程:

C语言(经过编译-->该处理器的机器语言(放入存储器-->按时钟的节拍,逐条取出指令、分析指令、执行指令

4.DSP处理是个广泛概念,统指在数字系统中做的变换(DFT、滤波、编码解码、加密解密、压缩解压等处理

5.数字处理器包括两部分:高速数据通道接口逻辑、高速算法电路逻辑

6.当前,IC产业包括IC制造和IC设计两部分,IC设计技术发展速度高于IC设计

7.FPGA设计的前续课程:数值分析、DSP、C语言、算法与数据结构、数字电路、HDL语言计算机微体系结构

8.数字处理器处理性能的提高:软件算法的优化、微体系结构的优化

9.数字系统的实现方式:

编写C程序,然后用编译工具得到通用微处理器的机器指令代码,在通用微处理器上运行(如8051/ARM/PENTUIM

专用DSP硬件处理器

用FPGA硬件逻辑实现算法,但性能不如ASIC

用ASIC实现,经费充足、大批量的情况下使用,因为投片成本高、周期长

10.FPGA设计方法:IP核重用、并行设计、层次化模块化设计、top-down思想

FPGA设计分工:前端逻辑设计、后端电路实现、仿真验证

11.matlab的应用:

matlab中有许多现成的数学函数可以利用,节省了复杂函数的编写时间

matlab可以与C程序接口

做算法仿真和验证时能很快生成有用的数据文件和表格

DSP builder可以直接将simulink模型转换成HDL代码,跳过了中间的C语言改写步骤

12.常规从算法到硬件电路的开发过程:

算法的开发

C语言的功能描述

并行结构的C语言改写

verilog的改写

仿真、验证、修正

综合、布局布线、投入实用

13.C语言改写成verilog代码的困难点:

并行C语言的改写,因为C本身是顺序执行,而不是并行执行

不使用C语言中的复杂数据结构,如指针

目前有将C语言转换成verilog的工具?

14.HDL

HDL描述方法是从电路图描述方法演化来的,相比来说更容易修改

符合IEEE标准的有verilog HDL和VHDL

VHDL由美国国防部开发,有1987和1993两个版本

verilog由cadence持有,有1995、2001、2005三个版本

verilog较VHDL更有前景:具有模拟电路描述能力、不仅可以开发电路还可以验证电路、门级以下描述比VHDL强

RTL级和门级的综合已经成熟,主要是注意行为级的综合结果,使用可综合的编程风格

SYSTEM VERILOG是VERILOG的一种延伸

15.IP核的应用:

软核soft core:功能经过验证的、可综合的、实现后门数在5K以上的HDL代码固核firm core:功能经过验证的、可综合的、实现后门数在5K以上的电路结构编码文件,如edif,不可更改

硬核hard core: 功能经过验证的、可综合的、实现后门数在5K以上的电路结构版图,已带工艺参数,不可更改

16.HDL语言综合后得到EDIF,这是一种标准电路网表

EDIF经过具体工艺库匹配、布局布线、延时计算后得到网表

EDIF不可更改,作为固核存在

17.verilog特点:

区分大小写,所有关键字都要求小写

不是强类型语言,不同类型数据之间可以赋值和运算

//是单行注释可以跨行注释

描述风格有系统级描述、行为级描述、RTL级描述、门级描述,其中RTL级和门级别与具体电路结构有关,行为级描述要遵守

可综合原则

门级描述使用门级模型或者用户自定义模型UDP来代替具体基本元件,在IDE 中针对不同FPGA器件已经有对应的基本元件

原语

18.verlog语法要点:

module endmodule之间由两部分构成:接口描述和逻辑功能描述

IO端口种类:input output inout

相同位宽的输入输出信号可以一起声明,input[3:0] a,b; 不同位宽的必须分开写内部信号为reg类型,内部信号信号的状态:0 1 x z,3'bx1=3'bxx1 x/z会往左扩展

3'b1=3'b001 数字不往左扩展

逻辑功能描述中常用assign描述组合逻辑电路,always既可以描述组合逻辑电路又可以描述时序逻辑电路,还可以用元件调用

方法描述逻辑功能

always之间、assign之间、实例引用之间以及它们之间都是并行执行,always内部是顺序执行

常量格式:<+/-><二进制位宽><'><进制><该进制的数值>:

默认进制为10进制

默认位宽为32位

位宽是从二进制宽度角度而言的

由位宽决定从低位截取二进制数2'hFF=2'b11,通常由被赋值的reg变量位宽决定

parameter常用于定义延迟和变量位宽,可用常量或常量表达式定义

变量种类:wire reg memory

IO信号默认为wire类型,除非指定为reg类型

wire可以用作任何输入输出端口

wire包括input output inout

wire不带寄存功能

assign赋值语句中,被赋值的信号都是wire类型

assign之所以称为连续赋值,是因为不断检测表达式的变化

reg类型可以被赋值后再使用,而不是向wire一样只能输出,类似VHDL中的buffer端口

reg类型变量初始值为x (VHDL中初始值为本类型最小值,通常是0

always模块里被赋值的信号都必须定义为reg类型,因为always可以反复执行,而reg表示信号的寄存,可以保留上次执行的

reg类型变量与integer变量不同,即使赋负值,实质上也是按二进制无符号数存储的,integer是有符号数verilog中所有内部信号都是静态变量,因为它们的值都在reg中存储起来了

memory型只有一维数组,由reg型变量组成

memory初始化只能按地址赋值,不能一次性赋值

1*256的memory写法:reg mema[255:0] mema[3]=0;

不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取

A[a:b] 无论a b谁大,a总是实际电路的信号高位,b总是实际电路的信号低位

算术运算中如果有X值则结果为X

for循环中的变量另外定义成integer,因为它不是实际信号,有正负;reg则以无符号数存在

== 和!=只比较0、1,遇到z或x时结果都为x (x在if中算做假条件,结果可能是1、0、x

===和!==比较更加苛刻,包括x和z的精确比较,结果可能是0、1

&&的结果只有1'b1或1'b0两种,A&A的结果位宽则是与A相同的

{1,0}为64'h100000000,所以拼接运算中各信号一定要指定位宽

移位运算左移将保留4'b1000<<1等于5'b10000,右移则舍弃4'b0011等于

4'b0001

数字电路里位运算应用普遍,包括按位逻辑运算、移位运算、拼接运算、缩减运算

非阻塞式赋值<=与阻塞式赋值=

阻塞:在同一个always过程中,后面的赋值语句要等待前一个赋值语句执行完,后面的语句被该赋值语句阻塞非阻塞:在同一个always过程中,非阻塞赋值语句是同时进行的,排在后面的语句不会被该赋值语句阻塞

<=:

块结束后才能完成赋值

块内所有<=语句在always块结束时刻同时赋值

<=右边各变量的值是上一次时钟边沿时,这些变量当时的值

用于描述可综合的时序电路

=:

=语句结束之后过程always才可能结束

在always过程中,begin end块内按先后顺序立即赋值,在fork join内同时赋值(可能造成冲突

与assign连用描述组合电路

begin end中阻塞的含义:begin ...@(A B=C...; end 如果A事件不发生则永远不能执行下去,被阻塞了由于时钟的延时(往往在ps级,多个always(posedge之间究竟谁先执行是个未知数

使用原则:同一个always过程块内建立时序电路用<=

纯组合逻辑电路用=,生成的电路结构最简单,执行速度最快

同一个always块内不要混用<=和=

不要在多个always块内对同一个变量赋值(多源驱动

if else的三种形式,第三种形式适合描述优先编码器

if条件中0/x/z当成假,1当成真,非0的数值也当成真

case语句的三种:case(四种状态的比较 casez(忽略z casex(忽略x和z,只看哪些位的信号有用 case语句中所有表达式值的位宽必须相等,default中不能将n'bx用'bx 代替

避免生成锁存器的方法:电平触发时if后加else case中加default ?

使用casex会将不必要的状态视为无关项,使得综合出来的电路最简单

两种特殊的括号:begin 顺序语句... end fork 并行语句... join,其差别在于块内语句的起止时间、执行顺序、相对延时块被命名后,其内部变量可以被调用,因为变量都是静态的(调用信号:对应电路中的一个信号线被引到另一处

initial块只无条件执行一次always块在满足条件时不断执行

initial常用来写测试文件,always块常用来写电路描述

always既可以描述组合逻辑电路又可以描述时序逻辑电路

always如果后面有敏感信号列表则不能用wait语句

always既可以描述电平触发又可以描述边沿触发,wait只能描述电平触发

assign常用于描述组合逻辑电路

测试文件中一般都是现initial 后always

生成语句:生成快的本质是使用循环内的一条语句代替多条重复的verilog语句,简化了用户的编程

genvar用于声明生成变量,生成变量只能用在生成快之间

仿真时,仿真器会将生成块中的代码展平,在确立后的方针代码中,生成变量是不存在的

最好是先想象出来循环生成语句被展平后的电路样子,再写相关的描述语句

task和function的区别:

task可以定义自己的仿真时间单位,function与主模块共用同一个仿真时间单位

函数不能启动任务,任务能够启动函数

函数至少要有一个输入变量,任务没有输入变量

函数返回一个值,任务不返回值

一个模块的设计包括3个部分:电路模块的设计测试模块的设计设计文档的编写

设计者通过布局布线工具生成具有布线延迟的电路,再进行后仿真,得到时序分析报告从时序分析报告中可以知道电路的实际延迟t,同步电路内每个时钟周期要大于t,从而可确定该运算逻辑的最高频率综合器之所以能够实现加法器、乘法器是因为库中已经存在可配置的参数化器件模型

FPGA内总线宽度容易自定义,以便实现高速数据流,三态数据总线相当于数据流的控制阀门数字系统内数据流的控制:开关(或三态数据总线、数据暂存部件(寄存器、同步状态机控制(整个系统在一个时钟域内

流水线操作pipe line:

K级流水线就是从组合逻辑的输入到输出恰好有K个寄存器组,上一级的输出是下一级的输入

流水线操作获得第一个结果的时间要比不用流水线操作的时间长,但以后结果获得时间都只需要一个时钟周期,提高了数据吞

吐量

流水线操作的保证:Tclk>K*(组合逻辑延迟+触发器的建立保持时间/触发时间,即时间片段要长于最大路径延迟

体现了面积换速度的思想,在综合时考虑的是以面积小为主还是以速度为主

本质上是一种同步逻辑

同步时序逻辑和异步时序逻辑:

同步时序逻辑指所有寄存器组由唯一时钟触发always@(posedge clk 或

always@(negedage clk 异步时序逻辑指触发条件不唯一,任意一个条件都会引起触发always@(posedge clk or posedage reset

目前的综合器是以同步时序逻辑综合的,因为同步时序逻辑较异步时序逻辑可靠严格的同步要求时钟信号传递速度远远大于各部分的延迟,实际中clk要单独用线,而不要经过反相器等部件

always @(posedge.. begin ...<=... end 表示同步时序逻辑(同时刻赋值

不同速率数据接口的处理方法(异步数据的处理方法:帧同步FIFO 双端口RAM

同步状态机:

包括moore和mealy型两种,及其反馈模型(是一种反馈控制系统,当前状态就是其内部状态变量

状态机的开发步骤:

根据实际问题列出输入输出变量和状态数

画出状态图并化简

写出状态转移真值表得到逻辑表达式

用D触发器或JK触发器构建电路(目前用D触发器多

verilog描述时只需要得到简化的状态图就可以描述

状态编码方式:独热码格雷码

状态机主体程序有单always描述方式和多always描述方式

采用case/casez/casex建立模型最好,因为x是无关态,生成的电路最简单

default: state='bx与实际情况更一致,效果等同于default: state<=idle

只有同步状态机才能被目前的综合

for语句会将所有变量的情况展开,占用巨量逻辑资源,替代办法是用计数器和case语句说明所有情况

有优先级的if else结构会消耗更多资源,建议用无优先级的case替代

模块的复用往往比代码上修改节省的资源多

PLL的分频、倍频、移相操作会增加设计精度

同步时序电路的延时:#x通常用于仿真测试,实际硬件延时是:长延迟用计数器,小延迟用D触发器,此方法用来取代延迟链同步电路中,稳定的数据采用必须满足采样寄存器的建立和保持时间

reg类型在always中不一定综合成时序电路,也可能是组合逻辑电路

乒乓操作与作用异步时钟域同步问题

延迟包括门延迟和线延迟

组合逻辑产生的时钟仅能应用在时钟频率较低、精度要求不高的情况下

增减敏感信号得到的结果一样

补充部分:

verilog HDL起初是作为写testbench而产生的

verilog 有1995进入IEEE标准,为IEEE-1364, 于2001年进行了扩展,为IEEE 1364-2001;

verilog AMS可用于模拟电路和数字电路的综合,目前正在不断发展和完善中;

verilog的标识符区分大小写,关键字使用小写;

用\\来进行单行注释,用\* *\来进行跨行注释;

标识符由字母、数字、下划线构成,并以字母开头;

关键字又叫保留字,只有小写的关键字才是保留字;

信号的状态有4种:0 1 x z

x和z在描述电路时不区分大小写,在仿真时大小写有不同意义;

常量表达式中:

x z不区分大小写;

进制符号h o d b与H O D B不区分大小写;

十六进制中a~f不区分大小写;

下划线_用于提高可读性;

?在数中可以代替z;

x和z的左端补位;

字符和字符串都以 ASICII 码形式存在,也可以当成电路内的信号;字符串必须包含在同一行,不能分成多行书写;如果表达式或者赋值语句中将字符串当成操作数,则字符串中的每个字符都被看成 8 位的 ASCII 值序列;可综合的信号类型:wire reg memory 它们用来描述数字电路不可综合的数据类型:integer real 它们只用仿真,位于 testbench 中 wire 是连线的抽象模型,不能保存数据,其值由驱动元的值决定; wire 不能用在 always 或 initial 块中; wire 的默认值为高阻 z;wire 的使用情形: 1.作为模块的输出端口 2.用连续赋值语句 assign 赋值; reg 是 1 位寄存器(触发器)的抽象模型,可以保存数据; reg 必须用在 always 或 initial 块中; reg 的默认值为 x; reg 的使用情形:1.阻塞赋值<= 2.非阻塞赋值= memory 只能是一维的; memory 只能对每个单元分别初始化,方法:1.一个一个赋值 2. 通过系统任务$readmem 赋值 reg[3:0] fc;//一个 4 位寄存器 reg fc[3:0] //4 个一位寄存器parameter 的作用:仿真开始以前对其进行赋值,整个仿真过程中保持其值不变;关系运算符将以逻辑 1 或逻辑 0 返回比较的结果; == !=的返回值有 0 1 x 三种情况,=== !==的返回值只有 0 1 两种情况; verilog 由于是描述电路的,用于位的操作较多,有: 位逻辑操作,移位操作,并置操作,归约操作;位逻辑运算的结果中,位数与原操作数一样多;归约符是在原操作数的所有位上进行操作,并产生 1 位结果;并置运算可以发生在 bit 与 bit 之间 bit 与矢量之间矢量与矢量之间用于仿真的系统任务:所有系统任务都必须在 initial 或 always 内;所有系统任务都必须以$开头;常见系统任务:显示任务($diplay 系列和$write 系列监控任务($monitor 系列探测任务($strobe 系列文件打开、输入、关闭任务(&fopen &fclose &fdisplay... 读取文件任务($readmemb $readmemh 仿真结束控制任务($finish $stop

随即信号任务($random 过程块: initial 块和 always 块一个 module 内可以包含多个initial 或 always 模块;所有 initial 或 always 块在 0 时刻开始并行执行,各 initial

或 always 块内部顺序执行; initial 过程块主要是面向 testbench 的,通常不具有可综合性; always 过程块在描述电路时既可以描述组合逻辑电路(电平敏感又可以描述时序逻辑电路(边沿敏感;写 testbench 时 initial 通常用于初始化以及顺序波形的描述,always 通常用于重复波形的描述;

任务 task 与函数 function: 为了描述模块中被多次执行的部分以及为了增强代码的易读性 verilog 中的高级程序语句如 for 循环语句只用在写 testbench 中; begin end 和 fork join 是两种特殊的括号 if 语句的第三种形式适合描述优先编码器,case 语句适合描述数据选择器和状态机; case 的条件表达式如果与分支项表达式长度不同,则在比较前将所有表达式都统一为这些表达式的最长长度; casez 忽略 z,casex 忽略 z 和 x; assign 语句只在右端表达式发生变化时才重新计算并重新赋值,其余时间都是连续赋值; assign 语句可以指定 bit、vector 或是任意拼接操作的结果; assign 语句是连续赋值的,用于驱动网线 wire, reg 类型不需要连续赋值,reg 类型一旦被赋值就会一直保存;过程赋值语句有两种:阻塞式=和非阻塞式<=,只能在过程块 initial 和 always 中使用; @对事件触发的控制与 wait 语句不能同时使用;

VerilogHDL经典程序非常适合新手

一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0; 2'b01:y=i1; 2'b10:y=i2; 2'b11:y=i3; default:y=0; 一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0;

VerilogHDL实例

本文档含有很多Verilog HDL例子://与门 module zxhand2(c,a,b); input a,b; output c; assign c= a & b; endmodule //或门 module zxhor2(c,a,b); input a,b; output c; assign c= a | b; endmodule //非门 module zxhnot2(c,b); input b; output c; assign c=~ b; endmodule ////异或门 module zxhxro2(c,a,b); input b; output c; assign c=a ^ b; endmodule 两选一电路 module data_scan(d0,d1,sel,q); output q; input d0,d1,sel; wire t1,t2,t3; n1 zxhand2(t1,d0,sel); n2 zxhnot2 (t4,sel); n3 zxhand2(t2,d1,t4); n4 zxhor2(t3,t1,t2);

assign q=t1; endmodule verilog HDL实例(一) 练习一.简单的组合逻辑设计 目的: 掌握基本组合逻辑电路的实现方法。 这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。在Verilog HDL中,描述组合逻辑时常使用assign结构。注意 equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。 模块源代码: //--------------- compare.v ----------------- module compare(equal,a,b); input a,b; output equal; assign equal=(a==b)?1:0; //a等于b时,equal输出为1;a不等于b时, //equal输出为0。 endmodule 测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。 测试模块源代码: `timescale 1ns/1ns //定义时间单位。 module comparetest; reg a,b; wire equal; initial //initial常用于仿真时信号的给出。 begin a=0; b=0; #100 a=0; b=1; #100 a=1; b=1; #100 a=1; b=0; #100 $stop; //系统任务,暂停仿真以便观察仿真波形。 end compare compare1(.equal(equal),.a(a),.b(b)); //调用模块。 Endmodule

用veriloghdl设计计数器

用Verilog HDL设计计数器 一、实验目的 1. 学习使用Verilog HDL语言,并学会使用进行QuartusⅡ软件编 程和仿真; 2. 掌握数字电路的设计方法,熟悉设计过程及其步骤; 3. 培养学生的动手能力,能学以致用,为今后从事电子线路设计 打下良好基础; 4. 巩固加深对数电知识的理解,在仿真调试过程中,能结合原理 来分析实验现象; 二、实验内容 1.设计内容及要求 1)利用Verilog HDL设计一个以自己学号后三位为模的计数器; 2)编写源程序; 3)给出仿真电路图和仿真波形图; 2.需求分析: 由于本人的学号后3位为212,所以应编一个以212为模的加法计数器。若采用同步清零的方法,则计数为0~211,化为二进制数即为0 0000 0000计到0 1101 0011。 3.编写源代码: module count_212(out,data,load,reset,clk);

output [8:0] out; input [8:0] data; input load,reset,clk; reg [8:0] out; always @(posedge clk) + A[8..0] B[8..0] ADDER < CIN A[8..0] B[8..0] LESS_THAN 1 D ENA Q PRE CLR D ENA Q PRE CLR D ENA Q PRE CLR D ENA Q PRE CLR D ENA Q PRE CLR D ENA Q PRE CLR D ENA Q PRE CLR D ENA Q PRE CLR D ENA Q PRE CLR SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 Les s Than0 9' h0D3 -- out[0]~reg0 out[1]~reg0 out[2]~reg0 out[3]~reg0 out[4]~reg0 out[5]~reg0 out[7]~reg0out[8]~reg0 out~[8..0] 9' h000 -- res et clk out[8..0] data[8..0] out~[26..18] 9' h000 -- out~[17..9] load out[6]~reg0A dd0 9' h001 --

常用VerilogHDL 语法总结

常用VerilogHDL 语法总结 1 模块 (1)端口定义:声明模块的输入输出口。引用模块时端口的两种连接方法。 (2)模块内容:I/O说明(输入输出)、内部信号说明(和端口有关的变量说明)、功能定义(定义逻辑功能的三种方式:assign 声明语句;实例元件;always 块)。 (3)理解要点:整体语句并发执行,always块内顺序执行。 2 常量 (1)数字:整数及三种表达方式 x和z值 负数:减号的位置 下划线:位置和作用 (2)参数:parameter符号常量,常用于定义延迟时间(使用#)和变量宽度。 3 变量 (1)wire:表示易assign指定的组合逻辑信号;默认值;任何方程式的输入或assign语句及实例元件的输出;定义格式。(2)reg:表示always块中指定的信号,代表触发器;寄存器数据类型(触发器存储值),默认值为x;定义格式。 (3)memory:reg的数组;描述RAM、ROM、reg文件;单元索引;一个n为寄存器和n个一位数组的区别。 4 运算符与表达式 (1)算术运算符:五种 (2)位运算符:五种 (3)逻辑运算符:三种 (4)关系运算符:四种(3种不同的返回值) (5)等式运算符:四种 (6)移位运算符:两种(移位补零) (7)位拼接运算符:{},常用于某些控制信号位;重复与嵌套使用 (8)缩减运算符:类似于逻辑运算符,结果为一位二进制数(9)运算符优先级 5 语句 (1)赋值语句 阻塞赋值:b<=a;块结束后完成赋值,b的值不是立即改 变的,较为常用; 非阻塞赋值:b=a;赋值语 句执行后块才结束,b的值马上 改变,在沿触发的always块中 使用可能引起错误后果。 (2)块语句 顺序块begin-end:顺序执 行,最后语句执行完流程跳出语 句块; 并行块fork-join:同时执 行,时间最长语句执行完或 disable语句执行时跳出程序 块; 块名的作用; 起始时间和结束时间 (3)条件语句 If-else语句:三种形式; if表达式判断;分号;复合语句; 表达式简写;if语句嵌套;if 与else的配对。 Case语句:三种形式 (casez:不考虑z进行比较, casex:不考虑z和x进行比较); 控制表达式与分支表达式(常量 表达式);default;所有表达式 的位宽必须相等。 条件语句使用不当造成锁 存器:避免错误:case中使用 default,if必须搭配else。 (4)循环语句 Forever:格式;连续执行; Repeat:格式;连续执行n 次;表达式通常为常量表达式; While:格式;执行语句至 条件不满足; For:格式:for(循环变量 初值;循环结束条件;循环变量 增值)。 (5)结构说明语句 Initial:格式;执行一次; 常用来变量初始化和生成激励 波形作为电路的测试仿真信号; Always:格式;执行至仿真 结束;注意时序;常用来描述时 钟信号作为激励信号;时间控制 可以为沿触发(描述时序行为) 也可以是电平触发(描述组合逻 辑行为); Task:定义;任务的调用与 变量的传递;任务调用变量与任 务定义的I/O变量必须一一对 应; Function:定义;函数返回 值(函数定义蕴含定义了同名寄 存器);函数调用通过函数表达 式中的操作数来实现的。 (6)时间控制语句 #、@、wait标识的语句 6 系统函数和任务 (1)$display和$write:输出 信息;格式说明和普通字符; (2)$monitor:监控和输出参 数列表中的表达式和变量值;关 闭与打开控制; (3)$time:返回64位整数表 示当前仿真时刻值;时间尺度; $realtime:返回时间为实 型数; (4)$finish:退出仿真器,返 回主操作系统;参数; (5)$stop:把EDA工具设置为 暂停,给出交互命令提示,把控 制权交给用户; (6)$readmemb 和$readmemh: 从文件读取数据到存储器;格 式;读取内容; (7)$random:返回32位带符 号整型随机数;用于产生随即脉 冲序列和宽度随机的脉冲序列 进行电路测试。 7 编译预处理 (1)`define:宏定义,符号常 量; (2)`include:文件包含;使 用形式; (3)`timescale:时间尺度, 说明跟在该命令后的模块的时 间单位和时间精度; (4)`ifdef、`else、`endif: 满足条件的语句进行编译;不编 译的部分也应符VerilongHDL语 言规范。

VerilogHDL试卷及答案

一、选择题: 1、下列标示符哪些是合法的(B ) A、$time B、_date C、8sum D、mux# 2、如果线网类型变量说明后未赋值,起缺省值是(D ) A、x B、1 C、0 D、z 3、现网中的值被解释为无符号数。在连续赋值语句中,assign addr[3:0]=-3;addr被赋予的值是(A )//补 码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! A、4’b1101 B、4’b0011 C、4’bxx11 D、4’bzz11 4、reg[7:0] mema[255:0]正确的赋值是(A ) A、mema[5]=3’ d0, B、8’ d0; C、1’ b1; D、mema[5][3:0]=4’ d1 5、在code模块中参数定义如下,请问top模块中d1模块delay1、delay2的值是( D ) module code(x,y); module top; paramee delay1=1,delay2=1; ……………. ………………………………code #(1,5) d1(x1,y1); endmodule endmodule A、(1,1) B、(5,5) C、(5,1) D、(1,5) 6、“a=4’ b11001,b=4’ bx110”选出正确的运算结果(B ) A、a&b=0 B、a&&b=1 C、b&a=x D、b&&a=x 7、时间尺度定义为timescale 10ns/100ps,选择正确答案(C ) A、时间精度10ns B、时间单位100ps C、时间精度100ps D、时间精度不确定 8、若a=9,执行$display(“current value=%0b,a=%0d”,a,a)正确显示为(B )//去除无效0 A、current value=1001,a=09 B、current vale=1001,a=9 C、1001,9 D、current vale=00…001001,a=9 9、always begin #5 clk=0;#10 clk=~clk;end产生的波形(A )//5占15的1/3 A、占空比1/3 B、clk=1 C、clk=0 D、周期为10 10、在Verilog中定义了宏名`define sum a+b+c 下面宏名引用正确的是(C ) //注意引用 A、out=’sum+d; B、out=sum+d; C、out=`sum+d; D、都正确 二、填空题:(共15分,每小题3分) 1、某一纯组合电路输入为in1,in2和in3,输入出为out,则该电路描述中always的事件表达式应写为 always@(in1,in2,in3 );若某一时序电路由时钟clk信号上升沿触发,同步高电平复位信号rst清零,该电路描述中always的事件表达是应该写为always @( posedge clk )。 //@(条件表达式) do_something; 表示等待条件表达式满足,然后do_something,然后就往下走了。通常用在testbench中,不可综合。 ------------------------------------ always @(a or b or c) begin do_something; end 表示不停地监测a、b、c,一旦它们任何一个发生变化,就立刻do_something,并且这个“监测”是始终存在的。这种电路综合出来时组合逻辑电路。

数字系统设计与verilogHDL课程设计

数字系统设计与v e r i l o g H D L课程设计设计题目:实用多功能数字钟 专业:电子信息科学与技术 班级:0313410 学号: 姓名:杨存智 指导老师:黄双林 摘要 本课程设计利用QuartusII软件VerilogVHDL语言的基本运用设计一个多功能数字钟,经分析采用模块化设计方法,分别是顶层模块、alarm、alarm_time、counter_time、clk50mto1、led、switch、bitel、adder、sound_ddd、sound_ddd_du模块,再进行试验设计和软件仿真调试,分别实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能。 单个模块调试达到预期目标,再将整体模块进行试验设计和软件仿真调试,已完全达到分块模式设计功能,并达到设计目标要求。 关键字:多功能数字钟、Verilog、模块、调试、仿真、功能 目录

课程设计的目的 通过课程设计的锻炼,要求学生掌握Verilog HDL语言的一般设计方法,掌握Verilog HDL语言的基本运用,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,基于实践、源于实践,实践出真知,实践检验真理,培养学生的创新精神。 掌握现代数字逻辑电路的应用设计方法,进一步掌握电子仪器的正确使用方法,以及掌握利用计算机进行电子设计自动化(EDA)的基本方法。 课程设计的任务与要求 用Verilog HDL语言设计一个多功能的数字钟,具有下述功能: (1)计时功能。包括时、分、秒的计时; (2)定时与闹钟功能:能在设定的时间发出闹铃音; (3)校时功能。对时、分和秒能手动调整以校准时间; (4)整点报时功能;每逢整点,产生“嘀嘀嘀嘀一嘟”四短一长的报时音。 2.课程设计思路及其原理 数字计时器要实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能,所有功能都基于计时功能。因此首先需要获得具有精确振荡时间的脉振信号,以此作为计时电路的时序基础,实验中可以使用的振荡频率源为50MHZ,通过分频获得所需脉冲频率1Hz。得到1hz脉冲后,要产生计时模块,必须需要加法器来进行加法,因此需要一个全加器,此实验中设计一个八位全加器来满足要求。 数字电路设计中,皆采用二进制加法,为实现实验中时分秒的最大功能,本实验中采用十六进制加法器,再进行BCD码进行转换来实现正常时钟显示。为产生秒位,设计一个模60计数器,利用加法器对1HZ 的脉冲进行秒计数,产生秒位;为产生分位,通过秒位的进位产生分计数脉冲,分位也由模60计数器构成;为产生时位,用一个模24计数器对分位的进位脉冲进行计数。整个数字计时器的计数部分共包括六位:时十位、时个位、分十位、分个位、秒十位和秒个位。基本的计时模块完成之后,整点报时、清零、校时、LED显示、闹铃模块可以相互实现,其中,闹铃模块与计时模块的显示相互并行。 清零功能是通过控制计数器清零端的电平高低来实现的。只需使清零开关按下时各计数器的清零端均可靠接入有效电平(本实验中是低电平),而清零开关断开时各清零端均接入无效电平即可。 保持功能是通过逻辑门控制秒计数器输入端的1Hz脉冲实现的。正常情况下,开关不影响脉冲输入即秒正常计数,当按下开关后,使脉冲无法进入计数端,从而实现计时保持功能。

VerilogHDL复习题与答案

VerilogHDL硬件描述语言复习 一、 1. Verilog HDL 是在哪一年首次被I E E E标准化的? 答:Verilog HDL是在1995年首次被IEEE标准化的。 2. Verilog HDL支持哪三种基本描述方式? 答:Verilog HDL可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程化结 构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模 3. Verilog HDL 是由哪个公司最先开发的? 答:Verilog HDL是由Gateway Design Automation公司最先开发的 4. Verilog HDL中的两类主要数据类型什么? 答:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。 5. U D P代表什么? 答:UDP代表用户定义原语 6. 写出两个开关级基本门的名称。 答:pmos nmos 7.写出两个基本逻辑门的名称。 答:and or 8.在数据流描述方式中使用什么语句描述一个设计? 答:设计的数据流行为使用连续赋值语句进行描述 9. 采用结构描述方式描述1位全加器。 答: module full_add(a,b,cin,s,co); input a,b,cin; output s,co; wire S1,T1,T2,T3; xor X1(S1,a,b), X2(s,S1,cin); and A1(T3,a,b), A2(T2,b,cin), A3(T1,a,cin); or O1(co,T1,T2,T3); endmodule 10. i n i t i a l语句与always 语句的关键区别是什么? 答: 1) initial语句:此语句只执行一次。 2) always语句:此语句总是循环执行, 或者说此语句重复执行。 11.采用数据流方式描述2 - 4译码器。 答: 'timescale 1ns/ns module Decoder2×4(A,B,EN,Z); input A,B,EN; output [0:3]Z;

基于VerilogHDL的表决器的设计

基于V e r i l o g H D L的表 决器的设计 This model paper was revised by LINDA on December 15, 2012.

学生课程实验报告书 12 级电通系 通信工程专业 03 班 学号 312890 姓名 2014--2015学年第 2 学期 实验项目:基于Verilog HDL的表决器的设计 实验时间: 实验目的: 1、熟悉Verilog HDL的编程。 2、熟悉七人表决器的工作原理。 3、进一步了解实验系统的硬件结构。 实验原理: 所谓表决器就是对于一个行为,由多个人投票,如果同意的票数过半,就认为此行为可行;否则如果否决的票数过半,则认为此行为无效。 七人表决器顾名思义就是由七个人来投票,当同意的票数大于或者等于4时,则认为同意;反之,当否决的票数大于或者等于4时,则认为不同意。实验中用7个按键开关来表示七个人,当对应的按键开关输入为‘1’时,表示此人同意;否则若按键开关输入为‘0’,则表示此人反对。表决的结果用一个LED表示,若表决的结果为同意,则LED被点亮;否则,如果表决的结果为反对,则LED不会被点亮。同时,数码管上显示通过的票数。 实验内容: 本实验就是利用实验系统中的按键开关模块和LED模块以及数码管模块来实现一个简单的七人表决器的功能。按键开关模块中的键1~键7表示七个人,当按键开关输入为‘1’时,表示对应的人投同意票,否则当按键开关输入为‘0’时,表示对应的人投反对票;LED模块中D1表示七人表决的结果,当LED1点亮时,表示此行为通过表决;否则当LED1熄灭时,表示此行为未通过表决。同时通过的票数在数码管上显示出来。 实验步骤:原理图步骤与实验一相同 模式选择键”:按动该键能使实验板产生12种不同的实验电路结构。本次实验的模式选择到“5”(红色数码管上显示)。 用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。观察实验结果是否与自己的编程思想一致

VerilogHDL语法基础

Verilog HDL语法基础(1) Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/ *”开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21//32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3//一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3//一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110// 增强可读性 4’b10??//相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world”//是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。

VHDL和VerilogHDL的区别

VHDL与VerlogHDL的不同点序 号 VHDL Verilog 1 文件的扩展名不一样.VHD .v 2 结构不一样包含库、实体、结构体 Entity 实体名is Port(端口说明) End 实体名; Architecture 结构体名of 实体名is 说明部分 Begin 赋值语句; 元件语句; 进程语句等; End 结构体名; 模块结构(module………endmodule) module 模块名(端口列表); 输入/输出端口说明; 变量类型说明; assign 语句(连续赋值语句); 元件例化语句; always@(敏感列表) begin …… end endmodule 其中assign语句、元件例化语句、always 语句的顺序可以更换。 3 对库文件的要求不一 样 须有相应的库或程序包支 持,实体间调用子程序调 用,需要将子程序打成程 序包 没有专门的库文件(只有基本门的库), 模块可以通过例化直接调用,不需要打成 程序包。 4 端口定义的地方不一 样 在实体中定义 在module的模块名后面先列出端口列表, 再在模块中用input,output等定义。 5 端口定义方式不一样端口名[, 端口名] : 方向 数据类型名[Default V alue]; 如Q : inout std_logic_vector(31 downto 0); 端口类型端口1,端口2,端口 3,…; 如:inout [31:0] Q; 6 端口定义类型不一样有in,out,inout,buffer 四种 有input,output,inout三种 7 内部信号声明不一样在结构体中声明,有些局 部变量还可在进程中声明 在端口定义后进行声明内部变量 8 数据默认值默认值为本类型的最小非 负值(某个类型的范围是 以0为对称的) wire类型默认值为z,reg类型默认值为x; 9 标识符规则不一样不区分大小写 区分大小写 10 关键词要求不一样允许大小写混写 如EnTIty 关键词必须是小写 11 常量定义的关键词和 格式不一样 CONSTANT 常量名:数 据类型:=表达式; parameter 常量名1 = 表达式,常量名2 = 表达式,…,常量名n = 表达式;

veriloghdl学习心得

竭诚为您提供优质文档/双击可除veriloghdl学习心得 篇一:Verilog学习心得 Verilog学习心得因为Verilog是一种硬件描述语言,所以在写Verilog语言时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何去解释这个module.比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register,如果是,它的clock是什么?D端是什么?Q端是什么?有没有清零和置位?同步还是异步?再比如上面讨论的三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。同样,Verilog 中没有“编译”的概念,而只有综合的概念。 写硬件描述语言的目的是为了综合,所以说要想写的好就要对综合器有很深的了解,这样写出来的代码才有效率。 曾经接触过motorola苏州设计中心的一位资深工程师,他忠告了一句:就是用verilog描述电路的时候,一定要清楚它实现的电路,很多人只顾学习verilog语言,而不熟悉它实

现的电路,这是设计不出好的电路来的. 一般写verilogcode时,对整个硬件的结构应该是很清楚了,最好有详细的电路图画出,时序问题等都应该考虑清楚了。可以看着图直接写code。 要知道,最初Verilog是为了实现仿真而发明的.不可综合的Verilog语句也是很重要的.因为在实际设计电路时,除了要实现一个可综合的m odule外,你还要知道它的外围电路是怎样的,以及我的 这个电路与这些外围电路能否协调工作.这些外围电路就可 以用不可综合的语句来实现而不必管它是如何实现的.因为 它们可能已经实际存在了,我仅是用它来模拟的.所以,在写verilog的时候应该要先明确我是用它来仿真的还是综合的. 要是用来综合的话,就必须要严格地使用可综合的语句,而且不同的写法可能产生的电路会有很大差别,这时就要懂 一些verilog综合方法的知识.就像前面说的,脑子里要有一个硬件的概念.特别是当综合报错时,就要想一想我这种写 法能不能用硬件来实现,verilog毕竟还不是c,很多写法是 不可实现的.要是这个module仅是用来仿真的,就要灵活得 多了,这时你大可不必太在意硬件实现.只要满足它的语法, 实现你要的功能就行了. 有网友说关于#10clk=~clk的问题,虽然这种语句是不 可综合的,但是在做simulation和verification是常常用

veriloghdl的行为语句

Verilog HDL的行为语句 Verilog HDL有许多的行为语句,使其成为结构化和行为性的语言。Verilog HDL语句包括:赋值语句、过程语句、块语句、条件语句、循环语句、编译预处理等,如表5-14 所示。符号“√”表示该语句能够为综合工具所支持,是可综合的。 5.3.1 赋值语句 赋值语句包括持续赋值语句与过程赋值语句。 1. 持续赋值语句assign为持续赋值语句,主要用于对wire 型(连线型)变量赋值。例如:assign c=~(a&b); 在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b 信号的任何变化,都将随时反映到c上来。 2. 过程赋值语句过程赋值语句多用于对reg型变量进行赋值。过程赋值有阻塞赋值和非阻塞赋值两种方式。 a. 非阻塞赋值方式非阻塞赋值符号为“<=”,如:b<=a; 非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。 b. 阻塞赋值方式阻塞赋值符号为“=”,如:b=a; 阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该语句结束时立刻改变。如果在一个块语句中(例如always块语句),有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。

5.3.2 过程语句VerilogHDL中的多数过程模块都从属于以下2种过程语句:initial及always。在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。1. initial过程语句initial过程语句使用格式如下:initial begin 语句1; 语句2; | 语句n; end intial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次。initial语句通常用于仿真模块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所接受。 2. aIways过程语句always 过程语句使用格式如下:always @ (<敏感信号表达式>) begin //过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环 //task,function调用end always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中。只有当触发条件满足敏感信号表达式时,其后的“begin-end”块语句才能被执行。 3. 敏感信号表达式所谓敏感信号表达式又称事件表达式,即当该表达式中变量的值改变时,就会引发块内语句的执行,因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信

基于verilogHDL的数字时钟

***** 顶层模块信号定义: clk : 基准时钟信号输入; keysel : 校时状态/正常计时状态选择键输入; key_s : 校秒信号选择键输入; key_m : 校分信号选择键输入; key_h : 校时信号选择键输入; keyclr : 计时清零键; keyen : 计时开始键; buzzout : 声响输出; sled : 4位数码管段码输出; sl : 4位数码管位码输出; seg : 单个数码管输出; ********************************************************* ******/ module clock(clk,keysel,key_s,key_m,key_h,keyen,keyclr,sled,sl,seg,buzzout); output[7:0] sled; output[3:0] sl; output[7:0] seg; output buzzout; input clk; input keysel,key_s,key_m,key_h,keyen,keyclr; reg[24:0] count; wire[23:0] min; wire sec; wire sec_s,sec_m,sec_h,sec_narmal; divclk Q1(clk,sec_narmal,sec_s,sec_m,sec_h); modify Q2(clk,keysel,key_s,key_m,key_h,sec,sec_narmal,sec_s,sec_m,sec_h); counttime Q3(sec,keyclr,keyen,min); display Q4(clk,sec,min,sled,sl,seg); music Q5(clk,min,buzzout,sec_narmal); endmodule

VerilogHDL及其Testbench编写方法

Verilog HDL及其Testbench总结 (欢迎批评指正:jackhuan@https://www.sodocs.net/doc/61910195.html,) 1 Verilog HDL的基本观点 1) 观点1:module内每个基本模块之间是并行运行的。 2) 观点2:每个模块相当于一个连续赋值的过程。 3) 观点3:方程和任务是共享代码的最基本方式。 4) 观点4:同语言可用于生成模拟激励和指定测试的验证约束条件。 5) 观点5:库的概念相当于Visual C++中的DLL概念。 6) 观点6:文件与文件之间的关系可以使用C++中的*.h和*.cpp之关系理解。 2 设计建模的三种方式 1) 行为描述方式。过程化结构,每个结构之间是并行的。 2) 数据流方式。连续赋值语句方式,每个赋值语句之间是并行的,且赋值语 句和结构之间是并行的。 3) 结构化方式。门和模块实例化语句。 3 两者数据类型 1) 线网数据类型wire:表示构件间的物理连线; 2) 寄存器数据类型reg:表示抽象的数据存储元件。 4 几个概念 1) 模块(module)。模块是Verilog HDL的基本描述耽误,用于描述某个设计 的功能或结构及其与其它模块通信的外部端口。一个设计的结构可以使用开关级原语、门级原语和用户定义的原语方式描述;数据流行为使用使用连续赋值语句进行描述;时序行为使用过程结构描述。模块的声明部分和语句可以散布在模块中的任何地方,但变量、寄存器、线网和参数说明必须在使用前出现。 2) 只有寄存器类型数据(reg/integer)能够在initial和always语句中被赋值。 3) 阻塞性和非阻塞性赋值。理解这两个概念在学习verilog HDL中非常重要。 决定了时序的正确与否。阻塞性赋值的概念是在该条赋值语句执行完成后再执行后面的语句,也就是说在执行该语句时,后面的语句是挂起的。而非阻塞性赋值的结果在何时执行是不知道的,但是可以预见在某个时间步内该语句一定能够执行完成,从这个意义上来看,非阻塞性赋值的语句类似于并行语句,稍有处理不当,会引发多驱动源问题。关于多驱动源问题,在我的VHDL总结中有所表述,此处不在费墨。 4) 用户定义原语(UDP)。UDP的定义不依赖于模块定义,因此出现在模块定 义之外,也可以在单独的文本文件中定义UDP。UDP只能有一个输出或一个/多个输入端口。UDP的行为以真值表的形式描述。 5) 并行语句块和顺序语句块。并行语句块中的各语句并行执行。当并行语句 块中的最后动作执行完成是,顺序语句块的语句继续执行。也就是说,并行语句块中的所有语句必须在控制转出语句块之前完成执行。并行语句块

完整版华为fpga设计规范VerilogHdl

FPGA设计流程指南 、八、, 前言 本部门所承担的FPGA 设计任务主要是两方面的作用:系统的原型实现和ASIC 的原型验证。编写本流程的目的是: 在于规范整个设计流程,实现开发的合理性、一致性、高效性。形成风格良好和完整的文档。 实现在FPGA 不同厂家之间以及从FPGA 到ASIC 的顺利移植。便于新员工快速掌握本部门 FPGA 的设计流程。 由于目前所用到的FPGA 器件以Altera 的为主,所以下面的例子也以Altera 为例,工具组合为modelsim + LeonardoSpectrum/FPGACompilerII + Quartus ,但原则和方法对于其他厂家和工具也是基本适用的。

目录 1. 基于HDL 的FPGA 设计流程概述 (1) 1.1 设计流程图 (1) 1.2 关键步骤的实现 (2) 1.2.1 功能仿真 (2) 1.2.2 逻辑综合 (2) 1.2.3 前仿真 (3) 1.2.4 布局布线 (3) 1.2.5 后仿真(时序仿真) (4) 2. Verilog HDL 设计 (4) 2.1 编程风格( Coding Style )要求 (4) 2.1.1 文件 (4) 2.1.2 大小写 (5) 2.1.3 标识符 (5) 2.1.4 参数化设计 (5) 2.1.5 空行和空格 (5) 2.1.6 对齐和缩进 (5) 2.1.7 注释 (5) 2.1.8 参考C 语言的资料 (5) 2.1.9 可视化设计方法 (6) 2.2 可综合设计 (6) 2.3 设计目录 (6) 3. 逻辑仿真 (6) 3.1 测试程序( test bench) (7) 3.2 使用预编译库 (7) 4. 逻辑综合 (8) 4.1 逻辑综合的一些原则 (8) 4.1.1 关于LeonardoSpectrum (8) 4.1.1 大规模设计的综合 (8) 4.1.3 必须重视工具产生的警告信息 (8) 4.2 调用模块的黑盒子( Black box )方法 (8) 参考修订纪录10 10

相关主题