搜档网
当前位置:搜档网 › FPGA与Verilog学习手记_非常重要

FPGA与Verilog学习手记_非常重要

FPGA与Verilog学习手记_非常重要
FPGA与Verilog学习手记_非常重要

FPGA学习心得(一)

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语句不能同时使用;

FPGA学习心得(二)

Verilog的两个误区:

使用Reg类型还是Net类型:

Reg类型只在过程块中被赋值;而Net类型则在过程块外面被赋值或者驱动. 阻塞赋值和非阻塞赋值:

Verilog中竞争发生的条件:两个或多个语句在执行顺序不同时导致不同的结果,则存在竞争.

Nonblocking不是一个类型;

Blocking赋值是一个单步过程,计算RHS,并更形LHS是不可中断的.

七条准则:

1.时序逻辑和锁存器,使用非阻塞赋值

2.always块中的组合逻辑,使用阻塞赋值

3.同一always块,时序组合混合逻辑使用非阻塞赋值

4.通常情况下,在同一always块中不要混合使用阻塞与非阻塞赋值

5.不要在多个always块中对同一变量进行赋值

6.使用$strobe显示非阻塞赋值得信号

7.不要用#0的过程赋值

Verilog中的分层事件队列:

活动事件:阻塞赋值;计算非阻塞赋值的RHS;连续赋值;$display命令;计算输入并改变原语的输出.这些事件可能按照任意次序调度.

非活动事件:#0的阻塞赋值

非阻塞事件:更新非阻塞赋值的LHS

监视事件:$monitor命令;$strobe命令

经验:

在always块中使用非阻塞赋值来产生时序逻辑和锁存器

在always块中使用阻塞赋值来产生组合逻辑

在always块中使用非阻塞赋值来产生同一块中的时序和组合逻辑

在纯组合逻辑中使用非阻塞赋值可能会导致功能错误

阻塞赋值和非阻塞赋值混合使用的方式:

将组合逻辑赋值通过时序表达式表示

或者将组合逻辑赋值与时序逻辑分开,在独立的语句块中描述

不推荐在同一always块中混合使用阻塞和非阻塞赋值

几个关于非阻塞赋值的错误理解:

错误1:无法使用$display命令显示非阻塞赋值变量

正解:非阻塞赋值变量的更新在所有$display命令之后

错误2:#0让一个赋值在每个时间步的最后执行

正解:#0只会让赋值语句进入非活动事件队列

错误3:在同一always块中对同一变量进行多次非阻塞赋值是不允许的

正解:在IEEE 1364 verilog标准中定义了上述赋值,最后一个非阻塞赋值起作用

模拟开始时候的困难:

不同的模拟器,不同的模拟选项导致开始模拟时现象不同

建议: 在0时刻通过非阻塞赋值设置reset信号;

第一个半周期设置clock为0

编写Verilog代码的一些经验:

Verilog文件名和模块名相同

不要在可综合代码中使用casex语句

当在可综合代码中使用casez语句时要小心

当写case语句时,对存在不关心的cases时使用casez,使用?代替Z来表示不关心的cases

Verilog编写状态机相关:

状态机分类:Moore(输出只与当前状态相关)和Mealy(输出与当前状态和输入相关)

二进制编码和One-Hot编码

状态机的基本块:下一状态度组合逻辑;时钟同步的当前状态逻辑;输出组合逻辑

两个always块写状态机,使用三个always块,如果输出需要寄存

使用高效的One-Hot状态编码,组合输出

经验:

每个状态机作为一个独立的Verilog模块

