Verilog实验报告

合集下载

VerilogHDL实验报告

VerilogHDL实验报告

VerilogHDL实验报告实验一Modelsim仿真软件的使用一、实验目的(1)熟悉Modelsim 软件(2)掌握Modelsim 软件的编译、仿真方法(3)熟练运用Modelsim 软件进行HDL 程序设计开发二、实验内容1、实验要求用Verilog HDL 程序实现一个异或门,Modelism仿真,观察效果。

2、步骤1、建立工程2、添加文件到工程3、编译文件4、查看编译后的设计单元5、将信号加入波形窗口6、运行仿真3、方法moduleyihuo (a,b,c);inputa,b;output c;assign c=a^b;endmodule测试程序:module t_yihuo;reg a,b; wire c;initial begin a=0; forever #20 a=~a; end initial begin b=0; forever #30 b=~b; endyihuou1(a,b,c);endmodule二、实验结果波形图:三、分析和心得通过这次的实验,我基本熟悉Modelsim软件,掌握了Modelsim软件的编译、仿真方法。

同时在编写程序的过程中,加深了我对课上所讲的HDL的语法的认识。

实验二简单组合电路设计一、实验目的(1)掌握基于Modelsim的数字电路设计方法(2)熟练掌握HDL 程序的不同实现方法二、实验内容1、实验要求设计一个三人表决器(高电平表示通过),实验内容如下:(1)三个人,一个主裁判,两个副裁判;(2)规则:只要主裁判同意,输出结果为通过;否则,按少数服从多数原则决定是否通过。

使用 Verilog HDL 程序实现上述实验内容,并使用modelsim 仿真。

2、方法module test(a,b,c,s);inputa,b,c;output s;assign s=c|(b&a);endmodulemodulet_test;rega,b,c;wire s;initialbegina=0;forever#10 a=~a;endinitialbeginb=0;forever #20 b=~b;endinitialbeginc=0;forever#40 c=~c;endtest u1(a,b,c,s);endmodule三、实验结果四、分析和心得通过本次实验,我掌握基于Modelsim的简单数字电路设计方法,且尝试了用不同方法实现功能,三人表决器可以通过testbench测试程序实现,也可以利用always模块实现,可见程序的设计思想是很重要的。

Verilog期末实验报告―波形发生器

Verilog期末实验报告―波形发生器

Verilog期末实验报告―波形发生器深圳大学实验报告课程名称: Verilog使用及其应用实验名称: 频率可变的任意波形发生器学院: 电子科学与技术学院专业:电子科学与技术班级: 2组号: 指导教师: 刘春平报告人: 陈昊学号: 2007160162 实验地点科技楼B115一、实验目的应用Verilog进行编写四种波形发生的程序,并结合DE2板与DVCC实验板上的D/A转换器在示波器显示出波形。

初步了解Verilog的编程及DE2板的应用,加强对其的实际应用操作能力。

二、实验原理实验程序分为三部分:第一、通过计数器实现内置信号分频,并通过外置开关调节频率来控制输出波形的频率。

第二、设定ROM中的数值,将波形数据存储到ROM中。

第三、设定波形选择开关。

总体设计方案及其原理说明:FPGA图 1-1 系统总体设计方案DDS是一种把数字信号通过数/模转换器转换成模拟信号的合成技术。

它由相位累加器、相幅转换函数表、D/A转换器以及内部时序控制产生器等电路组成。

参考频率f_clk为整个合成器的工作频率,输入的频率字保存在频率寄存器中,经,位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形。

p为频率字,即相位增量;参考频率为,_clk;相位累加器的长度为,位,输出频率,_out为:f_out——输出信号的频率; N————相位累加器的位数;p———频率控制字(步长); f_clk——基准时钟频率。

