文档库 最新最全的文档下载
当前位置:文档库 › Verilog HDL优点

Verilog HDL优点

Verilog HDL优点
Verilog HDL优点

Verilog HDL优点

1.能够在多个层次上对所设计的系统加以描述,从

开关级、门级、寄存器传输级(RTL)到行为级等;语言不对设计的规模施加任何限制。

2.可采用行为描述、数据流描述和结构化描述三种

不同方式或混合方式对设计建模。

3.具有两种数据类型;线网数据类型和寄

存器数据类型。

Verilog HDL描述风格

结构描述;描述设计单元的硬件结构。数据流描述

;类似寄存器传输级的方式描述数据的传输变换。

行为描述只、混合描述

SOPC优势1.合理的性能组合2.提升系统的性能3.降低系统的成本4.更好满足产品生命周期的要求。

步骤1.创建一个Quartus 2工程;

2.创建Nios系统模块;启动SOPC Builder;添加CPU及外围器件;指定基地址;系统设置;生成

系统模块。3.将图标添加到BDF文件中。 4.编辑Quartus 2的工程设计文件。5.配置FPGA;启动Nios 2 IDE;建立新的软件工程;编译工程;运行工程;调试工程;将程序下载到FLASH中。

EDA仿真步骤

1.分析系统设计要求和设计思想

2.了解各种输出信号及

2.要求

3.估计各种输出的期望值

4.进行实际仿真及结果

3.分析5.仿真改进与完善

Synplify Pro步骤1.新建工程或打开工程2.新建源工程并添加到工程3.选择工程实现设置4.选择所需研究的工程并进行逻辑综合5.查看有关逻辑综合结果ModelSim SE 6.0步骤1.新建或打开工程2.新建源程序并添加到工程3.编译源程序4.加载设计单元5.建立仿真波形6.运行仿真并观察结果。

10进制计数器

posedge上升negedge下降

module cnt10(clk,clr,ena,cq,co);

input clk,clr,ena;

output [3:0] cq;

output co;

reg [3:0] cnt;

reg co;

always @(posedge clk or posedge clr) begin

if (clr)

cnt<=4’b0;

else

if (ena)

if (cnt==4’h9)

cnt<=4’h0

else

cnt<=cnt+1;

end

assign cq=cnt;

//控制进位输出并去毛刺

always @(posedge clk)

begin

if (cnt==4’h9)

co=4’h1;

else

co=4’h0;

end

endmoduie 测试

module cnt10_tb();

reg clk,clr,ena;

wire [3:0]cq;

wire co;

cnt10 ut1(clk,clr,ena,cq,co); initial

$monitor($time,”clk=%b,clr=%b, cq=%b,co=%b”, clk,clr,ena,cq,co); initial

begin

clk=0;

clr=1;

ena=0;

#20 clr=0;经过20后变0

#30 ena=1;经过20+30后变1 end

initial

begin

forever#10 clk=~clk;

end

initial #2000 $finish; endmodule

4位阻塞

module reg4_bpa(qout,clk,reset,din); output [3:0] qout;

input clk,reset;

input din;

reg [3:0] qout;

always @(posedge clk or posedge reset)

if (reset)

qout=4’b0000;

else

begin

qout[0]=din;

qout[1]=qout[0];

qout[2]=qout[1];

qout[3]=qout[2];

end

endmodule 四选一信号module mu14_1a(y,s,x);

output y;

input [1:0]s;

input[3:0]x;

reg y;

always @(s or x)

begin

case (s)

2’b00: y=x[0];

2’b01: y=x[1];

2’b10: y=x[2];

2’b11: y=x[3];

default: y=1’b0;

endcase

end

8位加法器

module adder4b(a4,b4,c4,s4,co4); input [3:0] a4,b4;

input c4;

output [3:0] s4;

output co4;

assign {co4,s4}=a4+b4+c4; endmodule

moduie adder8b(a8,b8,c8,s8,co8); input [7:0] a8,b8;

input c8;

output [7:0] s8;

output co8;

wire sc;

adder4b u1(.a4(a8[3:0]),.b4(b8[3:0]), .c4(c8),.s4(s8[3:0]),.co4(sc));

adder4b u2(.a4(a8[7:4]),.b4(b8[7:4]),

.c4(sc),.s4(s8[7:4]),.co4(co8)); endmodule

32位锁存器

module reg32b(load,dim,dout);

input load;

input[31:0]din;

output[31:0];

wire load;

wire[31:0] din;

reg [3:0] dout;

always @(posedge load)

begin

dout=din;

end

endmodule

20分频器

module jydiv(clk_in,reset,clk_out);

