1、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 等于
2、 b 时,equal 输出为 1;a 不等于 b 时,/equal 输出为 0。endmodule测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。测试模块源代码:timescale 1ns/1ns /定义时间单位。include “./compare.v“ /包含模块文件。在有的仿真调试环境中并不需要此语句。/而需要从调试环境的菜单中键入有关模块文件的路径和名称module comparetest;reg a,b;/在测试文件中需要进行赋值的变量要定义成 ren 型,一般为 inputwire equ
3、al;/在测试文件中只要进行连接定义成 wire 型,一般为 outputinitial /initial 常用于仿真时信号的给出。begin /initial 语句就是给出在什么时间给定什么样的值a=0;b=0;#100 a=0; b=1;#100 a=1; b=1;#100 a=1; b=0;#100 $stop; /系统任务,暂停仿真以便观察仿真波形。endcompare/模块名/ compare1(.equal(equal),.a(a),.b(b); /调用模块。/括号内的为测试文件的信号,而.a 等为模块要连接的信号endmodule 仿真波形(部分):练习:设计一个字节(8 位)比
4、较器。要求:比较两个字节的大小,如 a7:0大于 b7:0输出高电平,否则输出低电平,改写测试模型,使其能进行比较全面的测试。练习二. 简单时序逻辑电路的设计目的:掌握基本时序逻辑电路的实现。在 Verilog HDL 中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。在可综合的 Verilog HDL 模型,我们通常使用 always 块和 (posedge clk)或 (negedge clk)的结构来表述时序逻辑。下面是一个 1/2 分频器的可综合模型。/ half_clk.v:module half_clk(reset,clk_in,clk_out);input clk_in,r
5、eset;output clk_out;reg clk_out;always (posedge clk_in)beginif(!reset) clk_out=0;else clk_out=clk_out;endendmodule在 always 块中,被赋值的信号都必须定义为 reg 型,这是由时序逻辑电路的特点所决定的。对于 reg 型数据,如果未对它进行赋值,仿真工具会认为它是不定态。为了能正确地观察到仿真结果,在可综合风格的模块中我们通常定义一个复位信号 reset,当 reset 为低电平时,对电路中的寄存器进行复位。测试模块的源代码:/- clk_Top.v -timescale 1
6、ns/100psdefine clk_cycle 50module clk_Top.vreg clk,reset;wire clk_out;always #clk_cycle clk = clk;initialbeginclk = 0;reset = 1;#100 reset = 0;#100 reset = 1;#10000 $stop;endhalf_clk half_clk(.reset(reset),.clk_in(clk),.clk_out(clk_out);endmodule仿真波形:练习:依然作 clk_in 的二分频 clk_out,要求输出与上例的输出正好反相。编写测试模块,给出仿真波形