图1-2 四种波形单周期的取样示意图段地址基地址 D7 D6 D5 D4 D3 D2 D1 D000 000 1000 001 1700 010 1500 011 1700 100 1000 101 300 110 500 111 301 000 301 001 301 010 301 011 301 100 101 101 101 110 101 111 110 000 010 001 510 010 1010 011 1510 100 2010 101 2510 110 3010 111 3511 000 3511 001 3011 010 2511 011 2011 100 1511 101 1011 110 511 111 0图1-3 函数查找表的设计三、实验内容程序编码:module dds(f_clk,p,choose,data);//端口设定 input [5:0] p; //频率控制字 input[1:0] choose; //波形选择 input f_clk; //内置晶振 output [7:0] data; wire [7:0]data;reg [5:0] addr,address; reg [5:0] i;reg f_out;initialbegini<=0;addr<=0;f_out<=0;endalways @(posedge f_clk) //利用计数器实现任意分频beginif(i==p) //设定频率控制字pbegini=0;f_out=~f_out;endelsei=i+1;endfunction [7:0] romout; //ROM的设定input[5:0] address; case(address) //各波形初值的预装入0 : romout = 10; //正弦波初值 1 : romout = 17;2 : romout = 15;3 : romout = 17;4 : romout = 10;5 : romout = 3;6 : romout = 5;7 : romout = 3;8 : romout = 3; //方波初值 9 : romout = 3;10: romout = 3;11: romout = 3;12: romout = 1;13: romout = 1;14: romout = 1;15: romout = 1;16 : romout = 0; //正三角波初值 17 : romout = 5;18 : romout = 10;19 : romout = 15;20 : romout = 20;21 : romout = 25;22 : romout = 30;23 : romout = 35;24 : romout = 35; //反三角波初值 25 : romout = 30;26 : romout = 25;27 : romout = 20;28 : romout = 15;29 : romout = 10;30 : romout = 5;31 : romout = 0; default : romout = 10'hxx; endcase endfunctionalways@(posedge f_out)beginif(addr==8) //波形数据切换addr=0;elseaddr=addr+1;case(choose) //波形选择开关设定0: address=addr;1: address=addr+8;2: address=addr+16;3: address=addr+24;endcaseendassign data = romout(address);//将ROM中对应数据传递输出端口data输出endmodule四、实验截图1.正弦波示意图:(choose=0时的波形数值)2.方波示意图:(choose=1时的波形数值)3.正三角波示意图:(choose=2时的波形数值)4.反三角波示意图:(choose=3时的波形数值)五、实验总结通过这次期末实验,更进一步认识了Verilog语言的使用,详细了解了整个设计制作和仿真流程,独立思考并通过一步步的调试,逐步摸索和进一步优化程序最终完成实验,锻炼了逻辑思维能力。

Verilog HDL 实验报告

Verilog HDL 实验报告