对状态进行预定义,状态赋值使用状态名作参数,不要使用`define,多使用parameter

两个always语句块的状态机,一个always用来描述状态向量寄存器的时序逻辑.一个用来描述下一状态度组合逻辑.组合输出可以通过连续赋值语句或者在下一状态度组合always块中描述.

verilog语法规则

1.Verilog分以下四个层次:

l 低阶交换模型:电路由开关与储存点所组成

l 逻辑间层次描述:用and ,or, buf , not 等

l 资料处理模型或暂存器转移层次:用于说明资料如何在暂存器中储存与传送。使用assign(电路所需功能的指定描述)来描述。

l 行为模型:只需要考虑模组的功能,使用always ,for ,while ,case等

2.关键字keywords必须使用小写来表示。

3.不能用于电路合成的verilog 语法:

叙述:Delay, Initial, Repeat, Forever, Wait, Fork, Join, Event, time, Deassign, Force, Release, Primitive, Cese indentity, not identity operations, Rtuan, tranif0, tranif1, rtranif0, rtranif1

运算子:= = =,!= =,/,%

逻辑间型态:tranif1,tranif0,rtran,trtanif1,rtranif0等逻辑间型态

Triand,trior,tri0,tri1,tritrg等接线型

Nmos, pmos, coms ,rnmos ,rpmos ,rcmos等元件

Pullup,pulldown等讯号改变元件

其他不能用于电路合成的构建方式

1) 不能在模组内有另一个阶层式的名称:module

2) ifdef,endif,else等条件编译命令

verilog的时间控制:主要用途是设定某一个程序在特定的时间被执行。

事件:当一条接线wire,wor,wand或暂存器register的值被改变时就是一个事件当模组的输入埠介绍到新的值时也是一个事件

可用于合成的verilog电路描述的事件基础时间控制,有两种:

1) 正规事件控制@当信号产生正缘posedge ,负negedge,转换或者值被改变时,叙述才会被执行。Always @ (posedge clock)

2) 当有多个讯号或者事件触发一个叙述或一个内含多个叙述的区块Always@(reset or gate or d)

Verilog的资料型态:wire,wand,wor,reg

Wire的特性:

1) 接线时连接硬体元件之连接线

2) 接线必须要被驱动才能改变它的内涵值

3) 接线描述的关键字为wire

4) 除非有被宣告成一个向量,否则接线是内定为一个位元的值,而且内定值是Z

Wand的特性:

1) 我们不能将多条讯号输出线同样连接到使用wire的某一条接线

2) 可以将多条讯号输出线同样连接到某一条wand,wor

Reg 的特性:

1) 可以直接给定一个数值,主要功能在于保持住电路中的某个值,不必像wire才能改变它的内涵值

2) 除非有被宣告成一个向量,否则接线是内定为一个位元的值,而且内定值是X

选用wire或reg的时机

1) wire必须配合assign来使用,且不能出现在always里

2) reg的使用方法为a=b格式,也就是必须放在always的区块描述里

3) wire,reg皆可定义为向量

4) 在verilog中内定的为WIRE,因此若在端与端的宣告中只有告input,output,inout,则为wire,如果需要将讯号的值储存起来就要宣告为reg

5) 在verilog中端的内部与外部的连接必须遵守下列规定:

Input能被net,或register推动,而一个输入端能够推动net型态的接线

output能被net,或register推动,而一个输入端能够推动net型态的接线

双向端能被net推动,而一个输入端能够推动net型态的接线

可用于电路合成的net,包括三种:wire,wor,wand

Verilog常用的叙述:

1. parameter,用于定义一个常数,对于可扩展的模组非常好用

parameter width=16;

input [width-1:0]a;

2. assign

驱动某个值到wire,wand,wor,tri;

用于资料处理模型(Data Flow model)的描述

用于描述组合逻辑电路

3. case: 叙述为一种多路选择

如果没有将“所有可能的”分支判别条件都指定,将会被锁住

4. function 的传回值是储存在和函数同样名称的这个变数中,并且至少要有一个或者以上的input

c=Sub_inc_Dec(b,a,sub,inc)

…function [3:0] Sub_inc_Dec;

Input [3:0]a,b;

Input Sub,inc;

…..endfunction

5. task (任务)可以拥有零个或更多个input,output,inout

6. task,function的区别:

function可以引其他的function,但不能引用其他的task

task可以引用其他的task和function

function至少要有一个或者以上的input

task (任务)可以拥有零个或更多个input,output,inout

7. 相同的地方

都可以拥有本身的区域变数与暂存器,但不能拥有wire型态的变数

只能用于行为模型的叙述中,前额本身不能有always 的叙述,通常是写在always区块中

撰写经济使用的HDL程式码原则

使用括弧来描述复杂的电路结构

Out=a+b+c+d+e+f; 需用5层out=((a+(b+c))+(d+e))+f;只需四层

将“组合指定”叙述和“循序指定”叙述的部分区分开

善于用常数

Parameter 可以减少电路面积可以定义宽度等

可以表示有状态机的内部状态parameter A=2’b00,B=2’b10

Define可表示有限状态机的内部状态和电路中会用到的常数值Define RED_Light_Time 9

Verilog语法需要注意的一些要点

Verilog语法需要注意的一些要点

1. Testbench中时钟和数据比特流的简单设计方法

always clock = ~clock;

always @(posedge clock)

begin

data_in_a = {$radom} % 2; // 产生-1到1之间随机的比特流

data_in_b = 16’b1101_1011_1110_0011; // 产生固定的比特流

$display(“a= %d ”, a); // 与C语言类似

end

2. Verilog语法中的并行与顺序模块

(1)连续赋值语句、always模块之间、实例模块之间都是并行语句

(2) always模块内部是分情况而定,对于if…else…而言,总是有优先级的顺序的,对于case而言,无优先级,是完全顺序执行的,此外,还要对阻塞语句和非阻塞语句具体分析。

3. Verilog中四种最常见的变量

(1) wire,即线网形变量,它不能存储值,必须受到驱动器或者连续赋值语句的驱动,如果没有驱动,那么它将会是高阻态

(2) reg是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用与改变触发器存储的值相当。寄存器变量的初时值为不确定态。在always 内部用到的变量必须是reg型的。

(3) prarmeter相当与VHDL中的constant

4.注意区分集中容易混淆的运算符

(1)位运算符,按位操作,~,|,&,^,其输出与输出一样位宽

(2)逻辑运算符,输出0或者1,&&,||,!

(3)缩减运算符,按位递归运算,&,|,!,其输出仅仅是1或者0

5.阻塞语句(blocking)与非阻塞赋值语句(non-blocking)

(1)非连续赋值语句(non-blocking)(b <= a)

在always块结束后才完成赋值操作,并且赋值后b不是立即就改变,在时序逻辑或者既有时序逻辑也有组合逻辑中一定要用这种赋值方式

(2)阻塞语句(blocking)(b = a)

赋值之后,b就立即改变,也就是在赋值语句完成以后,always才结束,在综合时,如果不注意,将产生意想不到的结果

一个非常典型的例子:

always @(clock)

begin

b = a;

c = b;

end

always @(clock)

begin

c = b;

b = a;

end

always @(clock)

begin

b <= a;

c <= b;

end

6.使用if或者是case进行综合时,一定要覆盖所有可能的情况,防止锁存器的综合

7.写testbench一些常见的保留字

$display(“print_word_value = %d”, print_word_value); // 与C语言类似

$display(“%h, %o”, 12’b1101_0100_0111); // 结果是 0xD47和o6507

$monitoron; // 监控开始

$mointor($time, “rxd = %b”, “txd = %b”, rxd, txd); // 打印当前时刻的监控值

$monitoroff;

$finish; // 仿真结束

$readmemb(“数据文件名”, 存储器名); // 把数据读入到当前指定的存储器内

rand_data = {random} % 60; // 产生-59到59之间的随机数

8.比较下面代码,分别综合出什么,可能出现什么问题

module dff_en(I_en, I_data, I_clock, O_data);

input I_clock;

input I_en;

input I_data;

output O_data;

reg R_data;

assign O_data = R_data;

always @(I_clock)

begin

if (I_en == 1) R_data <= I_data;

end

endmodule

有以下告警(用synplify综合)

(1) Incomplete sensitivity list - assuming completeness

(2) Referenced variable I_en is not in sensitivity list

(3) Referenced variable I_data is not in sensitivity list

(4) Latch generated from always block for signal

如果改always @(I_clock)为always @(posedge I_clock)就可以避免,并产生一个带使能的DFF

9.下面逻辑有没有问题?

module dff_en(I_reset1, I_reset2, I_data, I_clock, O_data);

input I_clock;

input I_reset1;

input I_reset2;

input I_data;

output O_data;

reg R_data;

assign O_data = R_data;

always @(negedge I_reset1 or posedge I_clock) // 敏感变量I_reset2在时钟

begin

if (I_reset1 == 0) R_data <= 0;

else if (I_reset2 == 0) R_data <= 1;

else R_data <= I_data;

end

endmodule

综合时不会有告警,产生一个带复位和置位的DFF,最好改always @(negedge I_reset1 or posedge I_clock)为always @(negedge I_reset1 or negedge I_reset2 or posedge I_clock)

10.逻辑综合结果是什么?

module mux2s1(I_sel, I_a, I_b, O_c, O_d)

input I_sel, I_a, I_b;

output O_c, O_d;

reg R_c;

reg R_d;

assign O_c = R_c;

assign O_d = R_d;

always @(I_sel, I_a, I_b)

begin

case (I_sel)

1'b0: R_c = I_a; // 综合出latch

1'b1: R_d = I_b; // latch

endcase

end

endmodule

该逻辑将产生锁存器。

11.下面代码综合结果是什么?

module dff_sys(I_clock, I_data, O_data); input I_clock, I_data;

output O_data;

reg R_b, R_c, R_d;

always @(posedge I_clock)

begin

R_c = R_b;

R_b = I_data;

R_d <= R_c;

end

endmodule

module dff_sys(I_clock, I_data, O_data);

input I_clock, I_data;

output O_data;

reg R_b, R_c, R_d;

always @(posedge I_clock)

begin

R_c = R_b;

R_d <= R_c;

R_b = I_data;

end

endmodule

两段逻辑都没有任何区别,综合电路如下,这也说明了non-block语句的特点下面逻辑呢?

module dff_sys(I_clock, I_data, O_data);

input I_clock, I_data;

output O_data;

reg R_b, R_c, R_d;

assign O_data = R_d;

always @(posedge I_clock)

begin

R_b = I_data;

FPGA学习笔记之引脚分配

2016/2/10 笔记一:分配引脚的四种方法:(Quartus II 13.0sp1 (64-bit)) 1、常规方法,利用Pin Planner命令,适用于引脚使用比较少的工程,简洁方便; 2、使用.csv文件进行引脚分配: 步骤一:利用记事本新建一个.csv的格式文件,内容格式如图下图所示,然后保存; 步骤二:选择菜单栏Assignments-->Import Assignment,添加刚才生成的文件路径;

步骤三:点击OK,引脚分配完成。 注意:.csv文件保存路径不要有中文,建议保存在工程文件夹下。 3、使用.qsf文件进行引脚分配: 步骤一:在Quartus II中打开.qsf文件(系统默认生成.qsf文件,默认保存在该工程文件夹下) 步骤二:添加以下格式内容,格式如下图所示; 步骤三:点击保存,引脚分配完成。 4、使用.tcl文件进行引脚分配: 步骤一:生成.tcl文件,选择菜单栏Project-->Generate Tcl File For Project,点击OK,默认保存路径为该工程文件夹; 步骤二:添加以下格式内容,格式和.qsf文件格式一致; 步骤三:选择菜单栏Tool-->Tcl Scripts,选择生成的.tcl文件,点击Run,引脚分配完成。

说明:在实际的应用过程中,我们应该根据工程的子模块个数和引脚的使用多少来选择合适的引脚分配方式,笔者总结了以下几条:(不喜勿喷,还望多多赐教) 1、工程中使用的引脚数为个位数时,并且特别少,建议使用常规方法,利用Pin Planner 命令进行引脚分配; 2、工程中只有一个子模块时,如果引脚众多,尤其使用到数码管显示时,建议使用.tcl 文件进行引脚分配; 如图所示,.tcl文件中标识符和变量名已经给出,只需要输入对应引脚,比较方便。在多子模块的情况下,.tcl文件中没有给出标识符和变量名,这点需要注意。 3、多个子模块,使用引脚众多的情况下,利用.tcl文件、.csv文件和.qsf文件进行引脚分配大同小异,不过个人更喜欢利用.csv文件进行引脚分配,因为格式相对简单。

数字系统设计与verilog HDL课程设计

数字系统设计与verilog HDL课程设计 设计题目:实用多功能数字钟 专业:电子信息科学与技术 班级:0313410 学号:031341025 姓名:杨存智 指导老师:黄双林

摘要 本课程设计利用QuartusII软件Verilog VHDL语言的基本运用设计一个多功能数字钟,经分析采用模块化设计方法,分别是顶层模块、alarm、alarm_time、counter_time、clk50mto1、led、switch、bitel、adder、sound_ddd、sound_ddd_du模块,再进行试验设计和软件仿真调试,分别实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能。 单个模块调试达到预期目标,再将整体模块进行试验设计和软件仿真调试,已完全达到分块模式设计功能,并达到设计目标要求。 关键字:多功能数字钟、Verilog、模块、调试、仿真、功能

目录 1.课程设计的目的及任务............................................................. 错误!未定义书签。 1.1 课程设计的目的 (3) 1.2 课程设计的任务与要求 (4) 2.课程设计思路及其原理 (4) 3.QuartusII软件的应用 (5) 3.1工程建立及存盘 (5) 3.2工程项目的编译 (5) 3.3时序仿真 (6) 4.分模块设计、调试、仿真与结果分析 (7) 4.1 clk50mto1时钟分频模块 (7) 4.2 adder加法器模块 (7) 4.3 hexcounter16 进制计数器模块 (7) 4.4 counter_time 计时模块 (8) 4.5 alarm闹铃模块 (8) 4.6 sound_ddd嘀嘀嘀闹铃声模块 (9) 4.7 sound_ddd_du嘀嘀嘀—嘟声音模块 (9) 4.8 alarm_time闹钟时间设定模块 (10) 4.9 bitsel将输出解码成时分秒选择模块 (10) 4.10 switch去抖模块 (11) 4.11 led译码显示模块 (11) 4.12 clock顶层模块 (12) 5.实验总结 (13) 5.1调试中遇到的问题及解决的方法 (13) 5.2实验中积累的经验 (14) 5.3心得体会 (14) 6.参考文献 (14) 1.1 课程设计的目的 通过课程设计的锻炼,要求学生掌握V erilog HDL语言的一般设计方法,掌握VerilogHDL语言的基本运用,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,基于实践、源于实践,实践出真知,实践检验真理,培养学生的

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位。

FPGA夏宇闻Verilog学习笔记1

V erilog 数字系统设计教程 学习笔记 1 FPGA 学习 由于工作上的需要,现在又开始学习新的芯片,估计以后会在FPGA 和DSP 这两个方向有发展,以前学的ARM 现在可以待业休息了等待新的起点。虽然大学的时候学习过《EDA 技术与VHDL 》这门课程,但是我至今才知道VHDL 语言是FPGA 的设计语言之一。有一个好的指导老师是非常重要的,进入公司后由于实行的是导师制,指导我的导师就让我看《V erilog 数字系统设计教程》,学习一样东西有一本好书是非常重要的,就如同学习C 语言看谭浩强老师的教程,同样学习FPGA 看夏宇闻老师的书一样,确实学到了很多东西,而且会一直研读。 不管学习单片机,ARM ,DSP 还是FPGA 上机练习是非常重要的,所以在学习夏宇闻老师的教程时我就把书中的上机练习题自己练习一遍,并做简要的记录。 设计平台:Quartus II 11.1sp2 Web Edition 仿真平台:ModelSin10.0c Starter Editon 上机练习一 简单的组合逻辑设计 由于是第一个练习,我会将具体的软件使用过程都列出来,方便同我一样的学习者学习。 1、建立一个新的工程 弹出对话框,直接 Next

设置工程目录F:/FPGA V erilog test/lesson1,工程名compare,顶层设计模块名compare 如果你已经有一些要加入工程的文件,可以再该步将文件加入到工程中,没有则直接Next 这一步是选择你需要的设计芯片,由于我们只学习V erilog语言,所以芯片选择随意

V erilog 数字系统设计教程 学习笔记 3 选择仿真语言和综合工具 最后显示我们选择的信息,确认填写是否正确

verilog课程设计—交通灯

课程论文 论文题目基于DE2的交通灯设计完成时间 课程名称Verilog语言设计 任课老师 专业 年级

1.交通信号控制器设计要求与思路 1.1设计背景 FPGA是一种用户根据各自需要而自行构造逻辑功能的数字集成电路,其种类很多,内部结构也不同,但共同的特点是体积小、使用方便。本文介绍了用VerilogHDL语言设计交通灯控制器的方法,并在QuartusII系统对FPGA芯片进行编译下载,由于生成的是集成化的数字电路,没有传统设计中的接线问题,所以故障率低、可靠性高,而且体积非常小。本文通过EDA设计,利用VerilogHDL语言模拟仿真交通灯控制电路。 1.2设计要求 根据交通灯控制器要实现的功能,考虑用两个并行执行的always语句来分别控制A方向和B方向的3盏灯。这两个always语句使用同一个时钟信号,以进行同步,也就是说,两个进程的敏感信号是同一个。每个always语句控制一个方向的3种灯按如下顺序点亮,并往复循环:绿灯----黄灯----红灯,每种灯亮的时间采用一个减法计数器进行计数,计数器用同步预置数法设计,这样只需改变预置数据,就能改变计数器的模,因此每个方向只要一个计数器进行预置数就可以。为便于显示灯亮的时间,计数器的输出均采用BCD码,显示由4个数码管来完成,A方向和B方向各用两个数码管。设定A方向红灯、黄灯、绿灯亮的时间分别为:35s、5s、35s,B方向的红灯、黄灯、绿灯亮的时间分别为:35s、5s、35s。假如要改变这些时间,只需要改变计数器的预置数即可。 1.3设计思路 两个方向各种灯亮的时间能够进行设置和修改,此外,假设B方向是主干道,车流量大,因此B方向通行的时间应该比A方向长。交通灯控制器的状态转换表见下表。表中,1表示灯亮,0表示灯不亮。A方向和B方向的红黄绿分别用R1、Y1、G1、R2、Y2、G2来表示。

FPGA学习心得

回想起自己学FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计开发板,调电路,练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多,拿出来和大家分享,顺便介绍下自己的一点经验所得,希望对初学者有所帮助。 废话不说了,下面进入正题,学习FPGA我主要经历了这么几个阶段: ①、Verilog语言的学习,熟悉Verilog语言的各种语法。 ②、FPGA的学习,熟悉QuartusII软件的各种功能,各种逻辑算法设计,接口模块(RS232,LCD,VGA,SPI,I2c等)的设计,时序分析,硬件优化等,自己开始设计简单的FPGA 板子。 ③、NiosII的学习,熟悉NiosII的开发流程,熟悉开发软件(SOPC,NiosII IDE),了解NiosII 的基本结构,设计NiosII开发板,编写NiosII C语言程序,调试板子各模块功能。先来说说第一个阶段,现在主要的硬件描述语言有VHDL,Verilog两种,在本科时老师一般教VHDL,不过现在 Verilog用的人越来越多,其更容易上手(与C语言语法比较类似),也更灵活,现在的IC设计基本都用Verilog。像systemC,systemVerilog之类的应该还在萌芽阶段,以后可能会有较大发展。鉴于以上原因我选择了Verilog作为我学习的硬件描述语言。 其实有C语言的基础,学起Verilog的语言很简单,关键要有并行的概念,所有的module,assign,always都是并行的,这一点与软件语言有明显不同。这里推荐几本评价比较好的学习Verilog的书籍: ①、《verilog 数字系统设计教程》,这本书对于入门是一本很好的书,通俗易懂,让人很快上手,它里面的例子也不错。但本书对于资源优化方面的编程没有多少涉及到。 ②、《设计与验证Verilog HDL》,这本书虽然比较薄,但是相当精辟,讲解的也很深入,很多概念看了这本书有种豁然开朗的感觉,呵呵。 学习Verilog其实不用看很多书,基本的语法部分大家都一样,关键是要自己会灵活应用,多做练习。 Verilog语言学了一段时间,感觉自己可以编点东西,希望自己编的程序在板子上运行看看结果,下面就介绍我学习的第二个阶段。 刚开始我拿了实验室一块CPLD的开发板做练习,熟悉QuartusII的各种功能,比如IP的调用,各种约束设置,时序分析,Logiclock设计方法等,不过做到后面发现CPLD 的资源不太够(没有内嵌的RAM、不能用SignalTapII,LE太少等),而实验室没有FPGA开发板,所以就萌生了自己做FPGA开发板的意图,刚好Cadence我也学的差不多了,就花了几天时间主要研究了FPGA配置电路的设计,在板子上做了Jtag和AS下载口,在做了几个用户按键和LED,其他的口全部引出作为IO口,电路比较简单,板子焊好后一调就通了(心里那个爽啊...)。我选的FPGA是cycloneII系列的EP2C5,资源比以前的FPGA多了好几倍,还有PLL,内嵌的RAM,可以试试SignalTapII,用内嵌的逻辑分析仪测试引脚波形,对于FPGA的调试,逻辑分析仪是至关重要的。利用这块板子我完成了项目中的几个主要功能:RS232通信,指令译码,配置DDS,AD数据高速缓存,电子开关状态设置等,在实践中学习起来真的比平时快很多,用到什么学什么动力更大。这个时候我主要看的数据有这几本感觉比较好: ①、《Altera FPGA/CPLD 设计(基础篇)》:讲解一些基本的FPGA设计技术,以及QuartusII中各个工具的用法(IP,RTL,SignalProbe,SignalTapII,Timing Closure Floorplan,chip Editor等),对于入门非常好。 ②、《Altera FPGA/CPLD 设计(高级篇)》:讲解了一些高级工具的应用,LogicLock,时序约束很分析,设计优化,也讲述了一些硬件编程的思想,作为提高用。

Verilog HDL数字时钟课程设计

课程设计报告 课程设计名称:EDA课程设计课程名称:数字时钟 二级学院:信息工程学院 专业:通信工程 班级:12通信1班 学号:1200304126 姓名:@#$% 成绩: 指导老师:方振汉 年月日

目录 第一部分 EDA技术的仿真 (3) 1奇偶校验器 (3) 1.1奇偶校验器的基本要求 (3) 1.2奇偶校验器的原理 (3) 1.3奇偶校验器的源代码及其仿真波形 (3) 28选1数据选择器 (4) 2.18选1数据选择器的基本要求 (4) 2.28选1数据选择器的原理 (4) 2.38选1数据选择器的源代码及其仿真波形 (5) 34位数值比较器 (6) 3.14位数值比较器的基本要求 (6) 3.24位数值比较器的原理 (6) 3.34位数值比较器的源代码及其仿真波形 (7) 第二部分 EDA技术的综合设计与仿真(数字时钟) (8) 1概述 (8) 2数字时钟的基本要求 (9) 3数字时钟的设计思路 (9) 3.1数字时钟的理论原理 (9) 3.2数字时钟的原理框图 (10) 4模块各功能的设计 (10) 4.1分频模块 (10) 4.2计数模块(分秒/小时) (11) 4.3数码管及显示模块 (13) 5系统仿真设计及波形图........................... 错误!未定义书签。5 5.1芯片引脚图.................................... 错误!未定义书签。5 5.2数字时钟仿真及验证结果 (16) 5.3数字时钟完整主程序 (17) 6课程设计小结 (23) 7心得与体会 (23) 参考文献 (24)

FPGA CPLD设计学习笔记(特权同学完整版)

1、FPGA\CPLD设计学习笔记(特权同学完整版) 题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD 来的,首先对整理者表示感谢。这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一个有志于FPGA/CPLD方面发展的工程师学习的。 1、硬件设计基本原则 (1)、速度与面积平衡和互换原则:一个设计如果时序余量较大,所能跑的频率远高于设计要求,能可以通过模块复用来减少整个设计消耗的芯片面积,这就是用速度优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么可以通过数据流串并转换,并行复制多个操作模块,对整个设计采用“乒乓操作”和“串并转换”的思想进行处理,在芯片输出模块处再对数据进行“并串转换”。从而实现了用面积复制换取速度的提高。 (2)、硬件原则:理解HDL本质 (3)、系统原则:整体把握 (4)、同步设计原则:设计时序稳定的基本原则 2、Verilog作为一种HDL语言,对系统行为的建模方式是分层次的。比较重要的层次有系统级(system)、算法级(Algorithm)、寄存器传输级(RTL)、逻辑级(Logic)、门级(Gate)、电路开关级(Switch)。 3、实际工作中,除了描述仿真测试激励(Testbench)时使用for循环语句外,极少在RTL级编码中使用for循环,这是因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,不能有效的复用硬件逻辑资源,造成巨大的浪费。一般常用case语句代替。 4、if…else…和case在嵌套描述时是有很大区别的,if…else…是有优先级的,一般来说,第一个if的优先级最高,最后一个else的优先级最低。而case语句是平行语句,它是没有优先级的,而建立优先级结构需要耗费大量的逻辑资源,所以能用case的地方就不要用if…else…语句。 补充:1.也可以用if…; if…; if…;描述不带优先级的“平行”语句。(但是这样容易引入锁存器) 5、FPGA一般触发器资源比较丰富,而CPLD组合逻辑资源更丰富。 6、FPGA和CPLD的组成: FPGA基本有可编程I/O单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等6部分组成。 CPLD的结构相对比较简单,主要由可编程I/O单元、基本逻辑单元、布线池和其他辅助功能模块组成。 7、Block RAM: 3种块RAM结构,M512 RAM(512bit)、M4K RAM(4Kbit)、M-RAM(64Kbit). M512 RAM:适合做一些小的Buffer、FIFO、DPRAM、SPRAM、ROM等; M4K RAM: 适用于一般的需求 M-RAM: 适合做大块数据的缓冲区。 Xlinx 和Lattice FPGA的LUT可以灵活配置成小的RAM、ROM、FIFO等存储结构,这种技术被称为分布式RAM。补充:但是在一般的设计中,不提倡用FPGA/CPLD的片内资源配置成大量的存储器,这是处于成本的考虑。所以尽量采用外接存储器。

Verilog课程设计

一.实验目的 (1)学习RISC_CPU的基本结构和原理; (2)了解Verilog HDL仿真和综合工具的潜力; (3)展示Verilog设计方法对软/硬件联合设计和验证的意义; (4)学习并掌握一些常用的Verilog语法和验证方法。 二.实验原理 CPU即中央处理单元的英文缩写,它是计算机的核心部件。计算机进行信息处理可分为两个步骤: (1)将数据和程序(即指令序列)输入计算机的存储器中。 (2)从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。CPU的作用是协调并控制计算机的各个部件并执行程序的指令序列,使其有条不紊地进行。因此它必须具有以下基本功能。 ①取指令——当程序忆在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。 ②分析指令——即指令译码,这是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。 ③执行指令——根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器、存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。 将CPU的功能进一步细化,可概括如下: (1)能对指令进行译码并执行规定的动作; (2)可以进行算术和逻辑运算; (3)能与存储器和外设交换数据; (4)提供整个系统所需要的控制。 尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基本功能相同。由功能分析,可知任何一种CPU内部结构至少应包含下面这些部件:(1)算术逻辑运算部件(ALU); (2)累加器; (3)程序计数器;

(4)指令寄存器和译码器; (5)时序和控制部件。 三.实验内容 通过我们自己动手,设计出一个CPU的软核和固核。这个CPU是一个简化的专门为教学目的而设计的RISC_CPU。在设计中我们不但关心CPU总体设计的合理性,而且还使得构成这个RISC_CPU的每一个模块不仅是可仿真的也都可以综合成门级网表。因而从物理意义上说,这也是一个能真正通过具体电路结构而实现的CPU。为了能在这个虚拟的CPU上运行较为复杂的程序并进行仿真,把寻址空间规定为8K(即13们地址线)字节。 四.实验代码 1.源代码 //----------------------------------clk_gen.v------------------------------ `timescale 1ns/1ns //时间单位1ns,时间单位1ns module clk_gen(clk,reset,fetch,alu_ena); //模块名clk_gen,参数列表(clk,reset,fetch,alu_ena)input clk,reset; //输入clk,reset output fetch,alu_ena; //输出fetch,alu_ena wire clk,reset; //wire型变量clk,reset reg fetch,alu_ena; //reg寄存器型变量fetch,alu_ena reg[7:0]state; //reg寄存器型变量8位的state parameter S1=8'b00000001,S2=8'b00000010,S3=8'b00000100,S4=8'b00001000,S5=8'b00010000,S6=8'b001 00000,S7=8'b01000000,S8=8'b10000000,idle=8'b00000000; //参数型定义8位二进制常量s1,s2,s3,s4,s5,s6,s7,s8,idle always@(posedge clk) //always块时钟触发 if(reset) //如果reset为真 begin //执行begin,and顺序块 fetch<=0; //fetch非阻塞赋值赋为0 alu_ena<=0; //alu_ena非阻塞赋值赋为0 state<=idle; //idle非阻塞赋值给state end else //reset为假执行下面begin语句 begin case(state) //case表达式(state) S1:begin alu_ena<=1; //alu_ena非阻塞赋值赋为1 state<=S2; //state非阻塞赋值赋为S2 end S2:begin alu_ena<=0; //alu_ena非阻塞赋值赋为0 state<=S3; //state非阻塞赋值赋为S3 end

