EDA技术 廖义奎.

Slides:



Advertisements
Similar presentations
元大京華證券 組員名單 : A 楊之奇 A 廖本揚 A 宋俊承 A 陳冠廷 A 郭峻瑋 A 指導教授 : 許素華 副教授.
Advertisements

達悟族報告 作者 : 林琪崴, 許原碩 座號 :13 號,14 號 原碩負責 : 簡介, 傳說, 圖驣, 達悟族飛魚季, 琪崴 : 地理位置, 土地利用方式, 飲食文化, 豐收祭.
第十八章 林肯大郡 第十八章 林肯大郡災變緊急搶救應變措施 1997 年 8 月 18 日溫妮颱風襲台,汐止鎮 的林肯大郡山崩,遭崩場土石撞擊 1997 年 8 月 18 日溫妮颱風襲台,汐止鎮 的林肯大郡山崩,遭崩場土石撞擊造成二十八人罹難八十戶住宅倒塌的慘劇 此災變要喚起國人的重視 本章介紹搜救行動緊急應變措施。
有人说,世界的方向不仅在未来, 还在过去,需要转身才能发现。 — 王春元 中央电大工科机电类专业设置与课程建设的反思 国家开放大学工科机电类课程平台建设的构想 国家装备制造业发展现状与人才培养需求.
美丽的鹿城 —— 包头 包头简介 包头旅游景区 包头美食. 包 头, 中国内蒙古自治区第一大城市,又称鹿城、草原钢城。 随着包头钢铁(集团)有限责任公司和包头稀土研究院的建成与 发展,这里又被称作稀土之都。 包头稀土研究院 包 头位于内蒙古自治区中部,东与呼和浩特市相邻,西与巴彦 淖尔盟市连接 ,北与蒙古国接壤.
現代殺手心血管疾病 書田診所家醫科主任 何一成 陽明大學醫學士 陽明大學傳統醫學碩士
第八章 互换的运用.
第6章 应收应付款管理.
日期: 六 福 村.
青岛, 一座有故事的城市…… 刘瑞昌 青岛理工大学汽车与交通学院 2013年12月.
我征服了黃山 林達的黃山之旅 2006春.
營利事業所得稅查核準則 相關概念介紹 南區國稅局 新營分局 林俊標 各位學員大家好:
大綱 一、設立科別 二、課程規劃原則 三、科目與學分數表 四、新課綱課程架構 五、新課綱課程規劃 (1)一般科目 (2)專業科目
一百零一年溪口國小 學校日 班級: 三年三班 教師: 張慈麟.
Introduction to Verilog
用“自言自语法”提高学生 英语口头表达能力 李奉栖.
关注热点 2014年天猫双十一成交总额 571亿 点亮217个国家地区
EDA技术 第9章 FPGA硬件设计.
小组成员 杨云、王雯、曾明发 刘凤、祝会、陈丹凤.
电气与信息工程学院 学科建设情况汇报
第一章信託法 第一節 信託契約 第二節 信託財產 第三節 受益人 第四節 受託人 第五節 信託關係之消滅.
日 一 甲 班親會 歡迎您 導師:林春輝.
第三章 企业资信评估 第一节 企业资信评估概述 一、企业资信评估的含义
學 號:997I0010、997I0024 組 員:洪韋鈴、王婷婷 日 期: 指導老師:王立杰 老師
爱的表达方式.
高等职业学校建筑设计类与艺术设计类专业骨干教师实践能力国家级培训
?????? ?????? ?????? 他是我生的 我愛怎樣就怎樣 這樣對嗎? 影片欣賞.
《 E D A 技 术》 课 程 教 学 讲授:伍宗富 湖南文理学院电气与信息工程学院 2017年3月19日星期日.
软件企业涉税实务 嘉定区税务局.
第4章 VHDL设计初步.
没有请柬该如何办 记者如何选取有利位置 着装 准备工作 提问时的注意事项
Chapter 5 Sequential Logic Circuit
第六章 社会主义初级阶段理论 第一节 社会主义初级阶段是我国最大的实际 第二节 社会主初级阶段的基本路线和基本纲领
我的社區_觀塘 第三課.
數位邏輯設計與實習 ch04 組合邏輯電路設計.
大肚宮廟巡禮 下一頁.
大嶼山 香港國際機場 及 寶蓮寺.
3.1能源资源的开发 ——以我国山西省为例.
公司法(六) 股份有限公司 1.
空間向量 朱泰吉 蔡宇翔 張力夫 莊孟霏.
第三章 组合逻辑电路 第一节 组合电路的分析和设计 第二节 组合逻辑电路中的竞争与冒险 第三节 超高速集成电路硬件描述语言VHDL
水煮FPGA 传统FPGA设计流程简介.
第10章 Verilog操作符 学习内容: 熟悉Verilog语言的操作符.
數位系統實驗 --課程介紹 教師:潘欣泰.
触发器和时序电路分析 刘鹏 浙江大学信息与电子工程学院 March 30, 2017 ZDMC.
Chapter 5 Verilog 硬體描述語言
Chapter 5 Verilog硬體描述語言
Ch01-2 Verilog語法 資料流(DataFlow)設計 行為(Behavior)設計
第17章 Verilog中的高级结构 学习内容: 任务和函数的定义和调用 怎样使用命名块 怎样禁止命名块和任务 有限状态机(FSM)及建模.
EDA技术实用教程 第1章 概 述.
第四阶段实验 ISP器件的设计与应用 一、实验目的 二、实验内容与要求 三、ISP器件的开发流程 四、EDA Pro2K实验系统介绍
欢迎参加VHDL培训 VHDL培训教程 浙江大学电子信息技术研究所 电子设计自动化(EDA)培训中心
Danny Mok Altera HK FAE AHDL培训教材 Danny Mok Altera HK FAE 2018/12/9 P.1.
Verilog硬件描述语言基础.
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
语法进阶.
时序电路设计 刘鹏 浙江大学信息与电子工程系 Apr. 24, 2011 EE141
数字集成电路设计入门 --从HDL到版图 于敦山 北大微电子学系.
精简指令集(RISC)CPU的构造原理和设计方法
触发器和时序电路分析 刘鹏 浙江大学信息与电子工程学院 March 29, 2016 ZDMC.
第14章 对验证的支持 学习内容 理解Verilog文本输出 理解不同的读取仿真时间的系统函数 理解 Verilog文件I/O功能.
计算机学院 数字逻辑实验的要求.
计算机EDA设计 教 程 北航计算机学院 艾明晶.
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
设计示例一 用门级结构描述D触发器:.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
FPGA组合逻辑 王安然.
Verilog HDL 基本语法 STEP 2016/12/3.
按键处理部分 王安然.
第七章 基本逻辑电路设计.
Presentation transcript:

