当前位置:文档之家› 北航verilog实验报告(全)

北航verilog实验报告(全)

目录实验一 (2)实验二 (8)实验三 (14)实验四 (27)实验一实验目的:熟悉硬件开发流程,掌握Modelsim设计与仿真环境,学会简单组合逻辑电路、简单时序逻辑电路设计,不要求掌握综合和综合后仿真。

实验内容:必做实验:练习一、简单的组合逻辑设计练习二、简单分频时序逻辑电路的设计选做实验:选做一、练习一的练习题选做二、7段数码管译码电路练习一、简单的组合逻辑设计描述一个可综合的数据比较器,比较数据a 、b的大小,若相同,则给出结果1,否则给出结果0。

实验代码:模块源代码:module compare(equal,a,b);input a,b;output equal;assign equal=(a==b)?1:0;endmodule测试模块源代码:`timescale 1ns/1ns`include "./compare.v"module t;reg a,b;wire equal;initialbegina=0;b=0;#100 a=0;b=1;#100 a=1;b=1;#100 a=1;b=0;#100 a=0;b=0;#100 $stop;endcompare m(.equal(equal),.a(a),.b(b));endmodule实验波形练习二、简单分频时序逻辑电路的设计用always块和@(posedge clk)或@(negedge clk)的结构表述一个1/2分频器的可综合模型,观察时序仿真结果。

实验代码:模块源代码:module halfclk(reset,clkin,clkout);input clkin,reset;output clkout;reg clkout;always@(posedge clkin)beginif(!reset) clkout=0;else clkout=~clkout;endendmodule测试模块源代码:`timescale 1ns/100ps`define clkcycle 50module tt;reg clkin,reset;wire clkout;always#`clkcycle clkin=~clkin;initialbeginclkin=0;reset=1;#10 reset=0;#110 reset=1;#100000 $stop;endhalfclk m0(.reset(reset),.clkin(clkin),.clkout(clkout));endmodule练习题1:设计一个字节(8位)的比较器。

要求:比较两个字节的大小,并改写测试模型,使其能进行比较全面的测试。

观察RTL级仿真、综合后门级仿真和布线后仿真有什么不同,并说明不同的原因。

从文件系统中查阅自动生成的compare.vm,compare.vo文件和compare.v文件作比较,说出不同点和相同点。

实验代码:模块源代码:module compare1(equal,a,b);input [7:0]a,b;output equal;assign equal=(a>b)?1:0;endmodule测试模块源代码:`timescale 1ns/1ns`include "./compare1.v"module ttt;reg [7:0]a,b;wire equal;initialbegina=8'b00000000;b=8'b00000000;#100 a=8'b00001001;b=8'b00100010;#100 a=8'b00110001;b=8'b00100100;#100 a=8'b00010001;b=8'b00101000;#100 a=8'b10000001;b=8'b00110000;#100 $stop;endcompare1 m(.equal(equal),.a(a),.b(b));endmodule实验分析:RTL,综合后门级仿真和布线后仿真的区别1.RTL行为级仿真这个阶段的仿真可以用来检查代码中的语法错误以及代码行为的正确性,其中不包括延时信息。

如果没有实例化一些与器件相关的特殊底层元件的话,这个阶段的仿真也可以做到与器件无关。

因此在设计的初期阶段不使用特殊底层元件即可以提高代码的可读性、可维护性,又可以提高仿真效率,且容易被重用。

2.综合后门级功能仿真(前仿真)一般在设计流程中的第二个仿真是综合后门级功能仿真。

绝大多数的综合工具除了可以输出一个.VO标准网表文件以外,还可以输出Verilog或者VHDL网表,其中标准网表文件是用来在各个工具之间传递设计数据的,并不能用来做仿真使用,而输出的Verilog或者VHDL网表可以用来仿真,之所以叫门级仿真是因为综合工具给出的仿真网表已经是与生产厂家的器件的底层元件模型对应起来了,所以为了进行综合后仿真必须在仿真过程中加入厂家的器件库,对仿真器进行一些必要的配置,不然仿真器并不认识其中的底层元件,无法进行仿真。

Xilinx公司的集成开发环境ISE中并不支持综合后仿真,而是使用映射前门级仿真代替,对于Xilinx开发环境来说,这两个仿真之间差异很小。

3.时序仿真(后仿真)在设计流程中的最后一个仿真是时序仿真。