基于Verilog的课程设计

基于Verilog的课程设计 直流电机的PWM控制 指导老师:翁嘉民 班级:1031电气自动化技术成员:李高峰9112 王俊才9186 孟令朋9143

目录 1.绪论 (3) 直流电机介绍 (3) 1.1.1直流电机的特点 (3) 1.1.2直流电机的应用 (3) 介绍 (4) 介绍 (4) V ERILOG HDL硬件描述语言 (5) 1.4.1V ERILOG HDL硬件描述语言介绍 (5) 1.4.2V ERILOG HDL功能 (5) PWM脉冲宽度调制介绍 (6) 直流电机的PWM控制 (7) 2.设计原理 (8) 设计原理框图 (8) 原理图 (9) 模块设计 (9) 2.3.1 MOTO_TEST模块 (9) 2.3.4计数器模块 (12) 7实训心得 (13) 参考文献 (13)

直流电机的PWM控制器的设计 1.绪论 直流电机介绍 直流电机是实现直流电能与机械能之间相互转换的一种电力机械,按照直流电机的用途分为直流电动机和直流发电机两类。能够将机械能转换成直流电能的电机称为直流发电机;能够将直流电能转换成机械能的电机称为直流电动机。 1.1.1直流电机的特点 从直流电机与交流电机相比中可以看出,直流电机具有优良的调速性能和启动性能。直流电机具有宽广的调速范围,平滑的无级调速特性,可实现频繁的无级快速启动、制动和反转;过载能力大,能承受频繁的冲击负载;能满足自动化生产系统中各种特殊运行的要求。而直流发电机则能提供无脉动的大功率直流电源,且输出电压可以精确地调节和控制。 1.1.2直流电机的应用 直流电机是交通、工矿、建筑等行业中的常见动力机械,是机电行业人员的重要工作对象和工具。在某些要求调速范围广、速度快、精密度高、控制性能优异的场合,直流电机的应用目前仍占有较大的比重,如大型可逆式轧钢机、内燃机车、矿井卷扬机、造纸和印刷机械、宾馆高速电梯、城市电车、电动自行车、龙门刨床、电力机车、地铁列车、船舶机械、大型精密机床和大型起重机等生产机械中。

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强