Verilog实验报告班级:学号:姓名:实验1 :用 Verilog HDL 程序实现直通线1 实验要求:(1) 编写一位直通线的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 建议用模式 52 试验程序:module wl(in,out);input in;output out;wire out;assign out=in;endmodule3 测试基准:`include “wl.v”module wl_tb;reg in_tb;wire out_tb;initialbeginin_tb =0;#100 in_tb =1;#130 in_tb =0;endendmodule4 仿真图形:实验2 :用 Verilog HDL 程序实现一位四选一多路选择器1实验要求:(1) 编写一位四选一多路选择器的 Veirlog HDL 程序.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4)建议用模式 52 试验程序:module mux4_to_1 (out,i0,i1,i2,i3,s1,s0);output out;input i0,i1,i2,i3;input s1, s0;reg out;always @ (s1 or s0 or i0 or i1 or i2 or i3)begincase ({s1, s0})2'b00: out=i0;2'b01: out=i1;2'b10: out=i2;2'b11: out=i3;default: out=1'bx;endcaseendendmodule3 测试基准:`include "mux4_to_1.v"module mux4_to_1_tb1;reg ain,bin,cin,din;reg[1:0] select;reg clock;wire outw;initialbeginain=0;bin=0;cin=0;din=0;select=2'b00;clock=0;endalways #50 clock=~clock;always @(posedge clock)begin#1 ain={$random} %2;#3 bin={$random} %2;#5 cin={$random} %2;#7 din={$random} %2;endalways #1000 select[0]=!select[0];always #2000 select[1]=!select[1];mux4_to_1 m(.out(outw),.i0(ain),.i1(bin),.i2(cin),.i3(din),.s1(select[1]),.s0(select[0])); endmodule4 仿真图形:实验3:用 Verilog HDL 程序实现十进制计数器1实验要求:(1) 编写十进制计数器的 Veirlog HDL 程序. 有清零端与进位端, 进位端出在输出为 9 时为高电平.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2 实验程序:module counter_10c (Q, clock, clear, ov);output [3:0] Q;output ov;input clock, clear;reg [3:0] Q;reg ov;initial Q=4'b0000;always @ (posedge clear or negedge clock)beginif (clear)Q<=4'b0;else if (Q==8)beginQ<=Q+1;ov<=1'b1;endelse if (Q==9)beginQ<=4'b0000;ov<=1'b0;endelsebeginQ<=Q+1;ov<=1'b0;endendendmodule3 测试基准:`include"./counter_10c.v"module counter_10c_tb;wire[3:0] D_out;reg clk,clr;wire c_out;reg[3:0] temp;initialbeginclk=0;clr=0;#100 clr=1;#20 clr=0;endalways #20 clk=~clk;counter_10c m_1(.Q(D_out),.clear(clr),.clock(clk),.ov(c_out)); endmodule4 仿真波形:实验4 :用 Verilog HDL 程序实现序列检测器1 实验要求:、(1) 编写序列检测器的 Veirlog HDL 程序. 检测串行输入的数据序列中是否有目标序列5'b10010, 检测到指定序列后, 用一个端口输出高电平表示.(2) 编写配套的测试基准.(3) 通过 QuartusII 编译下载到目标 FPGA器件中进行验证.(4) 自行选择合适的模式2试验程序:module e15d1_seqdet( x, z, clk, rst);input x,clk, rst;output z;reg [2:0] state;wire z;parameter IDLE = 3 'd0,A = 3'd1,B = 3'd2,C = 3'd3,D = 3'd4,E = 3'd5,F = 3'd6,G = 3'd7;assign z =(state==D && x==0)?1:0;always @(posedge clk or negedge rst)if(!rst)beginstate<=IDLE;endelsecasex(state)IDLE: if(x==1)state<=A;else state<=IDLE;A: if (x==0)state<=B;else state<=A;B: if (x==0)state<=C;else state<=F;C: if(x==1)state<=D;else state<=G;D: if(x==0)state<=E;else state<=A;E: if(x==0)state<=C;else state<=A;F: if(x==1)state<=A;else state<=B;G: if(x==1)state<=F;else state <=G;default: state<=IDLE;endcaseendmodule3测试基准:`include"e15d1_seqdet.v"`timescale 1ns/1ns`define halfperiod 20module e15d1_seqdet_tb;reg clk, rst;reg [23:0] data;wire z;reg x;initialbeginclk =0;rst =1;#2 rst =0;#30 rst =1;data= 20 'b1100_1001_0000_1001_0100;#(`halfperiod*1000) $stop;endalways #(`halfperiod) clk=~clk;always @ (posedge clk)begin#2 data={data[22:0],data[23]};x=data[23];ende15d1_seqdet m(.x(x),.z(z),.clk(clk),.rst(rst)); endmodule4仿真波形:。

verilog有限状态机实验报告范文(附源代码)

verilog有限状态机实验报告范文(附源代码)

verilog有限状态机实验报告范文(附源代码)有限状态机实验报告一、实验目的进一步学习时序逻辑电路了解有限状态机的工作原理学会使用“三段式”有限状态机设计电路掌握按键去抖动、信号取边沿等处理技巧二、实验内容用三段式有限状态机实现序列检测功能电路a)按从高位到低位逐位串行输入一个序列,输入用拨动开关实现。

b)每当检测到序列“1101”(不重叠)时,LED指示灯亮,否则灭,例如i.ii.输入:1101101101输出:0001000001c)用八段数码管显示最后输入的四个数,每输入一个数,数码管变化一次d)按键按下的瞬间将拨动开关状态锁存i.注意防抖动(按键按下瞬间可能会有多次的电平跳变)三、实验结果1.Rt_n为0时数码管显示0000,led灯不亮,rt_n拨为1,可以开始输入,将输入的开关拨到1,按下按钮,数码管示数变为0001,之后一次类推分别输入1,0,1,按下按钮后,数码管为1101,LED灯亮,再输入1,LED灯灭,之后再输入0,1(即共输入1101101使1101重叠,第二次LED灯不亮),之后单独输入1101,LED灯亮2.仿真图像刚启动时使用rt_n一段时间后其中Y代表输出,即控制led灯的信号,el表示数码管的选择信号,eg表示数码管信号四、实验分析1、实验基本结构其中状态机部分使用三段式结构:2、整体结构为:建立一下模块:Anti_dither.v输入按键信号和时钟信号,输出去除抖动的按键信号生成的脉冲信号op这一模块实现思路是利用按钮按下时会持续10m以上而上下抖动时接触时间不超过10m来给向下接触的时间计时,达到上限时间才产生输出。

Num.v输入op和序列输入信号A,时钟信号clk和复位信号,复位信号将num置零,否则若收到脉冲信号则将num左移一位并将输入存进最后一位。

