Verilog设计练习十例及答案.doc

上传人:灯火****19 文档编号:136791911 上传时间:2020-07-02 格式:DOC 页数:26 大小:165KB
返回 下载 相关 举报
Verilog设计练习十例及答案.doc_第1页
第1页 / 共26页
Verilog设计练习十例及答案.doc_第2页
第2页 / 共26页
Verilog设计练习十例及答案.doc_第3页
第3页 / 共26页
Verilog设计练习十例及答案.doc_第4页
第4页 / 共26页
Verilog设计练习十例及答案.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《Verilog设计练习十例及答案.doc》由会员分享,可在线阅读,更多相关《Verilog设计练习十例及答案.doc(26页珍藏版)》请在金锄头文库上搜索。

1、设计练习进阶前言:在前面九章学习的基础上, 通过本章的练习,一定能逐步掌握Verilog HDL设计的要点。我们可以先理解样板模块中每一条语句的作用,然后对样板模块进行综合前和综合后仿真,再独立完成每一阶段规定的练习。当十个阶段的练习做完后,便可以开始设计一些简单的逻辑电路和系统。很快我们就能过渡到设计相当复杂的数字逻辑系统。当然,复杂的数字逻辑系统的设计和验证,不但需要系统结构的知识和经验的积累,还需要了解更多的语法现象和掌握高级的Verilog HDL系统任务,以及与C语言模块接口的方法(即PLI),这些已超出的本书的范围。有兴趣的同学可以阅读Verilog语法参考资料和有关文献,自己学习

2、,我们将在下一本书中介绍Verilog较高级的用法。练习一简单的组合逻辑设计 目的: 掌握基本组合逻辑电路的实现方法。 这是一个可综合的数据比较器,很容易看出它的功能是比较数据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输出

3、为1;a不等于b时, /equal输出为0。endmodule 测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。 测试模块源代码:timescale 1ns/1ns /定义时间单位。include ./compare.v /包含模块文件。在有的仿真调试环境中并不需要此语句。 /而需要从调试环境的菜单中键入有关模块文件的路径和名称module comparetest; reg a,b; wire equal; initial /initial常用于仿真时信号的给出。 begin a=0; b=0; #1

4、00 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 仿真波形(部分):练习:设计一个字节(8位)比较器。要求:比较两个字节的大小,如a7:0大于 b7:0输出高电平,否则输出低电平,改写测试模型,使其能进行比较全面的测试 。练习二. 简单时序逻辑电路的设计目的:掌握基本时序逻辑电路的实现。 在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。

5、在可综合的Verilog HDL模型,我们通常使用always块和 (posedge clk)或 (negedge clk)的结构来表述时序逻辑。下面是一个1/2分频器的可综合模型。 / half_clk.v:module half_clk(reset,clk_in,clk_out);input clk_in,reset;output clk_out;reg clk_out;always (posedge clk_in) begin if(!reset) clk_out=0; else clk_out=clk_out; endendmodule在always块中,被赋值的信号都必须定义为reg

6、型,这是由时序逻辑电路的特点所决定的。对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态。为了能正确地观察到仿真结果,在可综合风格的模块中我们通常定义一个复位信号reset,当reset为低电平时,对电路中的寄存器进行复位。测试模块的源代码:/- clk_Top.v -timescale 1ns/100psdefine clk_cycle 50module clk_Top.vreg clk,reset;wire clk_out;always #clk_cycle clk = clk;initial begin clk = 0; reset = 1; #100 reset = 0;

7、#100 reset = 1; #10000 $stop; endhalf_clk half_clk(.reset(reset),.clk_in(clk),.clk_out(clk_out);endmodule仿真波形:练习:依然作clk_in的二分频clk_out,要求输出与上例的输出正好反相。编写测试模块,给出仿真波形。练习三. 利用条件语句实现较复杂的时序逻辑电路目的:掌握条件语句在Verilog HDL中的使用。与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的Verilog HDL模型中常用的条件语句有ifels

8、e和caseendcase两种结构,用法和C程序语言中类似。两者相较,ifelse用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是caseendcase风格的代码。这一节我们给的是有关ifelse的范例,有关caseendcase结构的代码已后会经常用到。下面给出的范例也是一个可综合风格的分频器,是将10M的时钟分频为500K的时钟。基本原理与1/2分频器是一样的,但是需要定义一个计数器,以便准确获得1/20分频模块源代码:/ - fdivision.v -module fdivision(RESET,F10M,F500K);input F10M,RES

9、ET;output F500K;reg F500K;reg 7:0j; always (posedge F10M) if(!RESET) /低电平复位。 begin F500K = 0; j = 0; end else begin if(j=19) /对计数器进行判断,以确定F500K信号是否反转。 begin j = 0; F500K = F500K; end else j = j+1; endendmodule测试模块源代码:/- fdivision_Top.v -timescale 1ns/100psdefine clk_cycle 50module division_Top; reg

10、F10M_clk,RESET;wire F500K_clk;always #clk_cycle F10M_clk = F10M_clk; initial begin RESET=1;F10M=0;#100 RESET=0;#100 RESET=1;#10000 $stop; endfdivision fdivision (.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk);endmodule仿真波形:练习:利用10M的时钟,设计一个单周期形状如下的周期波形。T0 10s 20s 20s练习四. 设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别目的:1.明

11、确掌握阻塞赋值与非阻塞赋值的概念和区别; 2.了解阻塞赋值的使用情况。阻塞赋值与非阻塞赋值,在教材中我们已经了解了它们之间在语法上的区别以及综合后所得到的电路结构上的区别。在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。实际的时序逻辑设计中,一般的情况下非阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。(注意:在实现组合逻辑的assign结构中,无一例外地都必须采用阻塞赋值语句。下例通过分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块blocking.v和non_blocking.v

12、来阐明两者之间的区别。模块源代码:/ - blocking.v -module blocking(clk,a,b,c); output 3:0 b,c; input 3:0 a; input clk; reg 3:0 b,c; always (posedge clk) begin b = a; c = b; $display(Blocking: a = %d, b = %d, c = %d.,a,b,c); end endmodule/- non_blocking.v -module non_blocking(clk,a,b,c); output 3:0 b,c; input 3:0 a; input clk; reg 3:0 b,c; always (posedge clk) begin b = a; c = b; $display(Non_Blocking: a = %d, b = %d, c = %d.,a,b,c); end endmodule测试模块源代码:/- compareTop.v -timescale 1ns/100p

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号