Verilog HDL课程设计

人民武装学院Verilog HDL课程设计洗衣机控制器的设计 学生姓名: 周云 学号: PB102027115 专业: 电子信息科学与技术 年级: 2010 级 指导老师: 周骅老师 时间: 2011年12月22日

目录 引言...................................................................................................................... - 3 - 一、设计内容...................................................................................................... - 4 - 1.设计内容.................................................................................................... - 4 - 2.功能............................................................................................................ - 4 - 二、洗衣机控制器的工作原理.......................................................................... - 6 - 1. 洗衣机的工作状态.................................................................................. - 6 - 2. 全自动洗衣过程...................................................................................... - 7 - 3.单独执行某个洗衣程序............................................................................ - 8 - 三、洗衣机的状态转换图.................................................................................. - 9 - 1.洗衣机的状态转换图................................................................................ - 9 - 2. 设计思路.................................................................................................. - 9 - 四、设计程序.................................................................................................... - 11 - 1.全自动洗衣机主程序.............................................................................. - 11 - 2.全自动洗衣机测试程序.......................................................................... - 15 - 五、步骤及仿真图............................................................................................ - 17 - 1.在代码提示框架中完成核心子模块wash_ctrl.v的设计 ................... - 17 - 2.对核心子模块wash_ctrl.v 进行时序仿真 ........................................... - 17 - 六、功能图........................................................................................................ - 20 - 1.设计顶层图形文件,编译.................................................................... - 20 - 2.功能引脚锁定.......................................................................................... - 20 - 心得体会............................................................................................................ - 22 -

