2020年北航verilog上机实验报告
时间:2020-11-24 16:59:34 来源:勤学考试网 本文已影响 人
北
京
航
空
航
天
大
学
Verilog 上机 实验 报告
目录 实验一
简单的组合逻辑设计 ........................................................................................... 4
一、
实验目的...................................................................................................................... 4
二、
实验内容...................................................................................................................... 4
三、
对任务的理解 .............................................................................................................. 4
四、
实现思路...................................................................................................................... 4
五、
代码 ............................................................................................................................. 4
六、
仿真波形...................................................................................................................... 5
七、
总结及对波形的说明 ................................................................................................... 5
实验二
简单分频时序逻辑电路的设计 ............................................................................ 6
一、
实验目的...................................................................................................................... 6
二、
实验内容...................................................................................................................... 6
三、
对任务的理解 .............................................................................................................. 6
四、
实现思路...................................................................................................................... 6
五、
代码 ............................................................................................................................. 6
六、
仿真波形...................................................................................................................... 7
七、
总结及对波形的说明 ................................................................................................... 7
实验三
利用条件语句实现记数分频时序电路 ................................................................ 9
一、
实验目的...................................................................................................................... 9
二、
实验内容...................................................................................................................... 9
三、
对任务的理解 .............................................................................................................. 9
四、
实现思路...................................................................................................................... 9
五、
代码 ............................................................................................................................. 9
六、
仿真波形.................................................................................................................... 1
七、
总结及对波形的说明 ................................................................................................. 1
实验四
阻塞赋值与非阻塞赋值的区别 .......................................................................... 11
一、
实验目的.................................................................................................................... 11
二、
实验内容.................................................................................................................... 11
三、
对任务的理解 ............................................................................................................ 11
四、
实现思路.................................................................................................................... 11
五、
代码 ........................................................................................................................... 11
六、
仿真波形......................................................................................... 错误!未定义书签。
七、
总结及对波形的说明 ...................................................................... 错误!未定义书签。
实验五
用 用 ALWAYS 块实现比较复杂的组合逻辑电路 ......................... 错误!未定义书签。
一、
实验目的......................................................................................... 错误!未定义书签。
二、
实验内容......................................................................................... 错误!未定义书签。
三、
对任务的理解 ................................................................................. 错误!未定义书签。
四、
实现思路......................................................................................... 错误!未定义书签。
五、
代码 ................................................................................................ 错误!未定义书签。
六、
仿真波形......................................................................................... 错误!未定义书签。
七、
总结及对波形的说明 ...................................................................... 错误!未定义书签。
实验六
在 在 VERILOG HDL 中使用函数 .................................................. 错误!未定义书签。
一、
实验目的......................................................................................... 错误!未定义书签。
二、
实验内容......................................................................................... 错误!未定义书签。
三、
对任务的理解 ................................................................................. 错误!未定义书签。
四、
实现思路......................................................................................... 错误!未定义书签。
五、
代码 ................................................................................................ 错误!未定义书签。
六、
仿真波形......................................................................................... 错误!未定义书签。
七、
总结及对波形的说明 ...................................................................... 错误!未定义书签。
实验七
在 在 VERILOG HDL 中使用任务(TASK )
................................... 错误!未定义书签。
一、
实验目的......................................................................................... 错误!未定义书签。
二、
实验内容......................................................................................... 错误!未定义书签。
三、
对任务的理解 ................................................................................. 错误!未定义书签。
四、
实现思路......................................................................................... 错误!未定义书签。
五、
代码 ................................................................................................ 错误!未定义书签。
六、
仿真波形......................................................................................... 错误!未定义书签。
七、
总结及对波形的说明 ...................................................................... 错误!未定义书签。
实验八
利用有限状态机进行时序逻辑的设计 ................................... 错误!未定义书签。
一、
实验目的......................................................................................... 错误!未定义书签。
二、
实验内容......................................................................................... 错误!未定义书签。
三、
对任务的理解 ................................................................................. 错误!未定义书签。
四、
实现思路......................................................................................... 错误!未定义书签。
五、
代码 ................................................................................................ 错误!未定义书签。
六、
仿真波形......................................................................................... 错误!未定义书签。
七、
总结及对波形的说明 ...................................................................... 错误!未定义书签。
选做实验一
帧同步器设计 ..................................................................... 错误!未定义书签。
一.实验内容 ............................................................................................ 错误!未定义书签。
二.实现思路 ............................................................................................ 错误!未定义书签。
三.代码 .................................................................................................... 错误!未定义书签。
四.仿真结果 ............................................................................................ 错误!未定义书签。
选做实验四
数字去噪 器设计 .................................................................. 错误!未定义书签。
一.实验内容 ............................................................................................ 错误!未定义书签。
二.实现思路 ............................................................................................ 错误!未定义书签。
三.代码 .................................................................................................... 错误!未定义书签。
四.仿真结果 ............................................................................................ 错误!未定义书签。
实验一
简单的组合逻辑 设计
一、
实验目的
掌握基本组合逻辑电路的实现方法; 初步了解两种基本组合逻辑电路的生成方法; 学习测试模块的编写; 通过综合和布局布线了解不同层次仿真的物理意义。
二、
实验内容
设计一个字节(8 位)的比较器。
要求比较两个字节的大小,如 a[7:]大于 b[7:],则输出高电平,否则输出低电平;并改写测试模型,使其能进行比较全面的测试。观察 RTL 级仿真、综合后门级仿真和布局布线后仿真有什么不同,并说明这些不同的原因。从文件系统中查阅自动生成的compare.vm,compare.vo文件和compare.v作比较,说出它们的不同点和相同点。
三、
对任务 的理解
本题就是一个很简单的比较电路。对两个 8 位的输入数据的大小进行比较,并且输出比较结果 四、
实现思路
首先这个比较器应当有3个对外的端口,分别是两个8位数据的输入端口,一个比较结果的输出端口。
由于比较器的输出结果是随着输入变化立即变化的,因此这是一个组合逻辑的电路。主程序很容易实现。
测试模块要产生随机的两个8位输入数据,因此利用系统任务$random来实现。通过一个时钟,每隔一段时间产生两个新的随机数。
五、
代码
主程序 ---------------------------------------文件名 compare_8bit.v-------------------------------------------- module compare_8bit(a,b,re);
input [7:] 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=; endmodule 测试模块 ----------------------------------------文件名 compare_8bit_tb.v----------------------------------- `timescale 1ns/1ns module t;
reg [7:] a,b;
reg clk;
wire re;
initial
begin
a=;
b=;
clk=;
end
always #5 clk=~clk;
always @(posedge clk)
begin
a={$random}%128;
b=($random)%128;
end
initial
begin
#1
$stop;
end
compare_8bit m(.a(a),.b(b),.re(re)); endmodule 六、
仿真波形
七、
总结及 对波形的说明
实验结论 从波形中可以看出当 a>b 时,re=1;当 a<b 时,re=。满足题目的要求。
实验思考 ( 课本 P316 思考题 一 )
1) 在测试方法二中,第二个 initial 块用于设置仿真时长。
2) 它与第一个 initial 块是一个并行的关系,同一个测试文件中,可以有多个 initial 块,且均从 时开始顺序运行,并且仅运行一次。
3) 如果在第二个 initial 块中,没有写#1 或者$stop,仿真将会按测试界面设置的仿真时间进行仿真。(如下图)
4) 第二种测试方法更全面,因为第二种测试方法产生的 a 和 b 的值是随机的,可以测试多种情况,而第一种测试方法只能按照测试文件中给定的数据进行测试,不具有普遍性。
实验 总结 本次实验是 Verilog 上机的第一个实验,内容比较简单,并且课本上已经给出了范例,只需要稍加修改便可以写出程序的代码。
在本次试验中,由于实验软件的限制,我仅仅进行了 RTL 级的仿真,如果要进行综合后门级仿真和布局布线后仿真,可以通过其他软件来进行。
RTL 级仿真、综合后门级仿真和布局布线后仿真的不同之处在于所在的层次不同。依次更加底层化。而 compare.vm,compare.vo 文件和 compare.v文件的描述也是不同层次的描述。
实验二
简单分频 时序逻辑电路的设计
一、
实验目的
掌握最基本时序电路的实现方法; 学习时序电路测试模块的编写; 学习综合和不同层次的仿真。
二、
实验内容
已然制作 clk_in 的 2 分频 clk_out,要求输出时钟的相位与上面的 2 分频器的输出相位正好相反。编写测试模块,给出仿真波形。改变输入始终的频率,观察 RTL 级仿真、综合后门级仿真和布线后仿真的不同,并写出报告 三、
对任务 的理解
本题的实验就是要实现一个分频器。
四、
实现思路
首先这个比较器应当有3个对外的端口,分别是输入时钟信号clk_in,输出时钟信号clk_out,复位信号reset。
由于输入信号中有时钟信号,并且输出是随着输入时钟的某个沿的出现而变化的,因此是一个时序逻辑电路。
题目中要求输出的2分频时钟信号与例题中的相位相反。最简单的想法就是将复位信号有效时的输出信号反相。
五、
代码
主程序 ---------------------------------------文件名 half_clk.v-------------------------------------------- module half_clk(reset,clk_in,clk_out);
input reset, clk_in;
output clk_out;
reg clk_out;
always @(posedge clk_in)
begin
if (!reset)
clk_out=1;
//原例题中此处为 clk_out=;
else
clk_out=~clk_out;
end endmodule 测试模块 ----------------------------------------文件名 half_clk_tb.v----------------------------------- `timescale 1ns/1ps `define clk_cycle 5 module top;
reg clk,reset;
wire clk_out;
always
#`clk_cycle clk=~clk;
initial
begin
clk=;
reset=1;
#1 reset=;
#11 reset=1;
#1
$stop;
end
half_clk m(.reset(reset),.clk_in(clk),.clk_out(clk_out));
endmodule
六、
仿真波形
七、
总结及 对波形的说明
实 实 验结论 从波形中可以看出当clk_out的周期为clk_in的两倍,并且在t=3ns时,为clk_out的下降沿,恰好和例题中的输出信号波形反相,满足题目的要求。
实验思考 ( 课本 P318 思考题二)
1) 如果没有 reset 信号,可以通过在测试文件中的 initial 块中设置 clk_in 的初值为 1 来使输出反相。
2) 只用 clk 时钟沿的出发可以通过一个计数器来产生其他分频的时钟,并且通过调节计数器的值来产生不同占空比的分频时钟,其代码如下
i. 产生任意分频的时钟 ----------------------------主程序 div.v ----------------------------------------- module div(rst,clk,out,num);
input rst, clk;
input [3:] num;
//通过 num 调节分频数
output out;
reg out;
reg [3:] i;
always @(posedge clk)
begin
if(!rst)
begin
i<=;
out<=;
end
else
begin
if (i==((num[3:1])-1))
//num[3:1]代替 num/2
begin
i<=;
out=~out;
end
else
begin
i<=i+1;
out=out;
end
end
end
endmodule
----------------------------测试文件 div_tb.v ----------------------------------------- `timescale 1ns/1ps `define clk_cycle 5 module t;
reg clk,rst;
wire out;
reg [3:] num;
always
#`clk_cycle clk=~clk;
initial
begin
num=4;
clk=;
rst=1;
#1 rst=;
#11 rst=1;
#1
$stop;
end
div m(.rst(rst),.clk(clk),.out(out),.num(num));
endmodule
ii. 产生占空比不同的分频时钟 ----------------------------主程序 div_ex.v ----------------------------------------- module div_ex(rst,clk,out,top,down);
input rst, clk;
input [3:] top,down;
//通过 top,down 调节占空比
output out;
reg out;
reg [3:] i;
always @(posedge clk)
begin
if(!rst)
begin
i<=;
out<=;
end
else
begin
if (out==1)
begin
if (i==(top-1))
begin
i<=;
out=~out;
end
else
begin
i<=i+1;
out=out;
end
end
else
begin
if (i==(down-1))
begin
i<=;
out=~out;
end
else
begin
i<=i+1;
out=out;
end
end
end
end
endmodule
----------------------------测试文件 div_ex_tb.v -----------------------------------------
`timescale 1ns/1ps `define clk_cycle 5 module t;
reg clk,rst;
wire out;
reg [3:] top,down;
always
#`clk_cycle clk=~clk;
initial
begin
top=2;
down=4;
clk=;
rst=1;
#1 rst=;
#11 rst=1;
#1
$stop;
end
div_ex m(.rst(rst),.clk(clk),.out(out),.top(top),.down(down));
endmodule
实验 总结 本次实验是 Verilog 上机的第二个实验,练习了比较简单的时序逻辑电路的设计——分频器。
其中二分频的设计比较简单,课本上有几乎完全相同的代码,只需要稍加修改即可。而任意分频的设计比较困难,需要好好思考。我通过想学长请教,以及上网上查找资料,利用一个计数器完成了任意分频的设计,而产生不同占空比的设计,其原理相同。
实验三
利用 条件语句实现记数分频时序电路
一、
实验目的
掌握条件语句在简单时序模块设计中的使用; 学习在 Verilog 模块中应用计数器; 学习测试模块的编写、综合和不同层次的仿真。
二、
实验内容
利用 1MB 的时钟,设计一个单周期形状的周期波形。
三、
对任务 的理解
题目要求产生特定形状的周期波形,从给出的波形来看,就是一个 top=1us,down=4us,T=5us 的周期方波。如果输入时钟为 1MB,则top=1,down=4。可以利用实验 2 中占空比不同的分频电路的代码来完成任务。
四、
实现思路
首先这个比较器应当有3个对外的端口,分别是复位rst,输入时钟clk和输出out。
利用计数器产生特定的延时,来产生响应的波形。这个任务和实验二中的思考题二第二个小任务完全相同。
五、
代码
主程序 ---------------------------------------文件名 div_ex.v-------------------------------------------- module div_ex(rst,clk,out);
input rst, clk;
reg [6:] top;
reg [8:] down;
output out;
reg out;
always @(posedge clk)
begin
if(!rst)
begin
top<=;
down<=;
out<=;
end
else
begin
if (out==1)
begin
if (top==1)
begin
top<=;
out<=~out;
end
else
begin
top<=top+1;
out<=out;
end
end
else
begin
if (down==4)
begin
down<=;
out<=~out;
end
else
begin
down<=down+1;
out<=out;
end
end
end
end
endmodule
测试模块 ----------------------------------------文件名 div_ex_tb.v-----------------------------------
`timescale 1ns/1ns `define clk_cycle 5 module t;
reg clk,rst;
wire out;
always
#`clk_cycle clk=~clk;
initial
begin
clk=;
rst=1;
#1 rst=;
#11 rst=1;
#6
$stop;
end
div_ex m(.rst(rst),.clk(clk),.out(out));
endmodule 六、
仿真波形
七、
总结及 对波形的说明
实验结论 从波形中可以看出每个周期中高电平持续时间为 1ns=1us,低电平持续时间为 4ns=4us。满足题目的要求。
实验 总结 本次实验是 Verilog 上机的第三个实验,由于有了实验二中的经验,所以只需要把实验二中的程序稍加修改即可得到结果。
但是在实验的过程中我依然遇到了一些阻碍。
首先是由于数量级关系没有搞对,使得计数器的位数出了问题。其次是在测试文件中调用了$stop,而自己预设的 stop 的延迟时间太短,导致输出时钟为低电平(实际上时间还不到一个周期),令自己误以为自己的程序本身有逻辑问题,从而耽误了很多时间。
在看输出波形的长度的时候,可以用 modelsim 中的 cursor 效用,用光标来显示波形持续的长度。
实验四
阻塞赋值与 非阻塞赋值的 区别
一、
实验目的
通过实验,掌握阻塞赋值与非阻塞赋值的概念和区别; 了解非阻塞和阻塞赋值的不同使用场合; 学习测试模块的编写、综合和不同层次的仿真。
二、
实验内容
在 blocking 模块中按如下两种写法,仿真与综合的结果会有什么样的变化?作出仿真波形,分析综合结果 (1)
always @(posedge clk)
begin
c=b;
b=a; end (2)
always @(posedge clk) b=a; always @(posedge clk) c=b; 三、
对任务 的理解
通过给定的两段代码理解所谓阻塞赋值与非阻塞赋值的区别。
四、
实现思路
按照给定的代码进行试验,并查看实验结果。
五、
代码
主程序 ---------------------------------------文件名 blocking.v--------------------------------------------
module blocking(clk, a,b,c);
output [3:] b,c;
input [3:] a;
input clk;
reg [3:] b,c;
always @(posedge clk)
begin
c=b;
b=a;
$display("Blocking: a=%d, b=%d, c=%d.",a,b,c);
end
endmodule ---------------------------------------文件名 blocking_ex.v-------------------------------------------- module blocking_ex(clk, a,b,c);
output [3:] b,c;
input [3:] a;
input clk;
reg [3:] b,c;
always @(posedge clk)
b=a;
always @(posedge clk)
begin
c=b;
$display("Blocking: a=%d, b=%d, c=%d.",a,b,c);
end
endmodule
测试模块 ----------------------------------------文件名 div_ex_tb.v----------------------------------- `timescale 1ns/1ps `include"" `include""
科教兴国