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——简单组合逻辑...........................错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验任务2——简单时序逻辑...........................错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验小结.............................................错误!未定义书签。

实验二、条件语句和always过程块...............................错误!未定义书签。

实验任务1——利用条件语句实现计数分频时序电路.......错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验任务2——用always块实现较复杂的组合逻辑电路....错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验小结.............................................错误!未定义书签。

实验三、赋值、函数和任务......................................错误!未定义书签。

实验任务1——阻塞赋值与非阻塞赋值的区别.............错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验任务2——在Verilog HDL中使用函数...............错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验任务3——在Verilog HDL中使用任务...............错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验小结.............................................错误!未定义书签。

实验四、有限状态机............................................错误!未定义书签。

实验任务1——基于状态机的串行数据检测器.............错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验任务2——楼梯灯.................................错误!未定义书签。

实验要求.........................................错误!未定义书签。

模块的核心逻辑设计...............................错误!未定义书签。

测试程序的核心逻辑设计...........................错误!未定义书签。

仿真实验关键结果及其解释.........................错误!未定义书签。

实验小结.............................................错误!未定义书签。

实验一、简单组合逻辑和简单时序逻辑实验任务1——简单组合逻辑实验要求(1)设计一个两位数据比较器,比较两个数据a和b。

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

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

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

模块的核心逻辑设计(1)两位数据比较器assign equal=(a==b)?1:0; 错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

....以此类推。

(2)8路数据选择器图 1 8选1数据选择器波形图8路数据选择器输出波形如图7所示,控制端ctl为0~7时对应输出a0~a7。

实验小结通过实验二,我掌握了如下内容:1)if...else条件语句的使用。

2)case条件语句的使用实验三、赋值、函数和任务实验任务1——阻塞赋值与非阻塞赋值的区别实验要求本实验中两个模块"blocking"和"non_blocking"分别采用阻塞赋值和非阻塞赋值语句,从实验结果比较他们的区别。

模块的核心逻辑设计(1)阻塞赋值always@(posedge clk)beginb=a;c=b; ,a,b,c); ,a,b,c); ,a,b,c);end(3)再改变阻塞赋值程序的写法,比较二者的区别(测试程序仅改变调用的阻塞赋值模块)always@(posedge clk) b=a;always@(posedge clk) c=b;测试程序的核心逻辑设计将阻塞与非阻塞赋值模块用同一测试程序测试,比较其输出的不同。

begina=4'h3;$display("____________");#100 a=4'h7;$display("____________");#100 a=4'hf;$display("____________");#100 a=4'ha;$display("____________");#100 a=4'h2;$display("____________");#100 $display("___________"); 错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

12!+⨯=n n n result 错误!未指定顺序。

1331113==result 1642==result 错误!未指定顺序。

.else 和case 分支结构的使用。

(3)掌握了用repeat 语句实现for 循环结构的方法。

(4)掌握了在Verilog HDL 中使用任务的方法,回顾了排序算法。

实验四、有限状态机实验任务1——基于状态机的串行数据检测器实验要求设计一个串行数据监测器。

要求是:连续4个或4个以上为1时输出1,其他情况下输出0。

模块的核心逻辑设计always @(posedge clk)if (!rst)state<=Q0;elsestate<=nextstate; 错误!未指定顺序。

错误!未指定顺序。

错误!未指定顺序。

.INACTIVE : if ( in ) beginstate <= PENDING1 ;count<=0;end...PENDING1:beginif(!in) state<=INACTIVE;else if(count < NUM_JITTER-1)count <= count + 1 ;else if(count >=NUM_JITTER-1&&(in)) state=ACTIVE;else state<=ACTIVE;end //我尝试在INACTIVE状态下增加一个等待判断状态PENDING1,且输出采用always块给寄存器变量赋值的形式,但效果不佳,见结果分析部分测试程序的核心逻辑设计(1)基本任务仅测试一盏灯:initial begin // 短开关信号测试switch = 0 ;#100 switch = 1 ;#20 switch = 0 ; //第一个开关信号持续2s#100 switch = 1 ; //10s后第二个开关信号到来#30 switch = 0 ; //第二个开关信号持续3s#40 switch = 1 ; // 4s后又一开关信号到来#60 switch = 0 ;//长开关信号测试#50 switch = 1 ;# switch = 0 ; // 第一个开关信号持续# switch = 1 ; // 后第二个开关信号到来#90 switch = 0 ; //第二个开关信号持续9s#30 switch = 1 ; // 3s后第二个开关信号到来#10 switch = 0 ; //10s后开关信号结束//SUM = 330end三盏灯的测试只需在测试程序中调用3个单盏灯测试程序,且开关信号分为switch[1]~switch[3],表示灯的亮灭的输出变量分为light[1]~light[3]。

相关文档
最新文档