capture学习笔记

Capture Allegro学习笔记 Allegro中常见的文件格式 .brd 工具:PCB Design Expert PCB布线 .ddb 工具:Protel .art 工具:CAM350 Allegro PCB Design file/impot ARTwork .d 工具:pads2005 .drl 工具:Protel .opj 设计项目工程 .olb 创建新的元件库 allegro/APD.jrl :记录开启Allegro/APD 期间每一个执行动作的command . 产生在每一次新开启Allegro/APD 的现行工作目录下 .env :存在pcbenv 下,无扩展名,环境设定档. allegro/APD.ini :存在pcbenv 下,记录menu 的设定. allegro/APD.geo :存在pcbenv 下,记录窗口的位置. master.tag :开启Allegro/APD 期间产生的文字文件,记录最后一次存盘的database文件名称,下次开启Allegro/APD 会将档案load 进来. 从Allegro/APD.ini搜寻directory = 即可知道Master.tag 存在的位置 . lallegro.col :存在pcbenv 下,从设定颜色的调色盘Read Local 所写出的档案.只会影响到调色盘的24 色而不会影响class/subclass 的设定. .brd :board file (Allegro). .mcm :multi-chip module (APD) ,design file. .log :记录数据处理过程及结果. .art :artwork 檔. .txt :文字文件,如参数数据,device 文件 .. 等. .tap :NC drill 的文字文件. .dat :资料文件. .scr :script 或macro 记录文件. .pad :padstack 檔. .dra :drawing 档, create symbol 前先建drawing ,之后再compiled 成

