《2021年西工大硬件描述语言实验报告_0》由会员分享,可在线阅读,更多相关《2021年西工大硬件描述语言实验报告_0(41页珍藏版)》请在金锄头文库上搜索。
1、不问收获,但问耕耘,把最好的资料送给最好的自己!西工大硬件描述语言实验报告姓名:XXX时间:20XX年X月X日硬 件 描 述 语 言 实 验 报 告班级:XXXXXXXX学号:XXXXXXXX姓名:XXXXXXXX目 录 硬 件 描 述 语 言 - 0 - 实 验 报 告 - 0 - 实验一 简单组合逻辑设计 - 2 - 实验二 简单分频时序逻辑电路的设计 - 4 - 实验三 利用条件语句实现计数分频时序电路 - 7 - 实验四 阻塞赋值与非阻塞赋值的区别 - 12 - 实验五 用always块实现较复杂的组合逻辑电路 - 16 - 实验六 在Verilog中使用函数 - 21 - 实验七 在
2、Verilog HDL中使用任务(task) - 25 - 实验八 利用有限状态机进行时序逻辑的设计 - 32 - 实验九 利用状态机实现比较复杂的接口设计 - 36 - 实验十 利用SRAM设计一个FIFO - 46 -实验一 简单组合逻辑设计一、 实验目的 1.掌握基本组合逻辑电路的实现方法。2.初步了解两种基本组合逻辑电路的生成方法。3.学习测试模块的编写。4.通过综合和布局布线了解不同层次仿真的物理意义。 二、 实验内容 本次实验采用Verilog HDL语言设计一个可综合的数据比较器,其功能是比较数据a与数据b的结果,如果两个数据相同,则输出结果1,否则给出结果0;并写出测试模型,使
3、其进行比较全面的测试。 三、 实验步骤 1.建立工程文件,编写模块源码和测试模块,要求测试模块对源文件进行比较全面的测试; 2.编译源码和测试模块,用测试模块对源文件进行测试,并进行仿真; 3.观察综合后生成的文件和源文件的不同点和相同点。4.综合时采用不同的FPGA器件,观察综合后的结果有什么不同。 四、 实验代码 1.模块源码 module compare(equal, a, b); input a,b; output equal; assign equal = (a = b)?1:0; endmodule2.测试代码 timescale 1ns/1nsmodule compare_t;
4、reg a, b; wire equal; initial begin a=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; end compare m(.equal(equal),.a(a),.b(b); endmodule五、 综合仿真 RTL图及仿真后波形图: 六、 思考题 1.课本练习一的测试方法二中,第二个initial块有什么用?它与第一个initial块有什么关系?测试方法二中的第二个initial用来暂停仿真以便观察仿真波形,它与第一个initial是并行关系2.如果在
5、第二个initial块中,没有写出#10000或者$stop,仿真会如何进行?如果没有写#10000,仿真会直接停止,没有$stop,仿真不会结束。 3.比较两种测试方法,哪一种更全面?第二种测试方法更全面,测试了更多种的变换的情况。实验二 简单分频时序逻辑电路的设计一、 实验目的 1.掌握条件语句在简单时序模块设计中的使用; 2.掌握verilog语句在简单时序模块设计中的使用; 3.学习在Verilog模块中应用计数器; 4.学习测试模块的编写、综合和不同层次的仿真。 二、 实验内容 1.使用always块和(posedge clk)或(negedge clk)的结构来表述时序逻辑,设计1
6、/2分频的可综合模型。得到如下波形图: 2.对模块进行RTL级仿真、综合后门级仿真,布局布线仿真;三、 实验步骤 1.建立工程文件,编写模块源码和测试模块,要求测试模块能对源文件进行比较全面的测试。2.编译源码和测试模块,用测试模块对源文件进行测试,并综合仿真。得到波形图。3.观察综合后生成的文件和源文件的不同点和相同点。4.记录数据并完成实验报告。 四、 实验代码 1. 模块代码 module half_clk(reset,clk_in,clk_out); input clk_in,reset; output clk_out; reg clk_out; always (posedge clk
7、_in) begin if(!reset)clk_out=0; else clk_out=clk_out; end endmodule2.测试代码 timescale 1ns/100ps define clk_cycle 50 module top; reg clk,reset; wire clk_out; always #clk_cycle clk=clk;initialbeginclk=0; reset=1; #10 reset=0; #110 reset=1; #100000 $stop; end half_clk m0(.reset(reset),.clk_in(clk),.clk_o
8、ut(clk_out); endmodule五、 综合仿真 RTL图以及仿真后波形图六、 思考题 1.如果没有reset信号,能否控制2分频clk_out信号的相位?如果没有reset信号,则无法控制2分频clk_out信号的相位。 2. 只用clk时钟沿的触发(即不用2分频产生的时钟沿)如何直接产生4分频、 8分频、或者16分频的时钟?借助一个整型变量j做计数操作。 3.如何只用clk时钟沿的触发直接产生占空比不同的分频时钟?借助一个整型变量j做计数操作,从而用clk时钟沿的触发直接产生4分频、8分频或者16分频的时钟,及产生占空比不同的分频时钟。实验三 利用条件语句实现计数分频时序电路一、
9、 实验目的 1.掌握条件语句在简单时序模块设计中的使用; 2.掌握最基本时序电路的实现方法; 3.学习在Verilog模块中应用计数器; 4.学习测试模块的编写、综合和不同层次的仿真。 二、 实验内容 1.复习课本,熟悉条件语句的使用方式; 2.建立工程并编写源代码; 3.综合并布局布线仿真并分析always语句在时序逻辑中的作用; 4.学习测试模块的编写、综合和仿真。 三、 实验步骤 1.建立工程文件,编写模块源码和测试模块,要求测试模块能对源文件进行比较全面的测试; 2.编译源码和测试模块,用测试模块对源文件进行测试,并综合仿真; 3.观察综合后生成的文件和源文件的不同点和相同点; 4.综
10、合时采用不同的FPGA器件,如Altera公司的Cyclone II系列和Stratix III系列,观察综合后的结果有什么不同。 四、 实验代码 1.模块代码 module fdivision(RESET,F10M,F500K); input F10M,RESET; output F500K; reg F500K; reg 7:0j; always (posedge F10M) if(!RESET)/低电平复位。begin F500K <= 0; j <= 0; end elsebegin if(j=19)/对计数器进行判断,以确定F500K信号是否反转。begin j <
11、= 0; F500K <= F500K; end else j <= j+1; end endmodule2.测试代码 timescale 1ns/100ps define clk_cycle 50 module division_top; reg F10M,RESET; wire F500K_clk; always #clk_cycle F10M=F10M; initial beginRESET=1; F10M=0; #100 RESET=0; #100 RESET=1; #10000 $stop; end fdivision fdivision(.RESET(RESET),.F
12、10M(F10M),.F500K(F500K_clk); endmodule五、 综合仿真 RTL图以及仿真后波形图: 六、 思考题 1.考虑如何实现任意数值分频。 任意分频代码:module divn(clk,rst_n,o_clk); input clk,rst_n; output o_clk; parameter WIDTH = 3; parameter N = 5;reg WIDTH-1:0 cnt_p,cnt_n; /count_pose,count_nege reg clk_p,clk_n;assign o_clk = (N=1)? clk : (N0)?(clk_p&cl
13、k_n) :clk_p; /如果N=1,o_clk=clk; 如果N为偶数,o_clk=clk_p; 如果N为奇数,o_clk=clk_p & clk_n, /之所以是相与运算,是因为clk_p和clk_n两者高电平比低电平多一个clk,而两者相 /差半个clk,相与结果使o_clk占空比为50%always (posedge clk or negedge rst_n) begin if(!rst_n) cnt_p<=0; else if (cnt_p=(N-1) cnt_p<=0; else cnt_p<=cnt_p+1; endalways (posedge cl
14、k or negedge rst_n) begin if(!rst_n) clk_p<=0; else if (cnt_p<(N>>1)clk_p<=0; else clk_p<=1; endalways (negedge clk or negedge rst_n) begin if(!rst_n) cnt_n<=0; else if (cnt_n=(N-1) cnt_n<=0; elsecnt_n<=cnt_n+1; endalways (negedge clk or negedge rst_n) begin if(!rst_n) clk
15、_n<=0; else if (cnt_n<(N>>1) clk_n<=0; elseclk_n<=1; end endmodule3. 如果综合时采用不同的FPGA器件,如Altera公司的Cyclone II系列和Stratix III系列,想想综合后的结果有什么不同? 时钟分频的实现方法如果是采用行波时钟的方式(异步设计),容易造成时钟偏差,很难控制芯片内部的逻辑基本单元中的触发器的建立/保持时间,同时不同芯片的内部参数也有所不同,同一代码的时序分析结果分析得不同也很正常。 如果分频后的时钟作为后级设计的工作时钟,那么整个设计不只使用一个主时钟,而是用多个时钟来实现的话(异步设计),存在信号的跨时钟域转换问题,跨时钟域的信号如果设计不当,会采到亚稳态。 3.课后自己试着利用10MB的时钟,设计一个单周期形状的周期波形。 模块代码:module zhouqiwave(reset,F10M,a); input reset,F10M; output a; reg a;reg 15:0b; always(reset or posedge F10M) if(!reset) begin a<=0