输出的num即为即将在数码管上显示的值Scan.v输入时钟信号,对其降频以产生1m一次的扫描信号。

Trigger.v这一模块即为状态机模块,按三段式书写。

verilog实验 计数器实验报告

verilog实验 计数器实验报告

计数器1、实现目标及介绍实验实现了一个简易的计数器,计数范围可达899(0~899),通过key4按键计数,每按下一次,计数加一,百位数显示在led上,个位与十位显示在数码管上。

为十进制计数,数码管1计数到九后置零。

数码管2获得进位加一,数码管2到9后当再次获得个位进位时再次向百位进一,点亮led1,每百位点亮一个led。

此外key4为清零键,可随时按键清零。

2、效果展示计数99清零计数100视频展示(双击观看)3、代码实现与模块分析1.顶层模块module jishuqi(input wire clk,rst, //时钟和复位输入input wire key1, //拨码计output wire [7:0]led,output wire [8:0] segment_led_1,segment_led_2 //数码管输出);wire key_pulse;reg [7:0] cnt; //计时计数器reg [7:0] hud; //百位计数initial hud[7:0] <= 8'b11111111;always @(posedge clk or negedge rst)begin //数码管显示要按照十进制的方式显示if(!rst)begin cnt <= 8'h00;hud [7:0] <= 8'b11111111;endelse if(key_pulse)beginif(cnt[3:0] == 4'd9) //个位进位判断begincnt[3:0] <= 4'd0;if(cnt[7:4] == 4'd9 ) //十位进位判断begincnt[7:4] <= 4'd0;hud[7:0] <= hud[7:0] - 1'b1;endelsecnt[7:4] <= cnt[7:4] + 1'b1;endelse cnt[3:0] <= cnt[3:0] + 1'b1;endelsecnt <= cnt;endassign led = hud;//例化调用数码管显示模块segment u2(.seg_data_1 (cnt[7:4]), //g_data input.seg_data_2 (cnt[3:0]), //g_data input.seg_led_1 (segment_led_1), //MSB~LSB = SEG,DP,G,F,E,D,C,B,A.seg_led_2 (segment_led_2) //MSB~LSB = SEG,DP,G,F,E,D,C,B,A);//例化调用消抖模块debounce u1 (.clk (clk),.rst (rst),.key (key1),.key_pulse (key_pulse));endmodule2.数码管显示模块module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2);input [3:0] seg_data_1;//数码管需要显示0~9十个数字,所以最少需要4位输入做译码input [3:0] seg_data_2; //小脚丫上第二个数码管output [8:0] seg_led_1;//在小脚丫上控制一个数码管需要9个信号MSB~LSB=DIG、DP、G、F、E、D、C、B、Aoutput [8:0] seg_led_2;//在小脚丫上第二个数码管的控制信号MSB~LSB=DIG、DP、G、F、E、D、C、B、Areg [8:0] seg [9:0];//定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽initial//在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial //initial和always不同,其中语句只执行一次beginseg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字0seg[1] = 9'h06; //7段显示数字 1seg[2] = 9'h5b; //7段显示数字 2seg[3] = 9'h4f; //7段显示数字 3seg[4] = 9'h66; //7段显示数字 4seg[5] = 9'h6d; //7段显示数字 5seg[6] = 9'h7d; //7段显示数字 6seg[7] = 9'h07; //7段显示数字7seg[8] = 9'h7f; //7段显示数字8seg[9] = 9'h6f; //7段显示数字9endassign seg_led_1 = seg[seg_data_1]; //连续赋值,这样输入不同四位数,就能输出对于译码的9位输出assign seg_led_2 = seg[seg_data_2];endmodule3.按键消抖模块//按键消抖module debounce (clk,rst,key,key_pulse);parameter N = 2; //要消除的按键的数量input clk;input rst;input [N-1:0] key; //输入的按键output [N-1:0] key_pulse; //按键动作产生的脉冲reg [N-1:0] key_rst_pre; //定义一个寄存器型变量存储上一个触发时的按键值reg [N-1:0] key_rst; //定义一个寄存器变量储存储当前时刻触发的按键值wire [N-1:0] key_edge; //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk or negedge rst)beginif (!rst)beginkey_rst <= {N{1'b1}}; //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelsebeginkey_rst <= key; //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst; //非阻塞赋值。

verilog全加器实验报告

verilog全加器实验报告

verilog全加器实验报告Verilog-全加器上机实验报告西安邮电學院基于Verilog的HDL设计基础实验报告学院名称 :学生姓名 : 专业名称 :班级 : 学时通信与信息工程学院通信工程号 : 间 :2010年11月24日实验题目全加器一、实验内容对一位二进制全加器的设计与验证;再对其进行综合生成网表文件;然后进行后仿真。

二、技术规范1、输入引脚: a,b,c_in;输出引脚:sum,c_out。

2、功能:这是一位二进制全加器。

a,b为输入的两个二进制加数,c_in为低位向本位的借位,sum为全加和,c_out为本位向高位的进位。

三、实验步骤1、在modulesim软件中进行两个一位二进制数的全加器的设计与验证,直到运行结果全部正确;2、在Quartus软件中对刚刚完成的计数器进行综合,生成网表文件;3、在modulesim软件中对计数器进行进行后仿真。

四、源代码1. 设计模块:module Count4(sum,c_out,a,b,c_in);output [3:0] sum;output c_out;input [3:0] a,b;input c_in;wire c1,c2,c3;Count Ca0(sum[0],c1,a[0],b[0],c_in);Count Ca1(sum[1],c2,a[1],b[1],c1);Count Ca2(sum[2],c3,a[2],b[2],c2);Count Ca3(sum[3],c_out, a[3],b[3],c3); Endmodulemodule Count(sum, c_out,a,b,c_in);output sum,c_out;input a,b,c_in;wire s1,c1,c2;xor(s1,a,b);and(c1,a,b);xor(sum,s1,c_in);and(c2,s1,c_in);xor(c_out,c2,c1);endmodule2.激励模块:module jili;reg [3:0] A, B;reg C_IN;wire [3:0] SUM ;wire C_OUT;Count4 CT_4(SUM,C_OUT,A,B,C_IN);initialbegin$monitor($time,A=%b,B=%b,C_IN=%b,---C_OUT=%b,SUM=%b\n,A,B ,C_IN,C_OUT,SUM);endinitialbeginA=4&#39;d0;B=4&#39;d0;C_IN=1&#39;b0;#5 A=4&#39;d3;B=4&#39;d4;#5 A=4&#39;d2;B=4&#39;d5;#5 A=4&#39;d9;B=4&#39;d9;#5 A=4&#39;d10;B=4&#39;d15;#5 A=4&#39;d10;B=4&#39;d5;C_IN=1&#39;b1;endendmodule五、仿真结果及分析五、调试情况,设计技巧及体会1、程序调试:开始时程序一直都编译不出来,总是出现错误,认真修改后,总算是编译成功了,但在SIMULATE时又出现错误,~在同学的帮助下,经过认真的改正,最终修改正确运行成功。

verilog实验报告

verilog实验报告

verilog实验报告Verilog实验报告引言:Verilog是一种硬件描述语言(HDL),用于设计和模拟数字电路。

它是一种高级语言,能够描述电路的行为和结构,方便工程师进行数字电路设计和验证。

本实验报告将介绍我在学习Verilog过程中进行的实验内容和所获得的结果。

实验一:基本门电路设计在这个实验中,我使用Verilog设计了基本的逻辑门电路,包括与门、或门和非门。

通过使用Verilog的模块化设计,我能够轻松地创建和组合这些门电路,以实现更复杂的功能。

我首先创建了一个与门电路的模块,定义了输入和输出端口,并使用逻辑运算符和条件语句实现了与门的功能。

然后,我创建了一个测试模块,用于验证与门的正确性。

通过输入不同的组合,我能够验证与门的输出是否符合预期。

接下来,我按照同样的方法设计了或门和非门电路,并进行了相应的测试。

通过这个实验,我不仅学会了使用Verilog进行基本门电路的设计,还加深了对逻辑电路的理解。

实验二:时序电路设计在这个实验中,我学习了如何使用Verilog设计时序电路,例如寄存器和计数器。

时序电路是一种具有状态和时钟输入的电路,能够根据时钟信号的变化来改变其输出。

我首先设计了一个简单的寄存器模块,使用触发器和组合逻辑电路实现了数据的存储和传输功能。

然后,我创建了一个测试模块,用于验证寄存器的正确性。

通过输入不同的数据和时钟信号,我能够观察到寄存器的输出是否正确。

接下来,我设计了一个计数器模块,使用寄存器和加法电路实现了计数功能。

我还添加了一个复位输入,用于将计数器的值重置为初始状态。

通过测试模块,我能够验证计数器在不同的时钟周期内是否正确地进行计数。

通过这个实验,我不仅学会了使用Verilog设计时序电路,还加深了对触发器、寄存器和计数器的理解。

实验三:组合电路设计在这个实验中,我学习了如何使用Verilog设计组合电路,例如多路选择器和加法器。

组合电路是一种没有状态和时钟输入的电路,其输出只取决于当前的输入。

Verilog实验报告

Verilog实验报告

Verilog实验报告实验一简单组合逻辑电路的设计一实验要求1.用verilog HDL语言描写出简单的一位数据比较器及其测试程序;2.用测试程序对比较器进行波形仿真测试;画出仿真波形;3.总结实验步骤和实验结果。

二实验原理与内容4.这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。

在Verilog HDL中,描述组合逻辑时常使用assign结构。

注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。

5.模块源代码测试模块:6.波形图:四结实验步骤和实验结果由图可看出,每当输入的电位值不同时输出为0,这与实验要求一致,相同时输出为1,故此程序是可行的。

实验三在verilog HDL中使用函数一实验要求1.掌握函数在模块中的使用2.用测试程序进行波形仿真测试;画出仿真波形3.总结实验步骤和实验结果二实验原理与内容与一般的程序设计语言一样;verilog HDL也可以使用函数已是应对不同变量采取同一运算的操作。

verilog HDL函数在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改变这部分电路的输入以得到相应的计算结果。

模块源代码:module ex3(clk,n,result,reset);output[31:0] result;input[3:0] n;input reset,clk;reg[31:0] result;always @(posedge clk)beginif(!reset)result <= 0;elsebeginresult <= n*factorial(n)/((n*2)+1);endendfunction[31:0] factorial;input[3:0] operand;reg[3:0] index;beginfactorial = operand ? 1:0;for(index = 2;index <= operand;index = index+1) factorial = index*factorial;endendfunctionendmodule`timescale 1ns/100ps`define clk_cycle 50module ex3_t();reg[3:0] n,i;reg reset,clk;wire[31:0] result;initialbeginn=0;reset=1;clk=0;#100 reset=0;#100 reset = 1;for(i=0;i <= 15;i=i+1)begin#200 n=i;end#100 $stop;endalways #`clk_cycle clk =~ clk;ex3 ex30(.clk(clk),.n(n),.result(result),.reset(reset)); always @(negedge clk)$display("at n=%d,result=%d",n,result);endmodule波形图:实验四在verilog HDL中使用任务一实验要求1.掌握任务在结构化verilog HDL设计中的应用2.用测试程序进行波形仿真测试;画出仿真波形3.总结实验步骤和实验结果二实验原理与内容仅有函数并不能满足verilog HDL中的运算需求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2014-2015-2-G02A3050-1电子电路设计训练(数字EDA部分)实验报告(2015 年5 月20 日)教学班学号姓名组长签名成绩自动化科学与电气工程学院目录目录 (1)实验一、简单组合逻辑和简单时序逻辑 (1)1.1 实验任务1——简单组合逻辑 (1)1.1.1 实验要求 (1)1.1.2 模块的核心逻辑设计 (1)1.1.3 测试程序的核心逻辑设计 (1)1.1.4 仿真实验关键结果及其解释 (2)1.2 实验任务2——简单时序逻辑 (3)1.2.1 实验要求 (3)1.2.2 模块的核心逻辑设计 (3)1.2.3 测试程序的核心逻辑设计 (3)1.2.4 仿真实验关键结果及其解释 (4)1.3 实验小结 (4)实验二、条件语句和always过程块 (5)2.1 实验任务1——利用条件语句实现计数分频时序电路 (5)2.1.1 实验要求 (5)2.1.2 模块的核心逻辑设计 (5)2.1.3 测试程序的核心逻辑设计 (6)2.1.4 仿真实验关键结果及其解释 (7)2.2 实验任务2——用always块实现较复杂的组合逻辑电路 (8)2.2.1 实验要求 (8)2.2.2 模块的核心逻辑设计 (8)2.2.3 测试程序的核心逻辑设计 (9)2.2.4 仿真实验关键结果及其解释 (10)2.3 实验小结 (11)实验三、赋值、函数和任务 (12)3.1 实验任务1——阻塞赋值与非阻塞赋值的区别 (12)3.1.1 实验要求 (12)3.1.2 模块的核心逻辑设计 (12)3.1.3 测试程序的核心逻辑设计 (13)3.1.4 仿真实验关键结果及其解释 (14)3.2 实验任务2——在Verilog HDL中使用函数 (16)3.2.1 实验要求 (16)3.2.2 模块的核心逻辑设计 (16)3.2.3 测试程序的核心逻辑设计 (18)3.2.4 仿真实验关键结果及其解释 (19)3.3 实验任务3——在Verilog HDL中使用任务 (20)3.3.1 实验要求 (20)3.3.2 模块的核心逻辑设计 (20)3.2.3 测试程序的核心逻辑设计 (21)3.2.4 仿真实验关键结果及其解释 (22)3.3 实验小结 (22)实验四、有限状态机 (23)4.1 实验任务1——基于状态机的串行数据检测器 (23)4.1.1 实验要求 (23)4.1.2 模块的核心逻辑设计 (23)4.1.3 测试程序的核心逻辑设计 (25)4.1.4 仿真实验关键结果及其解释 (26)4.2 实验任务2——楼梯灯 (26)4.2.1 实验要求 (26)4.2.2 模块的核心逻辑设计 (27)4.2.3 测试程序的核心逻辑设计 (31)4.2.4 仿真实验关键结果及其解释 (32)4.3 实验小结 (34)实验一、简单组合逻辑和简单时序逻辑1.1 实验任务1——简单组合逻辑1.1.1 实验要求(1)设计一个两位数据比较器,比较两个数据a和b。

若两数据相同,则给出结果1,否则给出结果0。

(2)设计一个字节(8位)的比较器,比较两个字节a[7:0]和b[7:0]的大小。

若a大于b,则输出高电平,否则输出低电平。

1.1.2 模块的核心逻辑设计(1)两位数据比较器assign equal=(a==b)?1:0; //用连续赋值语句assign对结果equal赋值,a=b 时,equal输出为1,否则为0(2)字节数据比较器assign res=(a>b)?1:0; //用连续语句assign对结果equal赋值,a>b时equal输出为1,否则输出为01.1.3 测试程序的核心逻辑设计(1)两位数据比较器always #50 clock=~clock; //产生周期性跳变的时钟,50个时间单位跳变一次always@(negedge clock) //always后的语句表示时序控制,每次时钟下降沿时刻产生不同的a和bbegina={$random}%2;b={$random}%2; //每次随机产生a和bendinitialbegin#100000000 $stop; end//系统任务,暂停仿真以观察波形(2)字节数据比较器a={$random}%256;b={$random}%256;//a和b从0~255共256个数中随机产生,即可生成8位字节数据1.1.4 仿真实验关键结果及其解释(1)两位数据比较器图1两位数据比较器波形图如图1所示,a和b相同时equal输出为高电平,否则输出低电平。

(2)字节数据比较器图 2 字节数据比较器波形图如图2所示,a>b时,res输出高电平,否则res输出低电平。

1.2 实验任务2——简单时序逻辑1.2.1 实验要求设计一个分频器,将时钟波形二分频。

1.2.2 模块的核心逻辑设计always@(posedge clk_in)//always语句后表示时序控制,每次clk_in时钟上升沿时刻进行动作beginif(! reset) clk_out=0; //reset信号为低电平时,输出清零else clk_out=~clk_out;//reset为高电平时,输出时钟clk_out在输入时钟clk_in的上升沿时刻翻转end1.2.3 测试程序的核心逻辑设计always #`clk_cycle clk=~clk; //产生输入时钟initialbeginclk=0;reset=1;#10 reset=0; //reset给低电平,输出清零#110 reset=1; //reset复位#100000 $stop; //系统任务,暂停仿真以便观察波形end1.2.4 仿真实验关键结果及其解释图 3 二分频器的波形图如图3所示,输入时钟clk被二分频输出。

1.3 实验小结通过实验一,我掌握了如下内容:1)assign连续赋值语句的使用。