我的Verilog学习笔记..

Verilog学习笔记 1.我的第一个verilog程序:三态门 module three_status_device(in,out,oe); input in,oe; output out; assign out = (oe)? in : 1'bz; endmodule 其中oe为输出有效端,当oe置高则输入能顺利通过,否则输出高阻态。 查看Technology Schematic后可知three_status_device模块使用的FPGA内部资源: 分别是输入缓冲器IBUF,非门INV和三态缓冲器OBUFT。 我们还可以通过View Synthesis Report来观察到底使用了多少资源: 我们可以看出所选的芯片类型为V5系列的fx100,SPEED等级为-2,使用了1个查找表,1个Flip Flop触发器和3个IO口。 由于模块比较简单,我们直接进入后仿真阶段; 最后,我们可以通过中的View HDL Instantiation

Template看到生成的HDL模板供我们调用实例: three_status_device instance_name ( .in(in), .out(out), .oe(oe) ); 小结:通过设计三态门,熟悉了verilog开发的主要流程和ise中的常用工具。 反思: 对于高阻态,一般FPGA内部是不支持判断的。现在有些比较新的FPGA内部已经带有BUFT三态门让用户直接调用(在IOB中),而对于市面上常用的FPGA则无法做到,因为内部并没有BUFT三态门,所以就需要用到slice资源中的MUX复用器,用MUX除了多占用LC/LE的资源以外,受控信号(如数据总线等)会随着驱动源的增加而使延时加大。也有说法是使用RAM或ROM的总线结构提供高阻态的输出。 在FPGA开发时,一般将不用的IO口设置为三态状态,如果IO口较多的时候既占用连线资源也占用slice资源,对系统产生延迟。