input clk_in,reset;

output clk_out;

reg [4:0] cnt;

reg clk_out;

parameter divide_period+20;

always @(posedge clk_in or posedge reset) begin

if (reset)

begin

cnt<=0;

clk_out<=1’b0;

end

else If(cnt<(divide_period/2))

begin

clk_out<=1’b0;

cnt<=cnt+1;

end

else if (cnt,(divide_period_1))

begin

clk_out<=1’b0;

cnt<=cnt+1;

end

else

cnt<=1’b0;

end

endmodule 测频控制信号发生器module testctl(clk,tsten,clr_cnt,load);

input clk;

output tsten,clr_cnt,load;

reg div2clk,clr_cnt;

always @(posedge clk)

begin

div2clk<=~div2clk;

end

assign load=~div2clk;

assign tsten=div2clk;

always @(clk or div2clk)

begin

if(~div2clk)

if(~clk) clr_cnt<=1;

else clr_cnt<=0;

else

clr_cnt<=0;

end

endmodule

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复习题与答案

VerilogHDL硬件描述语言复习 一、 1.VerilogHDL是在哪一年首次被IEEE标准化的? 答:VerilogHDL是在1995年首次被IEEE标准化的。 2.VerilogHDL支持哪三种基本描述方式? 答:VerilogHDL可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程 化结 构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述 建模 3.VerilogHDL是由哪个公司最先开发的? 答:VerilogHDL是由GatewayDesignAutomation公司最先开发的 4.VerilogHDL中的两类主要数据类型什么? 答:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示 抽象的数据存储元件。 5.UDP代表什么? 答:UDP代表用户定义原语 6.写出两个开关级基本门的名称。答: pmosnmos 7.写出两个基本逻辑门的名称。答: andor 8.在数据流描述方式中使用什么语句描述一个设计? 答:设计的数据流行为使用连续赋值语句进行描述 9.采用结构描述方式描述1位全加器。 答: modulefull_add(a,b,cin,s,co); inputa,b,cin; outputs,co; wireS1,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.initial语句与always语句的关键区别是什么? 答:1)initial语句:此语句只执行一次。 2)always语句:此语句总是循环执行,或者说此语句重复执行。 11.采用数据流方式描述2-4译码器。 答: 'timescale1ns/ns moduleDecoder2×4(A,B,EN,Z); inputA,B,EN; output[0:3]Z; 1

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的表决器的设计

基于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 = 表达式;

Verilog HDL语言的描述语句

第4节Verilog HDL语言的描述语句Verilog HDL 描述语句 2.4.1 结构描述形式 通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。 在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: ?and ?nand ?nor ?or ?xor ?xnor ?buf ?not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型<实例名> (输出,输入1,输入2,……,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; // 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3);

endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。 2.4.2 数据流描述形式 数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a<<2; endmodule 在上述模块中,只要a的值发生变化,b就会被重新赋值,所赋值为a左移两位后的值。 2.4.3 行为描述形式 行为型描述主要包括过程结构、语句块、时序控制、流控制等4个方面,主要用于时序逻辑功能的实现。 1.过程结构 过程结构采用下面4种过程模块来实现,具有强的通用型和有效性。 ?initial模块 ?always模块 ?任务(task)模块 ?函数(function)模块

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是常常用

Verilog HDL常用的行为仿真描述语句(一)

Verilog HDL常用的行为仿真描述语句(一) 一、循环语句 1、forever语句 forever语句必须写在initial模块中,主要用于产生周期性波形。 2、利用for、while循环语句完成遍历 for、while语句常用于完成遍历测试。当设计代码包含了多个工作模式,那么就需要对各个模式都进行遍历测试。其典型的应用模板如下:[c-sharp:nogutter] view plaincopy? parameter mode_num = 5; initial begin // 各种不同模式的参数配置部分 for(i=0; i<mode_num-1; i=i+1) begin case (i) 0: begin . . end

1: begin . . end . . endcase end // 各种模式共同的测试参数 . . end 3、利用repeat语句来实现有次数控制的事件,其典型示例如下: [c-sharp] view plaincopy? initial begin

// 初始化 in_data = 0; wr = 0; // 利用repeat语句将下面的代码执行10次 repeat(10) begin wr = 1; in_data = in_data + 1; #10; wr = 0; #200; end end 4、用disable实现循环语句的异常处理,其典型示例如下:[c-sharp] view plaincopy? begin : one_branch for(i=0; i<n; i=i+1) begin : two_branch if (a==0) disable one_branch; if (a==b)

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.wendangku.net/doc/373052682.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

相关文档