2)always, initial块的使用。

3)reg, wire等数据类型的适用范围4)调用被测试模块的方法实验二、条件语句和always过程块2.1 实验任务1——利用条件语句实现计数分频时序电路2.1.1 实验要求(1)设计20分频计数器,将10MHz的时钟分频为500kHz的时钟。

(2)利用10MHz的时钟,设计一个给定单周期形状的周期波形。

2.1.2 模块的核心逻辑设计(1)20分频计数器beginif(j==9) //对计数器进行判断,计十个数翻转一次,则一个周期计20个数,即实现20分频beginj<=0; //输出时钟翻转的同时计数器置零F500K<=~F500K;endelsej<=j+1; //若还没计到十个数,继续计数end(2)给定单周期形状的波形beginif(j<=20)beginFDIV<=0;j<=j+1; //前20个输入时钟周期,计数器计数,但输出不跳变endelse if((j>20)&&(j<=30))beginFDIV<=1;j<=j+1; //中间10个时钟周期输出跳变成高电平,保持计数endelse if((j>30)&&(j<=50))beginFDIV<=0;j<=j+1; //后20个时钟周期输出跳变成低电平,保持计数endelsej<=0; //计数器清零end2.1.3 测试程序的核心逻辑设计(1)20分频计数器always #`clk_cycle F10M_clk=~F10M_clk; //产生输入的10MHz时钟initialbeginRESET=1;F10M_clk=0;#100 RESET=0; //reset给低电平,输出清零#100 RESET=1; //reset复位#10000 $stop; //系统任务,暂停仿真以便观察波形end(2)给定单周期形状的波形beginRESET=1;F10M_clk=0;#100 RESET=0;#100 RESET=1;#100000 $stop;end //与(1)一致2.1.4 仿真实验关键结果及其解释(1)20分频计数器图 4 20分频计数器波形图如图4所示,10MHz的时钟F10M被20分频成500kHz的时钟F500k。