EDA技术 廖义奎

第10章 FPGA Verilog HDL编程基础

本次课内容 10.7 always过程 10.8 赋值 10.9 行为描述

10.7 always过程 Verilog HDL中并没有进程的概念,但却有与进程相同功能的三种过程,分别是 assign、always和模块实例,这三种在执行的方式上与进程一样,在过程之间是并行执行的。 模块实例已在前面介绍过,assign将在赋值一节中介绍。这一节将介绍always过程。

10.7.1 always过程 always过程相当于一个进程,即always块与always块之间是并行工作的,而块内就顺利执行的。

always过程的格式如下: always @ (敏感信号列表) begin 赋值语句 分支语句 循环语句 任务、函数调用 end

对于always过程,具有如下特点: (1)重复多次执行的语句,是编写触发器、同步设计中最常用的语句,也是仿真中产生时钟常用的语句。 (3)always块内的程序是顺利执行的。always块内的顺序执行与阻塞式赋值语句在功能上基本相同,但在用法上有点差别。

对于always过程,需要注意如下几点: (2)“begin-end”之间的语句称为块语句,其中的语句是按照串行方式顺序执行的。

(3)@ (敏感信号列表)是可选的,敏感信号列表列出了触发条件,只有当触发条件满足的时候,后面的“begin-end”语句块才会执行,当有多个触发条件的时候,触发条件之间用“or”或者逗号“,”分开,具体的格式如下: @(触发条件1,触发条件2,……,触发条件N)

10.7.2 触发方式 Verilog触发方式分为电平触发、边沿触发两种: (1)电平触发如图10.7所示。 (2)边沿触发如图10.8所示。

例如: 上升沿与下降沿都触发,从功能上看,与电平触发效果一样,所以也有人把这种方式叫做电平触发,但如果从严格意义上看,还是不太一样。 always @ (CLK) a<=b 以上语句指当CLK的值改变时就把b指定(Assign)给a,即@(CLK)将在CLK的上升沿或下降沿时,都触发。

边沿触发在Verilog中又分为两种: (1)上升沿触发如图10.9所示,用关键字posedge描述; 例如: always @ (posedge CLK) cntr<=cntr+1 以上语句指当CLK的上升沿时,将cntr的值加1。

(2)下降沿触发如图10.10所示,用negedge描述。 例如: always @ (negedge CLK) cntr<=cntr+1 以上语句指当CLK的下降沿时,将cntr的值加1。 在每一个always过程中只能有一种触发条件存在于敏感信号列表中,最好不要混合使用。在时序电路中always块通常是用时钟边沿触发。

10.7.3 事件及敏感信号列表 在Verilog HDL的always模块中,有四种事件,即上面介绍的四种触发方式产生的事件,分别是电平触发事件、上升沿触发事件(posedge)、下降沿触发事件(negedge)和用户自定义事件。 电平触发事件一般用于逻辑电路建模之中,只要信号的电平发生改变,都将触发电平事件,使用方法如下: always @ (a,b); 或者写成:always @ (a or b);

