燕 山 大 学 电 子 实 验 中 心
EDA课程设计-Verilog HDL 程序 设计教师:郑兆兆 2012年12月24日
EDA设计输入方式燕 山 大 学 电 子 实 验 中 心
原理图设计输入
硬件描述语言设计输入(VHDL 、 Verilog HDL)
波形设计输入 底层设计输入 层次设计输入
燕 山 大 学 电 子 实 验 中 心
Verilog HDL是目前应用最为广泛的硬件描述语言之一, 与VHDL各有千秋。1993年,IEEE专门成立IEEE 1364工作 组制定Verilog HDL的标准,在1995年发布了第1个Verilog HDL的标准,即IEEE 1364-1995。随后,IEEE在2002年发布 了经过修订的Verilog HDL新标准,命名为IEEE 1364-2001。 Verilog HDL允许在不同的抽象级别上对数字电路系统进 行描述,这些抽象级别包括 系统级( System Level)、算法 级( Algorithm Level )、寄存器传输级( Register Transfer Level)、门级(Gate Level)和开关级(Switch Level)。 系统级、算法级、寄存器传输级描述都被称为行为描述。
燕 山 大 学 电 子 实 验 中 心
Verilog HDL语言特点:(1) Verilog HDL语法规则与C语言十分相像。 (2) Verilog HDL语法检查不严格。 (3) Verilog HDL自身带有仿真指令。
Verilog HDL基础燕 山 大 学 电 子 实 验 中 心
Verilog HDL设计模块结构一个完整的Verilog HDL设计模块包括端口定义、 I/O声明、变量类型声明和功能描述等4个部分。 module decide (f, a, b, c);//端口定义 input a, b, c ; /* I/O output f ; 声明*/ wire a, b, c ; /*变量 reg f ; 类型声明*/ always @(a or b or c) /*功 begin 能 ……. 描 end 述*/ endmodule
燕 山 大 学 电 子 实 验 中 心
(1)模块端口定义 模块端口定义用来声明电路设计模块的输入输出端口,端 口定义格式如下: module 模块名(端口1,端口2,端口3,…); 例:module decide (f, a, b, c); (2)模块的I/O声明 模块的I/O声明用来声明模块端口定义中各端口数据 流动方向,包括:input(输入),output(输出)和inout(双向)。 I/O声明格式如下: input 端口1,端口2,端口3,…;//声明输入端口 output 端口1,端口2,端口3,…;//声明输出端口 例: input a, b, c ; output f ;
燕 山 大 学 电 子 实 验 中 心
(3)变量类型声明 变量类型声明用来表明设计电路的端口 和内部电路使用的变量的数据类型。变量的 数据类型主要有wire(连线),reg(寄存器), integer(整型),real(实型)和time(时间)
输入/输出端口类型默认时,自动定义 为wire型。
燕 山 大 学 电 子 实 验 中 心
(4)功能描述 功能描述是Verilog HDL程序设计中最主 要的部分,用来描述设计模块的内部结构和模 块端口间的逻辑关系,在电路上相当于器件的 内部电路结构。功能描述可以用assign语句、 元件例化(InstAntiate)、always块语句、initial块 语句等方法
来实现,通常把确定这些设计模块 描述的方法称为建模。
Verilog HDL的词法
燕 山 大 学 电 子 实 验 中 心
(一)空白符和注释 (二)常数 <位宽>’<进制符号><数字> (三)字符串 (四)标识符 区分大小写(字母、数字、下划线) (五)关键词 (六)操作符 (1)算术操作符 求余符号% (2)逻辑操作符 (3)位运算 (4)关系操作符 等 (七)Verilog HDL数据对象
燕 山 大 学 电 子 实 验 中 心
Verilog HDL的语句
(一)赋值语句 (1)门基元赋值语句基本逻辑门关键词 例化门标识符(门输出,门输入1,门输 入2,…, 门输入n); 例如: 具有a,b,c,d输入和y输出与非门的门基元赋值语句 为: nand u1(y,a,b,c,d);
燕 山 大 学 电 子 实 验 中 心
(2)连续赋值语句连续赋值语句的关键词是assign,赋值符号是“=”,连 续赋值语句“=”号两边的变量都应该是wire型变量。 连续赋值语句的格式为 assign 赋值变量=表达式; 例如,具有a,b,c,d输入和y输出与非门的连续赋值 语句为 assign y=~(a&b&c&d);
燕 山 大 学 电 子 实 验 中 心
(3)过程赋值语句过程赋值语句出现在initial和always块语句中,包括阻塞赋 值语句、非阻塞赋值语句。在过程赋值语句中,赋值变量 必须是寄存器型变量(reg、integer、real) 。 i)阻塞赋值语句 阻塞赋值符号是“=”,语句格式为 赋值变量=表达式; 例:y=~(a&b&c&d); 其值在该语句结束即可得到。 ii)非阻塞赋值语句 非阻塞赋值符号是“<=”,语句格式为: 赋值变量<=表达 式; 例: y<=~(a&b&c&d); 其值不像在阻塞赋值语句那样,语 句结束时即刻得到, 而在该块语句结束才可得到。
燕 山 大 学 电 子 实 验 中 心
always @(posedge clock) begin m=3; n=75; n<=m; r=n; //r=75; end
燕 山 大 学 电 子 实 验 中 心
阻塞赋值、非阻塞赋值用法8要点:(1)时序电路建模时,用非阻塞赋值<=。 (2)锁存器电路建模时,用非阻塞赋值<=。 (3)用always块建立组合逻辑模型时,用阻塞赋值=。 (4)在同一个always块中建立时序和组合逻辑电路时,用非 阻塞赋值。 (5)在同一个always块不要既用非阻塞赋值又用阻塞赋值。 (6)不要在一个以上always块中为同一个变量赋值。 (7)用$strobe系统任务来显示用非阻塞赋值的变量值。 (8)在赋值时不要使用#0延迟。
(二)条件语句
燕 山 大 学 电 子 实 验 中 心
条件语句包含if语句和case语句,它们都是顺序语句, 应放在always或initial块中。 (1)if语句 if语句有3种格式 i)if(表达式) begin 语句;end ii) if(表达式) begin 语句;end else begin 语句;end iii) if(表达式) begin 语句;end else if(表达式) ……..
燕 山 大 学 电 子 实 验 中 心
(2) case语句case(表达式) 选择值1:语句1; 选
择值2:语句2; … 选择值n:语句n; default: 语句n+1; endcase/
case语句变体casex、casez
燕 山 大 学 电 子 实 验 中 心
(三)循环语句 循环语句包含for语句,repeat语句,while语句 和forever语句4种。 建议使用for语句。
燕 山 大 学 电 子 实 验 中 心
(四)结构声明语句 结构声明语句包括always,initial,task和function等4种结 构。 (1)always块语法结构 always@(敏感信号表达式)//列出影响块内取值的所有信 号,各信号之间用“or”连接。对于组合电路而言,所 有输入信号都是敏感信号;对于时序电路而言,一般 取时钟信号和复位信号为敏感信号。 begin //过程赋值语句; //if语句,case语句; //tast语句、function语句; end
燕 山 大 学 电 子 实 验 中 心
敏感信号使用注意事项:(1)敏感信号列表中的任何信号发生变化时,都将启动always块 语句,使always块内语句按顺序执行一次。
(2)敏感信号可以为电平敏感信号,也可以是边沿敏感信号。
(3)关键词“posedge”表示上升沿,关键词“negedge”表示下降沿。 (4)在一个敏感信号列表中,不要既有电平信号又有边沿信号。
燕 山 大 学 电 子 实 验 中 心
(五)语句的顺序执行与并行执行 Verilog HDL中由顺序执行语句和并行执行 语句之分。 Verilog HDL的always块中的语句 是顺序语句,按照程序书写的顺序执行。但 always块本身却是并行语句, always块语句中 敏感信号表中列出的任何信号的改变,都将启 动always块语句,使always块语句内相应的顺 序语句被执行一次。 always块、initial块、和assign都是并行的。
燕 山 大 学 电 子 实 验 中 心
Verilog HDL模块设计 (一)门电路设计 (1)assign语句建模 用assign描述一个2输入端与非门的语句格 式为 assign y1=~(a1&&b1); y1为wire型变量