(2)给定单周期形状的波形图 5 给定单周期形状的波形图如图5所示,生成了题目要求形状的周期波形图。

2.2 实验任务2——用always块实现较复杂的组合逻辑电路2.2.1 实验要求(1)设计一个指令译码电路,对输入数据执行相应的操作,包括加、减、与、或和求反。

(2)运用always块设计一个8路数据选择器。

要求:每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位)或输入数据发生变化时,输出数据也相应变化。

2.2.2 模块的核心逻辑设计(1)指令译码电路always@(opcode or a or b) //电平敏感的always块,当输入数据a,b或控制信号opcode变化时,输出发生变化begincase(opcode)`plus: out=a+b; //控制信号为'plus时,输出等于a+b`minus: out=a-b; //控制信号为'minus时,输出等于a-b`band: out=a&b; //控制信号为'band时,输出等于a&b`bor: out=a|b; //控制信号为'bor时,输出等于a|b`unegate:out=~a; //控制信号为'unegate时,输出等于~adefault: out=8'hx; //未收到指令时,输出任意态endcase(2)8路数据选择器always@(ctl or a0 or a1 or a2 or a3 or a4 or a5 or a6 or a7) //电平敏感模块,控制信号ctl或输入a0~a7变化时,输出发生变化begincase(ctl)`ctl0: out=a0;`ctl1: out=a1;`ctl2: out=a2;`ctl3: out=a3;`ctl4: out=a4;`ctl5: out=a5;`ctl6: out=a6;`ctl7: out=a7; //控制端为ctl0~ctl7对应输出a0~a7default: out=4'dx; //未收到指令时,输出任意态endcase2.2.3 测试程序的核心逻辑设计(1)指令译码电路begina={$random}%256; //从0~255共256个数中随机生成一个数作为输入a b={$random}%256; //从0~255共256个数中随机生成一个数作为输入b opcode=3'h0; //控制信号设为初值0,即'plus,求和repeat(times) //repeat循环语句使控制及输入信号重复变化begin#100 a={$random}%256;b={$random}%256;opcode=opcode+1; //每一时钟到来时,输入a,b改变一随机数,控制信号+1end#100 $stop; //系统任务,暂停仿真以观察输出波形end(2)8路数据选择器begina0={$random}%16;a1={$random}%16;a2={$random}%16;a3={$random}%16;a4={$random}%16;a5={$random}%16;a6={$random}%16;a7={$random}%16; //从0~15中随机生成输入a0~a7ctl=3'd0; //控制端置ctl0repeat(times) //repeat语句重复改变输入begin#100 a0={$random}%16;a1={$random}%16;a2={$random}%16;a3={$random}%16;a4={$random}%16;a5={$random}%16;a6={$random}%16;a7={$random}%16; //随机生成a0~a7ctl=ctl+1; //控制端每次加1end#100 $stop;end2.2.4 仿真实验关键结果及其解释(1)指令译码电路图 6 指令译码电路波形指令译码电路输出波形如图所示。

相关文档
最新文档