上升沿触发事件和下降沿触发事件一般用于同步电路(例如触发器、寄存器及锁存器等)建模,使用方法如下: always @ (posedge clk); //上升沿触发事件 always @ (negedge clk);//下降沿触发事件 也可以对多个事件起作用,例如: always @ (posedge clk,posedge a);

2001版本支持的always敏感信号列表方式 always @(a or b or c)中的or可用”,”代替,例如:     always @(a ,b, c) always 中所有的输入信号都是敏感信号,则可以用@*表示,例如:     always @* Verilog HDL允许使用者自行声明一个事件,事件的声明以event作为标识符。Quartus II中支持自定义事件的综合。

例如: event transfer; always@ (posedge clk) if (condition_a) always@ (transfer) dout <=data_from_fuifo  

10.8 赋值 Verilog HDL的赋值分为两类: 一是持续赋值, 二是过程赋值。

10.8.1 持续赋值 持续赋值是给wire类型的变量赋值。 可以用持续赋值语句描述组合逻辑,代替用门电路的描述方式。持续赋值在过程块外部使用。 持续赋值只能在等式左边有一个简单延时说明。 持续赋值一般多用于组合逻辑电路的设计。

语法: <assign> [#delay] [strength] <net_name> = <expressions> 例如: wire out; assign out =in_data_a|in_data_b; //也可以不经assign而用wire直接指定,这种方式较为简捷 wire out =in_data_a|in_data_b;

过程赋值是给寄存器类型的变量赋值。寄存器类型包括reg、integer、real、time等。 这些值在被赋值之后将保持不变,直到被其它的过程语句赋予新值为止,而assign语句的赋值对象只能是线网类型(wire),而且它的值连续不断地变化。

过程赋值多用于时序逻辑电路的设计。 过程赋值分为阻塞式赋值与非阻塞式赋值。非阻塞式语句主要用于时序器件,阻塞式语句主要用于组合逻辑。

10.8.2 阻塞式赋值 在顺序模块内,某条语句未执行完之前,不会执行下一条语句。阻塞式赋值语句符号是“=”。 下面通过两个例子来加深对阻塞式赋值的理解。

示例10.7: module verilog_1(input in1,in2,clk, output reg out); reg temp; always@(posedge clk) begin temp=in1|in2; out=temp; end endmodule

示例10.8: module verilog_1(input in1,in2,clk, output reg out); reg temp; always@(posedge clk) begin out=in1|in2; end endmodule 示例10.8综合结果和示例1的综合结果完全一样。

10.8.3 非阻塞式语句 在顺序模块内,某条语句的执行并不阻塞下一条语句的执行,即在这条语句执行时,下一条语句也同时执行。阻塞式赋值语句符号是“<=”。 下面是采用非阻塞式语句的示例,该示例代码形式与前面刚介绍的两个例子相似,但综合出来的结果却不相同。

示例10.9: module verilog_1(input in1,in2,clk, output reg out); reg temp; always@(posedge clk) begin temp<=in1|in2; out<=temp; end endmodule

module verilog_1(input in1,in2,clk, output reg out); reg temp; always@(posedge clk) begin temp=in1|in2; out=temp; end endmodule module verilog_2(input in1,in2,clk, temp<=in1|in2; out<=temp; end endmodule module verilog_3(input in1,in2,clk, out=temp; temp=in1|in2; end endmodule module verilog_4(input in1,in2,clk, out<=temp; temp<=in1|in2; end endmodule module verilog_5(input in1,in2,clk, always@( clk) begin module verilog_6(input in1,in2,clk, always@( in1, in2) begin

10.9 行为描述

10.9.1 if条件语句 条件语句由“if else”实现,它具有如下特点: (1)if语句只能在initial或always区块内使用; (2)可以嵌套使用; (3)在多个平行条件时,例如3-8译码器、七段译码器等程序中,用case比if好;

(4)一般情况下应写完if语句,即写成if else的形式,以避免综合出锁存器; (6)如果在连续的if语句中没有begin end,else句子将与离它最近的if句子匹配。

10.9.2 case多路选择语句 实现多径选择。另外还有两种增强的case语句casex、casez,支持1、0、x和z四种信号类型。 在casez语句中,出现在条件表达式和任意分支项表达式中的值z被认为是无关值,出现z的那个位在比较时被忽略。 在casex语句中,值x和z都被认为是无关位。实际使用中,字符“?”可用来代替字符“z”。 casez和casex都用endcase结束。

10.9.3 if语句与case语句的比较 时序上,如果是多重if语句,一般情况下一个if语句会综合出一个逻辑比较电路,层次多了,延迟时间就长。 电路大小上,对于较少选择项情况,用的if和case语句差别不是很大,有时是if语句电路大一些,有时是case大一些。但是,在选择项非常多时,用case综合出的电路要小一些。

10.9.4 循环语句 循环语句分为while、for、repeat、forever四种,必须在initial和always块中才能使用。   大多情况下,循环将由并行的硬件电路来实现,因此要注意循环的范围。

示例10.10: module verilog_1(input[7:0] a, output reg[7:0] y ); integer i; always @(a) begin for(i=0;i<7;i=i+1) y[i]=~a[i]&a[i+1]; end endmodule

下面是while语句应用例子(示例10.11) module verilog_1(input[7:0] a, output reg[7:0] y ); integer i; always @(a) begin i=0; while(i<7) y[i]=~a[i]&a[i+1]; i=i+1; end endmodule

下面是repeat语句应用例子(示例10.12 ) module verilog_1(input[7:0] a, output reg[7:0] y ); integer i; always @(a) begin i=0; repeat(8) y[i]=y[i]&a[i]; i=i+1; end endmodule

无限循环语句,一般在仿真中用。如果要在电路综合中实现一个无限循环的功能,该如何做? 那当然是用事件触发方式,不用无限循环。 无限循环可综合出无限多个电路模块,无限多的电路模块如何做出来?

下面是forever语句应用例子(示例10.13) module verilog_1(input[7:0] a, output reg[7:0] y ); initial begin forever y[1]=a[2]&a[4]; end Endmodule 上述程序在quartus中综合没有报错,但没有电路输出。

10.10 Verilog HDL任务及函数定义

10.10.1 函数 Verilog HDL中的函数与C语言等其它高级语言的功能与用法相似。函数要返回一个向量值,在函数定义时在函数名前说明范围。函数中需要多条语句时用begin和end。 函数只能返回一个值,函数一经调用就必须立即执行,其内部不能包含任何时序控制,函数可以调用函数,但不能调用任务,函数至少有一个输入。 语句:function fname; //其它语句 Endfunction

下面是函数的一些特点: (1)函数定义中不能包含任何时序控制语句。 (2)函数至少有一个输入,不能包含任何输出或双向端口。 (3)函数只返回一个数据,其缺省为reg类型。 (4)传送到函数的参数顺序和函数输入参数的说明顺序相同。

(5)函数在模块(module)内部定义。 (6)函数不能调用任务,但任务可以调用函数。 (7)函数在Verilog中定义了一个新的范围(scope)。 (8)虽然函数只返回单个值,但返回的值可以直接给信号连接赋值。这在需要有多个输出时非常有效。

10.10.2 任务 任务是一个与函数功能相似的子程序,一般在能用函数的地方,都可用任务代替。但是,任务的功能比函数强,用法更加灵活。 语句:  task tname; //其它语句 endtask

下面是任务的一些特点: (1)任务与函数只能用于模块内,可以在块内定义和调用; (2)任务可以定义input和output; (3)任务内可直接用if、for等语句,但不能用always语句; (4)任务一般需要在always块内调用; (5)任务可在调用前定义,也可在调用后定义; (6)每个任务调用的综合一般都由一个电路实现,所以多个任务调用就需要多个电路块。

下面是一个使用任务的例子,在任务中定义输入输出端口,在模块中调用该任务的方法与调用函数一样,在括号中列出要代入的参数。代码如下(示例10 下面是一个使用任务的例子,在任务中定义输入输出端口,在模块中调用该任务的方法与调用函数一样,在括号中列出要代入的参数。代码如下(示例10.14) module verilog_1(input din,clk,nrst,output dout); wire dff_0,dff_1,dff_2,dff_3; always @(posedge clk or negedge nrst) begin aaa(din,clk,nrst,dff_0); end

task aaa; input d1,clk1,nrs1t; output reg q1; begin if(~nrs1t) q1<=0; else q1<=d1; end endtask endmodule

下面的例子也是使用了任务,但该任务没有定义输入输出端口,而是直接使用了模块中的输入输出端口以及全部变量,完成了与上一个例子完全相同的功能,代码如下:示例10.15: module verilog_1(input din,clk,nrst,output reg dout); always @(posedge clk or negedge nrst) begin aaa; end task aaa; begin if(~nrst) dout<=0; else dout<=din; end endtask endmodule

10.10.3 函数与任务间的比较 (1)函数与任务间的共同点很多,但也存在一些差别,例如: (2)函数只能返回一个值,而任务可以有多个返回值; (3)函数一经调用就必须立即执行,其内部不能包含任何时序控制,而任务内部可以有时序控制; (4)函数可以调用函数,但不能调用任务,而任务即可调用函数,又可以调用任务; (5)函数至少有一个输入,而任务可以没有输入端。

小 结