在设计布局布线完成以后可以提供一个时序仿真模型,这种模型中也包括了器件的一些信息,同时还会提供一个SDF时序标注文件(Standard Delay format Timing Anotation)。

SDF时序标注最初使用在Verilog语言的设计中,现在VHDL语言的设计中也引用了这个概念。

对于一般的设计者来说并不需知道SDF 对源程序.v的仿真称之为功能仿真,对.vo的仿真称之为网表仿真,这里使用的就是厂家实际用到的元件,是为了确认综合是不是实现了用户预想的功能。

和加入sdo之后的仿真是真正加入了线路延时的仿真。

选做2:7段数码管译码电路实验代码:模块源代码:module segment(a,b);input [3:0]a;output [6:0]b;reg[6:0]b;always @(a)begincase(a)4'd0:b=7'b0000001;4'd1:b=7'b1001111;4'd2:b=7'b0010010;4'd3:b=7'b0000110;4'd4:b=7'b1001100;4'd5:b=7'b0100100;4'd6:b=7'b0100000;4'd7:b=7'b0001111;4'd8:b=7'b0000000;4'd9:b=7'b0000100;default:b=7'bx;endcaseendendmodule测试模块源代码:`timescale 1ns/1nsmodule segment_tb;reg[3:0]a;wire[6:0]b;initialbegina=4'b0;#10 $stop;endalwaysbegin#1 a=a+1'b1;endsegment m(.a(a),.b(b)); endmodule实验波形:实验二实验目的:掌握较为复杂电路设计方法。

实验内容:必做实验:练习三、利用条件语句实现计数分频时序电路练习五、用always块实现较复杂组合逻辑电路选做实验:选做一、练习三的练习题选做二、练习五的练习题练习三:利用条件语句实现计数分频时序电路实验目的:1.掌握条件语句在简单时序模块设计中的使用。

2.学习在Verilog模块中应用计数器。

3.学习测试模块的编写、综合和不同层次的仿真。

实验内容:可总和风格的分频器,可将10MHZ的时钟分频为500khz的时钟。

实验代码:模块源代码:module fdivision(RESET,F10M,F500K);input F10M,RESET;output F500K;reg F500K;reg [7:0]j;always@(posedge F10M)if(!RESET) //低电平复位beginF500K<=0;j<=0;endelsebeginif(j==19) //对计数器进行判断,以确定F500K信号是否反转beginj<=0;F500K<=~F500K;endelsej<=j+1;endendmodule测试模块源代码:`timescale 1ns/100 ps`define clk_cycle 50module division_Top;reg F10M,RESET;wire F500K_clk;always #`clk_cycle F10M= ~F10M;initialbeginRESET=1;F10M=0;#100 RESET=0;#100 RESET=1;#10000 $stop;endfdivision fdivision(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk));endmodule实验波形:实验五:用always块实现较复杂的组合逻辑电路实验目的:1.掌握用always实现较大组合逻辑电路的方法2.进一步了解assign与always两种组合电路实现方法的区别和注意点3.学习测试模块中随机数的产生和应用4.学习综合不同层次的仿真,并比较结果实验内容:设计一个简单的指令译码电路,通过对指令的判断,对输入数据执行相应的操作,包括加、减、与、或和求反,无论数据还是指令发生变化,都要做出及时的反应。

实验代码:模块原代码:`define band 3'd2`define bor 3'd3`define unegate 3'd4module alu(out,opcode,a,b);output[7:0] out;reg[7:0] out;input[2:0] opcode;input[7:0] a,b;always@(opcode or a or b)begincase(opcode)`plus: out=a+b; //以下是加,减,与,或,非,反等等`minus: out=a-b;`band: out=a&b;`bor: out=a|b;`unegate: out=~a;default: out=8'hx; //没有收到指令就随意输出endcaseendendmodule指令译码器的测试模块源代码:`timescale 1ns/1ns`include "./alu.v"module alutest;wire[7:0] out;reg[7:0] a,b;reg[2:0] opcode;parameter times=5;initialbegina={$random}%256;b={$random}%256;opcode=3'h0;repeat(times)begin#100 a={$random}%256;b={$random}%256;opcode=opcode+1;end#100 $stop;endalu alu(out,opcode,a,b);endmodule实验分析:当alutest的opcode为不同值时,a和b执行不同的操作,输出不同的值。

相关主题