Verilog上机实验报告
五、 代码
1. 主程序
---------------------------------------文件名 compare_8bit.v--------------------------------------------
module compare_8bit(a,b,re); input [7:0] a,b; output re; reg re;
always @(a or b) //if the input changes, the output changes immediately. if (a>b) re=1; else re=0; endmodule
2. 测试模块
----------------------------------------文件名 compare_8bit_tb.v----------------------------------- `timescale 1ns/1ns module t;
reg [7:0] a,b; reg clk; wire re; initial begin a=0; b=0; clk=0; end
always #50 clk=~clk; always @(posedge clk) begin
a={$random}8; b=($random)8; end initial
begin #100000 $stop; end
compare_8bit m(.a(a),.b(b),.re(re)); endmodule
6
Verilog上机实验报告
六、 仿真波形
七、 总结及对波形的说明
1. 实验结论
从波形中可以看出当a>b时,re=1;当a
2. 实验思考(课本P316思考题一)
1) 在测试方法二中,第二个initial块用于设置仿真时长。
2) 它与第一个initial块是一个并行的关系,同一个测试文件中,可以有多个initial
块,且均从0时开始顺序运行,并且仅运行一次。
3) 如果在第二个initial块中,没有写#100000或者$stop,仿真将会按测试界面设
置的仿真时间进行仿真。(如下图)
4) 第二种测试方法更全面,因为第二种测试方法产生的a和b的值是随机的,可以测试多种情况,而第一种测试方法只能按照测试文件中给定的数据进行测试,不具有普遍性。
3. 实验总结
本次实验是Verilog上机的第一个实验,内容比较简单,并且课本上已经给出了范例,只需要稍加修改便可以写出程序的代码。
在本次试验中,由于实验软件的限制,我仅仅进行了RTL级的仿真,如果要进行综合后门级仿真和布局布线后仿真,可以通过其他软件来进行。
RTL级仿真、综合后门级仿真和布局布线后仿真的不同之处在于所在的层次不同。依次更加底层化。而compare.vm,compare.vo文件和compare.v文件的描述也是不同层次的描述。
7
Verilog上机实验报告
实验二 简单分频时序逻辑电路的设计
一、 实验目的
1. 掌握最基本时序电路的实现方法;
2. 学习时序电路测试模块的编写; 3. 学习综合和不同层次的仿真。
二、 实验内容
已然制作clk_in的2分频clk_out,要求输出时钟的相位与上面的2分频器的输出相位正好相反。编写测试模块,给出仿真波形。改变输入始终的频率,观察RTL级仿真、综合后门级仿真和布线后仿真的不同,并写出报告
三、 对任务的理解
本题的实验就是要实现一个分频器。
四、 实现思路
1. 首先这个比较器应当有3个对外的端口,分别是:输入时钟信号clk_in,输出时
钟信号clk_out,复位信号reset。
2. 由于输入信号中有时钟信号,并且输出是随着输入时钟的某个沿的出现而变化
的,因此是一个时序逻辑电路。
3. 题目中要求输出的2分频时钟信号与例题中的相位相反。最简单的想法就是将
复位信号有效时的输出信号反相。
五、 代码
1. 主程序
---------------------------------------文件名 half_clk.v--------------------------------------------
module half_clk(reset,clk_in,clk_out); input reset, clk_in; output clk_out; reg clk_out;
8
Verilog上机实验报告
always @(posedge clk_in) begin
if (!reset)
clk_out=1; //原例题中此处为clk_out=0; else
clk_out=~clk_out; end endmodule
2. 测试模块
----------------------------------------文件名 half_clk_tb.v----------------------------------- `timescale 1ns/100ps `define clk_cycle 50 module top; reg clk,reset; wire clk_out;
always #`clk_cycle clk=~clk; initial begin
clk=0; reset=1; #10 reset=0; #110 reset=1; #100000 $stop; end
half_clk m0(.reset(reset),.clk_in(clk),.clk_out(clk_out)); endmodule
六、 仿真波形
七、 总结及对波形的说明
1. 实验结论
从波形中可以看出当clk_out的周期为clk_in的两倍,并且在t=300ns时,为clk_out的下降沿,恰好和例题中的输出信号波形反相,满足题目的要求。
9
Verilog上机实验报告
2. 实验思考(课本P318思考题二)
1) 如果没有reset信号,可以通过在测试文件中的initial块中设置clk_in的初值为
1来使输出反相。
2) 只用clk时钟沿的出发可以通过一个计数器来产生其他分频的时钟,并且通过调
节计数器的值来产生不同占空比的分频时钟,其代码如下: i. 产生任意分频的时钟
----------------------------主程序div.v ----------------------------------------- module div(rst,clk,out,num); input rst, clk;
input [3:0] num; //通过num调节分频数 output out; reg out; reg [3:0] i;
always @(posedge clk) begin if(!rst) begin i<=0; out<=0; end else begin
if (i==((num[3:1])-1)) //num[3:1]代替num/2 begin i<=0;
out=~out; end else begin i<=i+1; out=out; end end end
endmodule
----------------------------测试文件div_tb.v ----------------------------------------- `timescale 1ns/100ps `define clk_cycle 50 module t; reg clk,rst; wire out;
reg [3:0] num;
always #`clk_cycle clk=~clk;
10