《硬件描述语言与FPGA技术》实验指导书西北工业大学2012/10/10目录实验一简单的组合逻辑设计 (3)实验二简单分频时序逻辑电路的设计 (5)实验三利用条件语句实现计数分频时序电路 (8)实验四阻塞赋值与非阻塞赋值的区别 (11)实验五用always块实现较复杂的组合逻辑电路 (15)实验六在Verilog中使用函数 (19)实验七在Verilog HDL中使用任务(task) (22)实验八利用有限状态机进行时序逻辑的设计 (26)实验九利用状态机实现比较复杂的接口设计 (32)练习十利用SRAM设计一个FIFO (39)实验一简单的组合逻辑设计一、实验目的1. 学习Quartus和ModSim两种EDA工具的使用方法;2.掌握基本组合逻辑电路的实现方法;3.初步了解两种基本组合逻辑电路的生成方法;4.学习测试模块的编写;5.通过综合和布局布线了解不同层次仿真的物理意义。
二、实验内容本次实验采用Verilog HDL语言设计一个可综合的数据比较器,其功能是比较数据a与数据b的结果,如果两个数据相同,则输出结果1,否则给出结果0;并写出测试模型,使其进行比较全面的测试。
三、实验仪器、设备预装了开发工具ModelSimSE、synplify的PC机。
四、实验原理1.组合逻辑电路是指在任何时刻,输出状态只决定于同一时刻各输入状态的组合而与电路以前状态无关,而与其他时间的状态无关。
其逻辑函数如下:Li=f(A1,A2,A3……An) (i=1,2,3…m)其中,A1~An为输入变量,Li为输出变量。
2.组合逻辑电路的特点归纳如下:① 输入、输出之间没有返馈延迟通道;② 电路中无记忆单元。
3.组合逻辑设计示例:可综合的数据比较器。
它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
描述组合逻辑时常使用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等于b时,equal输出为1;a不等于b时,//equal输出为0。
endmodule测试模块源代码:`timescale 1ns/1ns`include "./compare.v"module comparetest;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 $stop;endcompare compare1(.equal(equal),.a(a),.b(b));endmodule仿真波形如下:五、实验步骤1.建立工程文件,编写模块源码和测试模块,要求测试模块对源文件进行比较全面的测试;2.编译源码和测试模块,用测试模块对源文件进行测试,并进行仿真;3.观察综合后生成的文件和源文件的不同点和相同点。
4. 综合时采用不同的FPGA器件,观察综合后的结果有什么不同。
六、实验报告要求1.要求实验报告中有编写模块源码和测试模块;2.要求实验报告中有综合后RTL图形;3.要求实验报告中有仿真后的波形;4. 对课后思考题进行分析说明。
七、实验注意事项1.采用Altera公司的Cyclone II系列的EP2C35型FPGA作为建立工程、代码编译、综合库时使用的库器件;2.综合使用synplify工具,布局布线使用quartus II自带工具;3.仿真使用ModelSim工具。
八、思考题1.课本练习一的测试方法二中,第二个initial块有什么用?它与第一个initial 块有什么关系?2.如果在第二个initial块中,没有写出#10000或者$stop,仿真会如何进行?3.比较两种测试方法,哪一种更全面?实验二简单分频时序逻辑电路的设计一、实验目的1.掌握条件语句在简单时序模块设计中的使用;2. 掌握verilog语句在简单时序模块设计中的使用;3.学习在Verilog模块中应用计数器;4.学习测试模块的编写、综合和不同层次的仿真。
二、实验内容1.使用always块和@(posedge clk)或@(negedge clk)的结构来表述时序逻辑,设计1/2分频的可综合模型。
得到如下波形图:2.对模块进行RTL级仿真、综合后门级仿真,布局布线仿真;三、实验仪器、设备预装了开发工具synplify、ModelSimSE的PC机。
四、实验原理1.使用always过程赋值语句对上升沿进行响应,当时钟信号上升沿到来时,系统判断清零信号是否为0,如果为0,则clk_out信号清零,否则clk_out信号翻转clk_out=~clk_out。
2.系统1/2分频原理:一个时钟周期的上升沿时刻,若清零信号reset不为0,输出信号跳变一个周期,输入时钟信号需经过两个周期的上升沿,输出周期为输入周期的两倍,输出频率为输入频率的1/2,这样就完成了1/2分频的效果。
下面是一个可综合的1/2分频器模型。
//half_clk.v---------------------------------------module half_clk(reset,clk_in,clk_out);input clk_in,reset;output clk_out;reg clk_out;always @(posedge clk_in)beginif(!reset) clk_out=0;elseclk_out=~clk_out;endendmodule3.测试模块中,输入周期为200ns的时钟信号,初始化语句initial将时钟信号置0,清零信号先置1,经过10ns置0,开始清零,再经过110ns后置1,开始测试。
设定测试循环时间为100ms,经过100ms以后测试停止。
测试模块的源代码://top.v--------------------------------------------`timescale 1ns/100ps`define clk_cycle 50module top;reg clk,reset;wire clk_out;always #`clk_cycle clk=~clk;initialbeginclk=0;reset=1;#10 reset=0;#110 reset=1;#100000 $stop;endhalf_clk m0(.reset(reset),.clk_in(clk),.clk_out(clk_out));endmodule五、实验步骤1.建立工程文件,编写模块源码和测试模块,要求测试模块能对源文件进行比较全面的测试。
2.编译源码和测试模块,用测试模块对源文件进行测试,并综合仿真。
得到波形图。
3.观察综合后生成的文件和源文件的不同点和相同点。
4.记录数据并完成实验报告。
六、实验报告要求1.要求实验报告中有编写模块源码和测试模块。
2.要求实验报告中有仿真后的波形。
3.实验报告中对思考题进行分析说明。
七、实验注意事项1.注意在always块中,被赋值的信号都必须定义为reg型,这是由时序逻辑电路的特点所决定的。
2.对与reg型数据,如果未对它进行赋值,仿真工具会默认它为不定态。
八、思考题1.如果没有reset信号,能否控制2分频clk_out信号的相位?2.只用clk时钟沿的触发(即不用2分频产生的时钟沿)如何直接产生4分频、8分频、或者16分频的时钟?3.如何只用clk时钟沿的触发直接产生占空比不同的分频时钟?实验三利用条件语句实现计数分频时序电路一.实验目的:1.掌握条件语句在简单时序模块设计中的使用;2.掌握最基本时序电路的实现方法;3.学习在Verilog模块中应用计数器;4. 学习测试模块的编写、综合和不同层次的仿真。
二.实验内容:1.复习课本,熟悉条件语句的使用方式;2.建立工程并编写源代码;3. 综合并布局布线仿真并分析always语句在时序逻辑中的作用;4. 学习测试模块的编写、综合和仿真。
图3.1 技术分频器波形三.实验设备:预装了Active-HDL6.2及Synplify7.0的PC机。
四、实验原理1.复位信号reset为低电平时,对电路中的寄存器进行复位,F输出低电平信号。
利用分频器的设计原理,在程序中设计一个计数器,在时钟的上升沿计数,当计数值为19时(此时时钟已经产生了20个上升沿),输出信号F翻转为高电平,高电平的持续时间为10us。
之后,复位信号再次将F复位为低电平,低电平的持续时间为10us。
2.条件语句示例:可综合风格的分频器。
它的功能是将10M的时钟分频为500K的时钟。
基本原理与1/2分频器是一样的,但是需要定义一个计数器,以便准确获得1/20分频。
模块源代码:// --------------- fdivision.v -----------------------------module fdivision(RESET,F10M,F500K);input F10M,RESET;output F500K;reg F500K;reg [7:0]j;always @(posedge F10M)i f(!RESET) //低电平复位。
beginF500K <= 0;j <= 0;ende lsebeginif(j==19) //对计数器进行判断,以确定F500K信号是否反转。
beginj <= 0;F500K <= ~F500K;endelsej <= j+1;endendmodule测试模块源代码:--------------fdivision_top.v---------------`timescale 1ns/100ps`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五、实验步骤1.建立工程文件,编写模块源码和测试模块,要求测试模块能对源文件进行比较全面的测试;2.编译源码和测试模块,用测试模块对源文件进行测试,并综合仿真;3.观察综合后生成的文件和源文件的不同点和相同点;4. 综合时采用不同的FPGA器件,如Altera公司的Cyclone II系列和Stratix III系列,观察综合后的结果有什么不同。