verilog课程设计—交通灯1

课程设计 课程名称__EDA技术综合设计与实践__ 题目名称交通灯控制系统 学生学院信息工程学院 专业班级通信工程08(4) 学号 3108002925 学生姓名高高 指导教师李学易 2011 年12 月26 日

基于FPGA 的交通灯控制器的设计 摘要:Verilog 是广泛应用的硬件描述语言,可以用在硬件设计流程的建模、综合和模拟等多个阶段。随着硬件设计规模的不断扩大,应用硬件描述语言进行描述的CPLD 结构,成为设计专用集成电路和其他集成电路的主流。现代城市在日常运行控制中,越来越多的使用红绿灯对交通进行指挥和管理。而一套完整的交通灯控制系统通常要实现自动控制和手动控制去实现其红绿灯的转换。 基于FPGA 设计的交通灯控制系统电路简单、可靠性好。本设计利用Verilog HDL 语言、采用层次化混合输入方式,可控制4个路口的红、黄、绿、左转四盏信号灯,让其按特定的规律进行变化。在QUARTUSⅡ下对系统进行了综合与仿真。仿真结果表明系统可实现十字路口红绿灯及左转弯控制和倒计时显示,并能够自动控制交通灯转变。通过应用Verilog HDL 对交通灯控制器的设计,达到对Verilog HDL 的理解 关键词:FPGA;交通灯自动控制;V erilog HDL;Quartus Ⅱ 1.交通信号控制器设计要求与思路 1.1设计要求 在交通灯系统中(图1),路口1、2、3、4均需要红、黄、绿、左转四盏灯(用RYGL分别表示) ,并且每个路口都需要一个倒数的计时器,假设绿灯每次维持的时间是40 s ,黄灯为5 s ,左转灯10s,红灯60s,黄灯亮时以一定的频率闪动。交通灯系统大多是自动控制来指挥交通的,但有时需要由交警手动控制红绿灯,所以要求设 计的该交通信号系统需要具有该功能。 实现设计目标如下: (1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿交通信号灯,通过电路对十字路口的两组交通灯的状态实现自动循环控制; (2)实现东西车道和南北车道上的车辆交替运行,绿灯每次维持的时间是40 s ,黄灯为5 s ,左转灯10s,红灯60s; (3)要求黄灯亮5 秒后,红灯才能转为绿灯,黄灯亮时以一定的频率闪动; (4)东西车道和南北车道每次通行的时间不同且可调; 图1 交通灯系统示意图

16位乘法器学习笔记(Verilog语言源程序+仿真程序)

LCD1602显示源程序如下: module lcd1602(input clk, //60M input rst_n, output lcd_p, //Backlight Source + lcd屏幕背光 output lcd_n, //Backlight Source - output reg lcd_rs, //0:write order; 1:write data output lcd_rw, //0:write data; 1:read data output reg lcd_en, //negedge 在lcd_en下降沿需保证数据有效 output reg [7:0] lcd_data); mux16 mul(.rst_n(rst_n),.clk(clk),.start(start),.ain(data0),.bin(data1),.yout(data2),.done(done));//端口名称关联 //--------------------lcd1602 order---------------------------- parameter Mode_Set = 8'h31, //功能设置, Cursor_Set = 8'h0c, //光标设置 Address_Set = 8'h06, //输入模式设置 Clear_Set = 8'h01; //清屏设置 /****************************LCD1602 Display Data****************************/ wire [7:0] data_r0,data_r1,data_r2; //乘数、被乘数 wire [15:0]data0,data1; //结果显示 wire [31:0]data2; wire [7:0] addr; //write address wire start,done; assign data_r0 = 8'h30 + data0[7:0] ; // 8'h30在LCD1602上显示值为0。 assign data_r1 = 8'h30 + data1[7:0] ; assign data_r2 = 8'h30 + data2[7:0]; //-------------------address------------------ assign addr = 8'h80; /****************************LCD1602 Driver****************************/ //-----------------------lcd1602 clk_en--------------------- reg [31:0] cnt; reg lcd_clk_en; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin cnt <= 1'b0; lcd_clk_en <= 1'b0;

相关主题