verilog有限状态机实验报告(附源代码)
Verilog实验报告(电子)参考模板
西安邮电大学Verilog HDL大作业报告书学院名称:电子工程学院学生姓名:专业名称:电子信息工程班级:实验一异或门设计一、实验目的(1)熟悉Modelsim 软件(2)掌握Modelsim 软件的编译、仿真方法(3)熟练运用Modelsim 软件进行HDL 程序设计开发二、实验内容my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真1、实验要求用Verilog HDL 程序实现一个异或门,Modelism仿真,观察效果。
2、步骤1、建立工程2、添加文件到工程3、编译文件4、查看编译后的设计单元5、将信号加入波形窗口6、运行仿真实验描述如下:module my_and(a_out,a1,a2);output a_out;input a1,a2;wire s1;nand(s1,a1,a2);nand(a_out,s1,1'b1);endmodulemodule my_not(n_out,b);output n_out;input b;nand(n_out,b,1'b1); endmodulemodule my_or(o_out,c1,c2);output o_out;input c1,c2;wire s1,s2;nand(s1,c1,1'b1);nand(s2,c2,1'b1);nand(o_out,s1,s2); endmodulemodule MY_XOR(z,x,y);output z;input x,y;wire a1,a2,n1,n2;my_not STEP01(n1,x);my_not STEP02(n2,y);my_and STEP03(a1,n1,y);my_and STEP04(a2,n2,x);my_or STEP05(z,a1,a2); Endmodulemodule stimulus;reg X,Y;wire OUTPUT;MY_XOR xor01(OUTPUT,X,Y);initialbegin$monitor($time,"X=%b,Y=%b --- OUTPUT=%b\n",X,Y,OUTPUT);endinitialbeginX = 1'b0; Y = 1'b0;#5 X = 1'b1; Y = 1'b0;#5 X = 1'b1; Y = 1'b1;#5 X = 1'b0; Y = 1'b1;endendmodule二、实验结果波形图:三、分析和心得通过这次的实验,我基本熟悉Modelsim 软件,掌握了Modelsim 软件的编译、仿真方法。
华中科技大学Verilog语言实验报告
专业:计算机科学与技术班级:CS1409学号:U**********名:***电话:158****5005邮件:*****************完成日期:2016.6.13 2016Verilog 语言·实验报告·计算机科学与技术学院目录1数据通路实验 (1)1.1实验目的 (1)1.2实验内容及要求 (1)1.3实验方案 (2)1.4实验步骤 (2)1.5故障及分析 (2)1.6仿真与结果 (3)1.7心得与体会 (4)2FSM实验 (5)2.1实验目的 (5)2.2实验内容及要求 (5)2.3实验方案 (6)2.4实验步骤 (6)2.5故障及分析 (7)2.6仿真与结果 (7)2.7心得与体会 (8)3意见和建议 (9)4附录 (10)1 数据通路实验1.1 实验目的综合应用掌握的简单组合电路和时序电路的设计方法,完成一个简单的数据通路的设计。
1.2 实验内容及要求1. 根据下图给出的数据通路(图中R0、R1和ACC是寄存器,+是加法器,其它则是多路选择器),完成相应的Verilog程序设计,图中数据线的宽度为8位,要求可以扩充至16位或者是32位;2. 根据下图给出的数据通路(图中SUM和NEXT是寄存器,Memory是存储器,+是加法器,==0是比较器,其它则是多路选择器),完成相应的Verilog程序设计,图中数据线的宽度为8位,要求可以扩充至16位或者是32位。
实验要求:程序必须自己编写,满足数据通路设计要求,综合结果正确。
1.3 实验方案根据要求,先把选择器、加法器、寄存器、比较器和存储器分模块编写,在主模块中根据数据通路调用即可。
题目中要求数据线宽度为8位,并且可以扩充至16位或32位,所以在前面定义WIDTH,利用parameter的参数传递功能来实现。
1.4 实验步骤1.分模块编写代码(见附录)2.运行综合Run Synthesis3.综合成功后检查RTL Analysis中的电路图Schematic1.5 故障及分析刚开始跑出来很多线是断的,后来发现是引脚对应部分的代码没有写完整。
verilog实验报告
verilog实验报告Verilog实验报告引言:Verilog是一种硬件描述语言(HDL),用于设计和模拟数字电路。
它是一种高级语言,能够描述电路的行为和结构,方便工程师进行数字电路设计和验证。
本实验报告将介绍我在学习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中的运算需求。
北航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位)的比较器。
实验五 有限状态机实验总结报告
实验五有限状态机实验总结报告0800220229 吴健伟第8周星期三第5大节一.实验目的:本次实验通过verilog硬件描述语言编写摩尔型有限状态机和米勒型有限状态机,掌握采用有限状态机产生各种控制信号的原理,熟悉如何选用合适的有限状态机进行电路设计,通过实验进一步了解原理图编辑方法和仿真方法。
二实验内容和步骤:1.利用verilog语言,设计一个采用摩尔型有限状态机实现的流水灯控制程序;源程序如下:module sled(clk,led);input clk;output[7:0]led;reg[7:0]led;reg[2:0]state;parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101,s6=3'b110,s7=3'b111;always @(posedge clk)case(state)s0:begin state<=s1;led<=8'b00000001;ends1:begin state<=s2;led<=8'b00000010;ends2:begin state<=s3;led<=8'b00000100;ends3:begin state<=s4;led<=8'b00001000;ends4:begin state<=s5;led<=8'b00010000;ends5:begin state<=s6;led<=8'b00100000;ends6:begin state<=s7;led<=8'b01000000;ends7:begin state<=s0;led<=8'b10000000;endendcaseendmodule仿真后的波形如下图所示:2.利用verilog语言,设计一个采用米勒型有限状态机实现的串行口发送程序;源程序如下图所示:module s_tx(clk,en,dain,txd);input clk,en;input[7:0] dain;output txd;reg[7:0] da_temp;reg txd;reg[3:0] state;parameter swait=4'b0000,star=4'b0001,s1=4'b0010,s2=4'b0011,s3=4'b0100,s4=4'b0101,s5=4'b0110,s6=4'b0111,s7=4'b1000,s8=4'b1001,stop=4'b1010;always@(posedge en)da_temp<=dain;always @(posedge clk)if(!en)beginstate<=swait;txd<=1;endelsecase(state)swait:begin state<=star;txd<=1;endstar:begin state<=s1;txd<=0;ends1:begin state<=s2;txd<=da_temp[7];ends2:begin state<=s3;txd<=da_temp[6];ends3:begin state<=s4;txd<=da_temp[5];ends4:begin state<=s5;txd<=da_temp[4];ends5:begin state<=s6;txd<=da_temp[3];ends6:begin state<=s7;txd<=da_temp[2];ends7:begin state<=s8;txd<=da_temp[1];ends8:begin state<=stop;txd<=da_temp[0];endstop:begin state<=stop;txd<=1;endendcaseendmodule3.利用verilog语言,设计一个采用米勒型有限状态机实现的串行口接受程序;源程序如下图所示:module s_rx(clk, dain,daout);input clk,dain;output[7:0] daout;reg[7:0] daout;reg[7:0] da_temp;reg[3:0] state;parameter star =4'b0000,s1=4'b0010,s2=4'b0011,s3=4'b0100,s4=4'b0101,s5=4'b0110,s6=4'b0111,s7=4'b1000,s8=4'b1001,stop=4'b1010;always@(negedge clk)case(state);star: if(dain)state<=star;elsestate<=s1;s1:begin state<=s2;da_temp[7]<=dain;ends2:begin state<=s3;da_temp[6] <=dain;ends3:begin state<=s4;da_temp[5] <=dain;ends4:begin state<=s5;da_temp[4] <=dain;ends5:begin state<=s6;da_temp[3] <=dain;ends6:begin state<=s7;da_temp[2] <=dain;ends7:begin state<=s8;da_temp[1] <=dain;ends8:begin state<=stop;da_temp[0] <=dain;endstop: if(!dain)state<=stop;elsebeginstate<=star;daout<=da_temp;endendcaseendmodule4.利用原理图编辑方法,将串行口发送和接受模块进行连接,实现完整的串行通信电路,并对电路进行仿真。
数字逻辑电路实验--基于有限状态机的密码锁
数电实验三报告姓名:xxx班级:xxx 学号:xxxx实验:基于有限状态机的密码锁一、实验目的学习如何通过Verilog HDL 编程,利用Basys3板上的开关控制七段数码管实现四位密码锁。
二、实验要求使用有限状态机设计一个 4 位密码锁。
利用 Basys3 板上的滑动开关 sw[0]到sw[9]分别代表 0‐9 十个数字,依次输入 4 位不重复的密码。
如果密码输入顺序与设计设置的一致,则显示大写字母P,否则显示大写字母F。
注意,即使密码输入错误,也必须在输入完整的 4 位密码输入,才能显示大写字母 F。
三、实验设计及内容1.基础版实验代码module doorlock(input CLK,input clr,input [9:0] sw,output reg [10:0] display_out);reg[3:0] present_state,next_state;parameter S0=4'b0000,S1=4'b0001,S2=4'b0010,S3=4'b0011,S4=4'b0100,E1=4'b0101,E2=4'b0110,E3=4'b0111,E4=4'b1000;reg [29:0] count;reg [9:0] keys=0;always @(posedge CLK or posedge clr)beginif (clr) count<=0;else count<=count+1;endassign clk_3=count[24];// ~3Hzalways @(posedge clk_3 or posedge clr) // STATE TRANSITIONbeginif (keys!=sw) keys <= sw;if (clr) present_state <= S0;else present_state <= next_state;end// Demo for Finite State Machine// the correct password is 0->1->2->3 (Switch sw[0]->sw[1]->sw[2]->sw[3] in order. always @(*)begincase (present_state)S0: beginif (~|keys[9:0]) next_state <=S0; // no key pressedelse if (keys[2]) next_state <=S1; // first valid key pressedelse next_state <=E1; // first invalid key pressedendS1: beginif (~|keys[9:3]&&~|keys[1:0]) next_state <=S1; // no key pressedelse if (keys[1]) next_state <=S2;// second valid key pressedelse next_state <=E2;// second invalid key pressedendS2: beginif (~|keys[9:3]&&~|keys[0]) next_state <=S2; // no key pressedelse if (keys[7]) next_state <=S3; // third valid key pressedelse next_state <=E3;// third invalid key pressedendS3: beginif (~|keys[9:8]&&~|keys[6:3]&&~|keys[0]) next_state <=S3; // no key pressedelse if (keys[3]) next_state <=S4;// fourth vaild key pressedelse next_state <=E4;// fourth invalid key pressedendS4: beginif (~|keys[9:8]&&~|keys[6:4]&&~|keys[0]) next_state <=S4; // no keypressedelse next_state <=E1; // fifth key pressed, but ignored *** endE1:beginif (keys!=sw) next_state <=E2; // second invalid key pressedelse next_state <=E1; // no key pressedendE2:beginif (keys!=sw) next_state <=E3; // third invalid key pressedelse next_state <=E2; // no key pressedendE3:beginif (keys!=sw) next_state <=E4; // fourth invalid key pressedelse next_state <=E3; // no key pressedendE4: next_state <=E4; // the additional keys are ALL ignored ***default: next_state <=S0;endcaseendalways @(*) // indicate the number of inputs and display the tag begincase(present_state)S4: display_out<=11'b0111_0011000;// P in left-most segmentE4: display_out<=11'b1110_0111000;// F in right-most segmentS0: display_out<=11'b1001_0011100;// oo in the middle segmentsS1,E1: display_out<=11'b1001_0111111;// confirm first inputS2,E2: display_out<=11'b1001_0011111;// confirm second inputS3,E3: display_out<=11'b1001_0011110;// confirm third inputdefault:display_out<=11'b1111_1111111; // no displayendcaseendendmodule2.进阶版实验代码module doorlock2(input CLK,input clr,input [9:0] sw,output reg [10:0] display_out);reg[3:0] present_state,next_state;reg [19:0]count1=0;reg [2:0] sel=0;parameter S0= 4'b0000,S1=4'b0001,S2=4'b0010,S3=4'b0011,S4=4'b0100, S01=4'b1001,S02=4'b1010,S03=4'b1011,E1=4'b0101,E2=4'b0110,E3=4'b0111,E4=4'b1000;parameter T1MS=50000,T2MS=20000_0000;reg [29:0] count;reg [32:0] count2=0;reg [9:0] keys=0;reg flag;always @(posedge CLK or posedge clr)beginif (clr)begincount<=0;endelse count<=count+1;endwire clk_3;assign clk_3=count[24];// ~3Hzalways @(posedge clk_3 or posedge clr) // STATE TRANSITIONbeginif (keys!=sw) keys <= sw;if (clr) present_state <= S0;else present_state <= next_state;endalways@(posedge CLK or posedge clr)beginif(present_state == S4)beginif(count2<T2MS)begincount2<=count2+1;flag<=1'b0;endelsebeginflag<=1'b1;endendif(clr) count2<=0;end// Demo for Finite State Machine// the correct password is 0->1->2->3 (Switch sw[0]->sw[1]->sw[2]->sw[3] in order. always @(*)begincase (present_state)S0: beginif (~|keys[9:0]) next_state <=S0; // no key pressedelse if (keys[2]) next_state <=S1; // first valid key pressedelse next_state <=E1; // first invalid key pressedendS1: beginif (~|keys[9:3]&&~|keys[1:0]) next_state <=S1; // no key pressed//else if (!sw) next_state <=S01;// second valid key pressedelse if(keys[1]&&keys[2]) next_state<=S2;else next_state <=E2;// second invalid key pressedendS01:beginif(!sw) next_state<=S01;else if(sw[2]) next_state<=S2;else next_state<=E2;endS2: beginif (~|keys[9:3]&&~|keys[0]) next_state <=S2; // no key pressed//else if (!sw) next_state <=S02; // third valid key pressedelse if (keys[2]&&keys[1]&&keys[3]) next_state <=S3;else next_state<=E3;// third invalid key pressedendS02: beginif(!sw) next_state<=S02;else if(sw[1]) next_state<=S3;else next_state<=E3;endS3: beginif (keys[1]&&keys[2]&&keys[3]) next_state <=S3; // no key pressed else if (!sw[3]) next_state <=S03;// fourth vaild key pressedelse next_state <=E4;// fourth invalid key pressedendS03:beginif(~|keys[9:3]&&~|keys[0]) next_state<=S03;else if(keys[3]) next_state<=S4;else next_state<=E4;endS4: beginif (~|keys[9:4]&&~|keys[0]) next_state <=S4; // no key pressedelse next_state <=E1; // fifth key pressed, but ignored *** endE1:beginif (keys!=sw) next_state <=E2; // second invalid key pressedelse next_state <=E1; // no key pressedendE2:beginif (keys!=sw) next_state <=E3; // third invalid key pressedelse next_state <=E2; // no key pressedendE3:beginif (keys!=sw) next_state <=E4; // fourth invalid key pressedelse next_state <=E3; // no key pressedendE4: next_state <=E4; // the additional keys are ALL ignored ***default: next_state <=S0;endcaseendalways@(posedge CLK)begincount1<=count1+1;if(count1==T1MS)begincount1<=0;sel<=sel+1;if(sel==4)sel<=0;endendalways @(posedge CLK) // indicate the number of inputs and display the tagbegincase(present_state)S0: begincase(sel)0:display_out<=11'b0111_0101000;1:display_out<=11'b1011_0110000;2:display_out<=11'b1101_1000100;3:display_out<=11'b1110_0110110;default:display_out<=11'b1111_1111111;endcaseendS1: begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1110111;2:display_out<=11'b1101_1110111;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseend // confirm first inputS2: begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_1110111;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseend // confirm second inputS3: begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_0000110;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseend // confirm third inputS4: beginif(!flag)begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_0000110;3:display_out<=11'b1110_0000110;default:display_out<=11'b1111_1111111;endcaseendelse display_out<= 11'b0111_0011000 ;end // P in left-most segmentS01:begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1110111;2:display_out<=11'b1101_1110111;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseendS02:begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_1110111;3:display_out<=11'b1110_1110111; default:display_out<=11'b1111_1111111;endcaseendS03: begincase(sel)0:display_out<=11'b0111_0010010;1:display_out<=11'b1011_1001111;2:display_out<=11'b1101_0000110;3:display_out<=11'b1110_1110111;default:display_out<=11'b1111_1111111;endcaseendE1: display_out<=11'b0111_0111000;E2: display_out<=11'b1011_0111000;E3: display_out<=11'b1101_0111000;E4: display_out<=11'b1110_0111000;// F in right-most segment default:display_out<=11'b1111_1111111; // no displayendcaseendendmodule约束文件代码:## Clock signalset_property PACKAGE_PIN W5 [get_ports CLK]set_property IOSTANDARD LVCMOS33 [get_ports CLK]## Switchesset_property PACKAGE_PIN V17 [get_ports {sw[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[0]}]set_property PACKAGE_PIN V16 [get_ports {sw[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[1]}]set_property PACKAGE_PIN W16 [get_ports {sw[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[2]}]set_property PACKAGE_PIN W17 [get_ports {sw[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[3]}]set_property PACKAGE_PIN W15 [get_ports {sw[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[4]}]set_property PACKAGE_PIN V15 [get_ports {sw[5]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[5]}]set_property PACKAGE_PIN W14 [get_ports {sw[6]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[6]}]set_property PACKAGE_PIN W13 [get_ports {sw[7]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[7]}]set_property PACKAGE_PIN V2 [get_ports {sw[8]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[8]}]set_property PACKAGE_PIN T3 [get_ports {sw[9]}] set_property IOSTANDARD LVCMOS33 [get_ports {sw[9]}]## sw[15]set_property PACKAGE_PIN R2 [get_ports {clr}]set_property IOSTANDARD LVCMOS33 [get_ports {clr}]## 7-seg displayset_property PACKAGE_PIN W4 [get_ports {display_out[10]}]set_property PACKAGE_PIN V4 [get_ports {display_out[9]}]set_property PACKAGE_PIN U4 [get_ports {display_out[8]}]set_property PACKAGE_PIN U2 [get_ports {display_out[7]}]set_property PACKAGE_PIN W7 [get_ports {display_out[6]}]set_property PACKAGE_PIN W6 [get_ports {display_out[5]}]set_property PACKAGE_PIN U8 [get_ports {display_out[4]}]set_property PACKAGE_PIN V8 [get_ports {display_out[3]}]set_property PACKAGE_PIN U5 [get_ports {display_out[2]}]set_property PACKAGE_PIN V5 [get_ports {display_out[1]}]set_property PACKAGE_PIN U7 [get_ports {display_out[0]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[9]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[8]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[7]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[6]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[5]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[4]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[3]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[1]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[2]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[0]}]set_property IOSTANDARD LVCMOS33 [get_ports {display_out[10]}]四、实验结果1基础结果图2.进阶结果图进阶实验成品效果说明:进阶视频演示:正确示范:密码输入错误示范:五、实验总结1.通过本次实验了解了时钟信号的作用原理以及对时序电路的控制机理。
有现状态机设计实验报告
湖南科技学院综合设计性实验报告实验名称:有限状态机的设计实验项目性质:设计性所涉及课程:微机原理与接口技术计划课时:2课时系别:电子与信息工程系班级:通信工程1302班学生姓名:许露平(201308002216)指导教师:蒋恩松湖南科技学院电子与信息工程系一、实验目的掌握Verilog HDL描述有限状态机的设计方法,能够进行简单的数字系统设计。
二、实验原理有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。
三、实验内容“110101”序列检测码,在连续输入的一串数据中,判断是否包含“110101”序列。
要求:画出状态转移图,编码实现,功能仿真。
1、分析检测110101如果采取进行每位二进制数检测的话则需要列出6种状态,并且由于这种检测的关键在于正确码的收到必须是连续的,这就要求必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测,检测工作比较繁忙。
如果把110101拆成11、01、01,则只有2种状态,若考虑00总共有3种状态,即S0=00,S1=11,S2=01。
用Z记录检测到110101序列的个数,用A,B表示输入的序列,则可根据分析的设计思路画出状态图如下所示:2、Verilog HDL设计代码如下:module jiance(S,clk,Z,reset);input reset,clk;input [1:0] S;output Z;reg Z;parameter S0=2'b00,S1=2'b11,S2=2'b01; reg [1:0] state;always @(posedge clk)beginif(reset)beginstate=S0;Z=0;endelsebegincase(state)S0:beginif(S==2'b11)beginstate=S1;Z=0;endelsebeginstate=S0;Z=0;endendS1:beginif(S==2'b01)beginstate=S2;Z=0;endelsebeginstate=S0;Z=0;endendS2:beginif(S==2'b01)beginstate=S2;Z=1;endelsebeginstate=S0;Z=0;endenddefault: beginstate=S0;Z=0;endendcaseendendendmodule四、实验结果实验结果:(1)给出仿真图形(最好打印)波形仿真如图所示:仿真状态机结果如下图所示:状态机图状态机电路图(2)根据仿真图形,给出你的结论。
verilog实验报告 - 程超
西安邮电學院基于Verilog的数字电路模拟实验系部名称:通信与信息工程学院学生姓名:张宏扬专业名称:通信工程班级:通工0809学号:03081469(01)时间:2010年12月20号实验题目门级建模仿真实验一、实验内容设计的一个带有清零的顺序输出结果的计数器,q从0计数到15二、技术规范1、输入引脚:reset,clk;输出引脚:q。
2、功能:这时也个具有清零的计数器,从0到15输出的。
在其中用到了T触发器和D触发器来实现它的功能。
三、实验步骤1、在modulesim软件中对设计模块和验证模块进行书写和编译;2、对编译好的模块进行仿真。
四、源代码://脉动进位计数器顶层模块module ripple_carry_counter(q,clk,reset);output [3:0]q;input clk,reset;//生成了4个T触发器(T_FF)的实例,每个都有自己的名字T_FF tff0(q[0],clk,reset);T_FF tff1(q[1],q[0],reset);T_FF tff2(q[2],q[1],reset);T_FF tff3(q[3],q[2],reset);endmodule//触发器T_FFmodule T_FF(q,clk,reset);output q;input clk,reset;wire d;D_FF dff0(q,d,clk,reset);not n1(d,q); //非门(not)是Verilog语言的内置原语部件(primitive)endmodule//D触发器(D_FF)//带异步复位的D触发器(D_FF)module D_FF(q,d,clk,reset);output q;input d,clk,reset;reg q;//可以有许多种新结构,不考虑这些结构的功能,只需要注意设计块是如何以自顶向下的方式编写的always @(posedge reset or negedge clk)if (reset)q<= 1'b0;elseq<= d;endmodulemodule stimulus;reg clk;reg reset;wire [3:0]q;//引用已经设计好的模块实例ripple_carry_counter r1(q,clk,reset);//控制驱动设计块的时钟信号,时钟周期为10个时间单位initialclk = 1'b0; //把clk设置为0always#5 clk = ~clk; //每5个时间单位时钟翻转一次//控制驱动设计块的reset信号initialbeginreset = 1'b1;#15 reset = 1'b0;#180 reset = 1'b1;#10 reset = 1'b0;#20 $finish; //终止仿真end//监视输出initial$monitor($time, "Output q = %d",q);endmodule五、仿真结果及分析实验题目 RS锁存器一、实验内容带有延迟的RS锁存器,写出其带有延迟的Verilog门级描述。
北航verilog实验报告
北京航空航天大学电子电路设计数字部分实验报告实验一简单组合逻辑设计 (2)实验二简单分频时序逻辑电路的设计 (3)一.实验目的:1.掌握最基本组合逻辑电路的实现方法。
(3)2.学习时序电路测试模块的编写。
(3)3.学习综合和不同层次的仿真。
(3)实验三利用条件语句实现计数分频时序电路 (5)实验四阻塞赋值与非阻塞赋值的区别 (7)实验五用always块实现较复杂的组合逻辑: (10)实验六在Verilog HDL中使用函数 (12)实验七在Verilog HDL中使用任务(task) (14)实验八利用有限状态机进行时序逻辑的设计 (17)实验九楼梯灯 (19)实验思考与总结 (29)学院:学号:姓名:实验一简单组合逻辑设计一.实验目的:1.掌握基本组合逻辑电路的实现方法。
2.初步了解两种基本组合逻辑电路的生成方法。
3.学习测试模块的编写。
4.通过综合和布局布线了解不同层次仿真的物理意义。
二.实验设备:安装Modelsim-6.5c的PC机。
三.实验内容:描述一个可综合的数据比较器,比较数据a 、b的大小,若相同,则给出结果1,否则给出结果0四.综合仿真结果实验二简单分频时序逻辑电路的设计一.实验目的:1.掌握最基本组合逻辑电路的实现方法。
2.学习时序电路测试模块的编写。
3.学习综合和不同层次的仿真。
二.实验设备:安装Modelsim-6.5c的PC机。
三.实验内容:用always块和@(posedge clk)或@(negedge clk)的结构表述一个1/2分频器的可综合模型,观察时序仿真结果四.实验代码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;endendmodule`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.掌握条件语句在简单时序模块设计中的使用。
Verilog 实验报告
Verilog 实验报告一、实验目的本次 Verilog 实验的主要目的是通过实际编写代码和进行仿真,深入理解 Verilog 语言的基本语法、逻辑结构和时序特性,掌握数字电路的设计方法和实现过程,并能够运用Verilog 实现简单的数字逻辑功能。
二、实验环境本次实验使用的软件工具是 Xilinx Vivado 20192,硬件平台是Xilinx Artix-7 开发板。
三、实验内容(一)基本逻辑门的实现1、与门(AND Gate)使用 Verilog 语言实现一个两输入的与门。
代码如下:```verilogmodule and_gate(input a, input b, output out);assign out = a & b;endmodule```通过编写测试激励文件对该模块进行仿真,验证其逻辑功能的正确性。
2、或门(OR Gate)同样实现一个两输入的或门,代码如下:```verilogmodule or_gate(input a, input b, output out);assign out = a | b;endmodule```3、非门(NOT Gate)实现一个单输入的非门:```verilogmodule not_gate(input a, output out);assign out =~a;endmodule```(二)组合逻辑电路的实现1、加法器(Adder)设计一个 4 位的加法器,代码如下:```verilogmodule adder_4bit(input 3:0 a, input 3:0 b, output 4:0 sum);assign sum = a + b;endmodule```2、减法器(Subtractor)实现一个 4 位的减法器:```verilogmodule subtractor_4bit(input 3:0 a, input 3:0 b, output 4:0 diff);assign diff = a b;endmodule```(三)时序逻辑电路的实现1、计数器(Counter)设计一个 4 位的计数器,能够在时钟上升沿进行计数,代码如下:```verilogmodule counter_4bit(input clk, output 3:0 count);reg 3:0 count_reg;always @(posedge clk) begincount_reg <= count_reg + 1;endassign count = count_reg;endmodule```2、移位寄存器(Shift Register)实现一个 4 位的移位寄存器,能够在时钟上升沿进行左移操作:```verilogmodule shift_register_4bit(input clk, input rst, output 3:0 data_out);reg 3:0 data_reg;always @(posedge clk or posedge rst) beginif (rst)data_reg <= 4'b0000;elsedata_reg <={data_reg2:0, 1'b0};endassign data_out = data_reg;endmodule```四、实验结果与分析(一)基本逻辑门的结果通过仿真,与门、或门和非门的输出结果与预期的逻辑功能完全一致,验证了代码的正确性。
verilog有限状态机实验报告(附源代码)
有限状态机实验报告一、实验目的●进一步学习时序逻辑电路●了解有限状态机的工作原理●学会使用“三段式”有限状态机设计电路●掌握按键去抖动、信号取边沿等处理技巧二、实验内容用三段式有限状态机实现序列检测功能电路a)按从高位到低位逐位串行输入一个序列,输入用拨动开关实现。
b)每当检测到序列“1101”(不重叠)时,LED指示灯亮,否则灭,例如i.输入:1 1 0 1 1 0 1 1 0 1ii.输出:0 0 0 1 0 0 0 0 0 1c)用八段数码管显示最后输入的四个数,每输入一个数,数码管变化一次d)按键按下的瞬间将拨动开关状态锁存i.注意防抖动(按键按下瞬间可能会有多次的电平跳变)三、实验结果1.Rst_n为0时数码管显示0000,led灯不亮,rst_n拨为1,可以开始输入,将输入的开关拨到1,按下按钮,数码管示数变为0001,之后一次类推分别输入1,0,1,按下按钮后,数码管为1101,LED灯亮,再输入1,LED灯灭,之后再输入0,1(即共输入1101101使1101重叠,第二次LED灯不亮),之后单独输入1101,LED灯亮2.仿真图像刚启动时使用rst_n一段时间后其中Y代表输出,即控制led灯的信号,sel表示数码管的选择信号,seg表示数码管信号四、实验分析1、实验基本结构其中状态机部分使用三段式结构:2、整体结构为:建立一下模块:Anti_dither.v输入按键信号和时钟信号,输出去除抖动的按键信号生成的脉冲信号op这一模块实现思路是利用按钮按下时会持续10ms以上而上下抖动时接触时间不超过10ms来给向下接触的时间计时,达到上限时间才产生输出。
Num.v输入op和序列输入信号A,时钟信号clk和复位信号,复位信号将num置零,否则若收到脉冲信号则将num左移一位并将输入存进最后一位。
输出的num即为即将在数码管上显示的值Scan.v输入时钟信号,对其降频以产生1ms一次的扫描信号。
Verilog 实验报告
练习三利用条件语句实现计数分频时序电路实验目的:1.掌握条件语句在简单时序模块设计中的使用;2.学习在Verilog模块中应用计数器;3.学习测试模块的编写、综合和不同层次的仿真。
实验理论:实验用到Verilog HDL提供的条件语句供分支判断,以描述较复杂的时序关系。
在可综合风格的Verilog HDL模型中,常用的条件语句有if-else和case-endcase两种结构。
两者相比,if-else 用于不是很复杂的分支关系,实际编写可综合风格的模块,特别是用状态机构成的模块时,更常用的是case-endcase风格的代码。
在多重if 嵌套语句中,else 与前面最近的if 相对应(即与前面最近的if 组成一对if-else 语句。
为确保程序的可读性和语句的对应性,请使用begin…end 块语句。
下面给出的范例也是一个可综合风格的分频器,可将10MB的时钟分频为500KB的时钟。
基本原理与1/2分频器是一样的,但是需要定义一个计数器,对于实现占空比为1:1分频,首先进行上升沿触发进行模J计数,计数从零开始,到19进行输出时钟翻转,然后经过19再次进行翻转得到一个占空比非1:1分频时钟。
再者同时进行下降沿触发的模19计数,到和上升沿过19时,输出时钟再次翻转生成占空比非1:1分频时钟。
两个占空比非1:1分频时钟相或运算,得到占空比为1:1分频时钟。
以准确获得1/20分频。
Verilog模块结构完全嵌在module和endmodule声明语句之间;每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。
模块源代码://------------------ fdivision.v-------------------//module fdivision(RESET,F10MB,F500KB);input F10MB,RESET; output F500KB; //输出为500KB的输出端reg F500KB; //定义一位寄存器reg [7:0]j; //定义数据宽为8的计数寄存器jalways @(posedge F10MB)if(! RESET) //当RESET无效时,对输出端和计数器初始化beginF500KB<=0;j<=0;endelsebeginif(j==19) //当j=19时,将时钟翻转,并将计数器清零beginj<=0;F500KB=~F500KB;endelsej<=j+1; //当j不等于19时使j加1endendmodule测试模块常见的形式:module t;reg …; //被测模块输入/输出变量类型定义wire…; //被测模块输入/输出变量类型定义initial begin …; …; …; end … …//产生测试信号always #delay begin …; end … …//产生测试信号Testedmd m(.in1(ina), .in2(inb), .out1(outa), .out2(outb) );//被测模块的实例引用initial begin ….; ….; …. end //记录输出和响应endmodule测试模块源代码:`timescale 1ns/100ps`define clk_cycle 50module division_Top;reg F10MB,RESET;wire F500KB_clk;always #`clk_cycle F10MB=~F10MB;initialbeginRESET=1;F10MB=0;#100 RESET=0;#100 RESET=1;#10000 $stop;endfdivision fdivision (.RESET(RESET),.F10MB(F10MB),.F500KB(F500_clk));endmodule仿真结果:练习:利用10MB的时钟,设计一个单周期形状的周期波形。
verilog课程设计实验报告
verilog课程设计实验报告一、教学目标本课程旨在通过Verilog硬件描述语言的学习,让学生掌握数字电路设计的自动化工具,理解并实践硬件描述语言在数字系统设计中的应用。
通过本课程的学习,学生应达到以下目标:1.知识目标:–理解Verilog的基本语法和结构。
–掌握Verilog中的模块化设计方法。
–学习常用的Verilog描述技巧,包括逻辑门级建模、行为级建模和结构级建模。
2.技能目标:–能够运用Verilog语言进行简单的数字电路设计。
–学会使用至少一种Verilog仿真工具进行电路功能验证。
–能够阅读和理解Verilog代码,进行简单的代码优化。
3.情感态度价值观目标:–培养学生的团队合作意识,在实验报告中能够体现分工合作的精神。
–培养学生的问题解决能力,鼓励学生在遇到问题时积极寻找解决方案。
–培养学生对新技术的好奇心和学习兴趣,激发他们对电子工程领域的热爱。
二、教学内容依据教学目标,本课程的教学内容将围绕Verilog语言的基础知识、实践应用和项目设计展开。
教学大纲安排如下:1.第一部分:Verilog基础知识(2周)–介绍Verilog的背景和基本概念。
–详细讲解Verilog的数据类型、运算符和语句。
2.第二部分:模块化设计(2周)–讲解模块的定义和封装。
–实践模块的端口声明和模块实例化。
3.第三部分:数字电路的Verilog描述(2周)–通过实例教学,掌握逻辑门、触发器等基本组件的Verilog建模。
–学习组合逻辑和时序逻辑的设计方法。
4.第四部分:仿真与测试(1周)–学习使用仿真工具进行电路功能验证。
–理解并实践测试台(testbench)的编写。
5.第五部分:项目设计(3周)–小组合作完成一个较为复杂的数字系统设计项目。
–包括系统模块的划分、编码、仿真和测试。
三、教学方法为了提高学生的学习效果,将采用多种教学方法相结合的方式进行授课:1.讲授法:用于讲解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位)的比较器。
Verilog实验报告实验报告格式要求
实验报告格式要求一、实验报告内容包括:(1)实验名称。
(2)实验目的。
(3)实验仪器及编号。
写明仪器名称、型号、编号。
(4)实验原理。
简单表达有关实验原理(包括电路图或光路图或实验装置示用意)及测量中依据的的公式,式中各量的物理含义及单位,公式成立所应知足的实验条件等。
(5)实验内容及步骤。
依如实验内容及实际的实验进程写明关键步骤和平安注意要点。
(6)实验观测记录。
记录原始测量数据、图形等有关原始量,形式上要求整齐标准。
(7)数据处置结果。
依如实验要求,采纳适合的方式进行数据处置,误差分析,最后写出实际结果。
(8)小结或讨论。
内容不限。
能够是实验中的现象分析,对实验关键问题的体会,实验的收成和建议,也可解答试探题。
二、书写顺序(1)到(5)是进行实验预习时就应该完成的。
(6)在实验中完成。
做完实验后再在预习报告基础上完成(7)(8)两项。
完成一个实验,确实是一次最大体的科研训练,从预习到写出一个实验报告,每一步都有极为丰硕的学习内容,要踊跃试探,认真对待。
实验(一)简单的组合逻辑设计实验日期 2021-10-31 同组者姓名一、实验目的[1] 把握大体组合逻辑电路的实现方式[2] 初步了解两种大体组合逻辑电路的生成方式[3] 学习测试模块的编写[4] 通过综合和布局布线了解不同层次仿真的物理意义二、实验仪器运算机、FPGA开发板三、实验内容[1] 在ISE软件环境中进行一次完整的设计流程,并在FPGA开发板上实现与门的功能。
[2] 完成一个可综合的数据比较器的程序。
[3] 完成数据比较器的测试模块。
[4] 发挥部份:设计一个多位(2位)的数据比较器并在FPGA开发板上实现该比较器。
四、实验步骤、分析及结果(在下面写出你的代码)代码:module compare(input a,input b,output c);assign c=a&b;endmodule结果如下图:拓展代码如下:module compare( Y ,A ,B ); input [1:0] A ;input [1:0] B ;output reg [1:0] Y ;always @ (A or B )beginif ( A > B )Y <= 3'b01; else if ( A == B) Y <= 3'b10; elseY <= 3'b11; endendmodule结果如下:指导师(签名)时刻实验(二)简单分频时许逻辑电路的设计实验日期 2021-11-7 同组者姓名一、实验目的[1] 把握最大体时序电路的实现方式。
verlog实验报告
Verilog实验报告1. 引言本实验旨在通过使用Verilog硬件描述语言来实现一个简单的电路设计。
Verilog是一种用于描述电路行为和结构的编程语言,可以用于设计和仿真数字电路。
本实验将通过逐步的思考过程,详细说明实验的设计和实现。
2. 设计思路首先,我们需要确定电路的功能和需要实现的功能。
在这个例子中,我们将设计一个简单的4位加法器电路。
接下来,我们需要创建一个顶层模块,该模块将包含所需的输入和输出端口,并将其他模块连接在一起。
我们可以使用以下代码创建一个顶层模块:module top_module(input [3:0] a, input [3:0] b, output [3:0] sum);// 端口声明// 内部逻辑实现endmodule然后,我们可以创建一个子模块,该模块将执行实际的加法操作。
我们可以使用以下代码创建一个加法器模块:module adder(input [3:0] a, input [3:0] b, output [3:0] sum);// 加法操作实现endmodule在加法器模块中,我们可以使用位级操作符+来执行实际的加法运算。
我们可以使用以下代码实现加法操作:assign sum = a + b;最后,我们将在顶层模块中实例化加法器模块,并将输入和输出端口连接在一起。
我们可以使用以下代码实现实例化和连接:adder adder_instance(.a(a), .b(b), .sum(sum));3. 实验结果在完成上述步骤后,我们可以编译和仿真我们的Verilog代码。
可以使用常见的Verilog仿真器(如ModelSim)来进行仿真。
在仿真期间,我们可以为输入端口输入不同的二进制数,并观察输出端口是否正确计算了输入数的和。
通过逐步调试和测试,我们可以确保电路的正确性。
4. 总结通过本实验,我们学习了使用Verilog硬件描述语言设计和实现数字电路。
我们了解了Verilog的基本语法和结构,并通过实例演示了设计一个简单的4位加法器电路的过程。
有限状态机的Verilog设计与研究
谢谢观看
end
endcase
end
end
endmodule
该有限状态机使用三个寄存器来存储当前的状态,并在每个时钟周期检查输入 信号和当前状态来确定下一个状态。如果接收到读取信号,它将输出与输入相 同的数据,并在下一个时钟周期回到空闲状态。如果接收到写入信号,它也会 输出与输入相同的数据,并在下一个时钟周期回到空闲状态。该有限状态机的 设计是可综合的,因为它只包含基本的逻辑门和触发器,并且它的输出只依赖 于当前的状态和输入信号。
end else begin state <= STANDBY;
end
end
endcase
end
end
assign led = state;
endmodule
有限状态机的测试
为了确保有限状态机的正确性,需要对Verilog设计的有限状态机进行测试。 以下是测试过程中需要注意的几点:
end else begin state <= IDLE;
end
end
FLASH: begin
if (flash_timeout) begin state <= STANDBY;
end else begin state <= FLASH;
end
end
STANDBY: begin
if (activate) begin state <= FLASH;
有限状态机的Verilog设计与研究
01 引言
目录
02 有限状态机的设计
03 reg [1:0] state;
05
end else begin
04
if (rst) begin
06
深圳大学Verilog实验三状态机实验报告
always@(posedgeclk)
data={data[22:0],data[23]};
initial begin
clk= 0;
rst= 1;
#2rst=0;
#30rst=1;
data='b0111_1111_1111_0011_0011;
#500 $stop;
regclk;
regrst;
wire x, z;
wire [3:0] count;
wire [2:0] state;
reg[23:0] data;
zuangtaijiuut(
.x(x),
.z(z),
.count(count),
.clk(clk),
.rst(rst),
.state(state)
);
assign x=data[23];
begin state<=BG;count<=0; end
else
case(state)
BG: if(x==1)
begin state<=A; count<=count+1; end
else
begin state<=BG; count<=0; end
A : if(x==1)
begin state<=B; count<=count+1; end
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
end
endmodule
—————————————————————————————————
4、保存代码,仿真,并查看仿真结果。
四、实验结果:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有限状态机实验报告一、实验目的●进一步学习时序逻辑电路●了解有限状态机的工作原理●学会使用“三段式”有限状态机设计电路●掌握按键去抖动、信号取边沿等处理技巧二、实验内容用三段式有限状态机实现序列检测功能电路a)按从高位到低位逐位串行输入一个序列,输入用拨动开关实现。
b)每当检测到序列“1101”(不重叠)时,LED指示灯亮,否则灭,例如i.输入:1 1 0 1 1 0 1 1 0 1ii.输出:0 0 0 1 0 0 0 0 0 1c)用八段数码管显示最后输入的四个数,每输入一个数,数码管变化一次d)按键按下的瞬间将拨动开关状态锁存i.注意防抖动(按键按下瞬间可能会有多次的电平跳变)三、实验结果1.Rst_n为0时数码管显示0000,led灯不亮,rst_n拨为1,可以开始输入,将输入的开关拨到1,按下按钮,数码管示数变为0001,之后一次类推分别输入1,0,1,按下按钮后,数码管为1101,LED灯亮,再输入1,LED灯灭,之后再输入0,1(即共输入1101101使1101重叠,第二次LED灯不亮),之后单独输入1101,LED灯亮2.仿真图像刚启动时使用rst_n一段时间后其中Y代表输出,即控制led灯的信号,sel表示数码管的选择信号,seg表示数码管信号四、实验分析1、实验基本结构其中状态机部分使用三段式结构:2、整体结构为:建立一下模块:Anti_dither.v输入按键信号和时钟信号,输出去除抖动的按键信号生成的脉冲信号op这一模块实现思路是利用按钮按下时会持续10ms以上而上下抖动时接触时间不超过10ms来给向下接触的时间计时,达到上限时间才产生输出。
Num.v输入op和序列输入信号A,时钟信号clk和复位信号,复位信号将num置零,否则若收到脉冲信号则将num左移一位并将输入存进最后一位。
输出的num即为即将在数码管上显示的值Scan.v输入时钟信号,对其降频以产生1ms一次的扫描信号。
Trigger.v这一模块即为状态机模块,按三段式书写。
整个模块的输入为时钟信号,脉冲信号,序列输入变量,复位信号,输出LED灯控制信号Y。
第一段是状态转换模块,为时序逻辑电路,功能是描述次态寄存器迁移到现态寄存器。
即如果收到复位信号将现态置零,否则将上次得到的next_state赋给current_state。
第二段是描述状态转移的条件判断,即对于输入的现态,判定对于不同的输入A(或无输入),下一状态将怎么确定。
为组合逻辑电路。
第三段是格式化描述次态寄存器输出,即处理输出信号。
即对于不同的现态和输入得到输出。
Display.v这一模块输入已经得到的结果,来产生显示。
输入时钟信号,扫描信号,复位信号和之前得到的num和Y输出,来得到数码管的显示sel和seg以及LED灯的亮灭。
其中对得到的扫描信号再次分频,得到1/4的频率分别显示num的四位。
Top.v综合各模块。
测试代码:用forever使时钟动起来后,先复位,然后模拟各输出和按钮信号的短时抖动,并将上述过程放入forever中重复进行。
五、附录源代码:Anti_dither.vmodule anti_dither(input clk,input btn,input rst_n,output reg op);reg [19:0] cnt;reg oi;initialbeginop=0;cnt=0;oi=0;endalways@(posedge clk)beginif(op==1)op=0;if(btn!=oi)beginif(cnt==20'd1000_000)cnt=0;elsebegincnt=cnt+1;if(cnt==20'd999_999)beginoi=btn;if(btn==1)op=1;endendendelsecnt=0;endendmodulenum.vmodule num(input op,input A,input clk,input rst_n,output reg [3:0] num);initial num=4'b0;always@(posedge clk)if(~rst_n)num=4'b0;else if(op)beginnum[3]=num[2];num[2]=num[1];num[1]=num[0];num[0]=A;endendmodulescan.vmodule scan(input clk,output reg scan);reg [16:0] cnt_scan;initial cnt_scan=17'b0;initial scan=0;always@(posedge clk)beginif(cnt_scan==17'd99_999)begincnt_scan=0;scan=17'b1;endelsebegincnt_scan=cnt_scan+17'b1;scan=17'b0;endendendmoduletrigger.vmodule trigger(input clk,input op,input A,input rst_n,output reg Y//output reg [2:0] NQ,//output reg [2:0] Q);reg [2:0] Q;reg [2:0] NQ;always@(posedge clk or negedge rst_n)beginif(~rst_n)Q=3'b0;elseQ=NQ;endalways@(*)beginif(~rst_n)NQ=3'b0;elsebeginif(op)case(Q)3'b000:beginif(A)NQ=3'b001;elseNQ=3'b000;end3'b001:beginif(A)NQ=3'b010;elseNQ=3'b000;end3'b010:beginif(A)NQ=3'b010;elseNQ=3'b011;end3'b011:beginif(A)NQ=3'b100;elseNQ=3'b000;end3'b100:beginif(A)NQ=3'b001;elseNQ=3'b000;enddefault:;endcase//else ifelseNQ=Q;endendalways@(posedge clk or negedge rst_n)beginif(~rst_n)Y=0;else if(NQ==3'b100)Y=1;elseY=0;endendmoduledisplay.vmodule display(input scan,input clk,input rst_n,input [3:0] num,input Y,output reg led,output reg [3:0] sel,output reg [7:0] seg);reg [1:0] a;reg display_num;initial a=2'b0;initial display_num=0; initial seg=8'b0000_0011; initial led=0;initial sel=4'b0111;always@(posedge clk) beginif(~rst_n)begina=2'b0;display_num=0;endelse if(scan)beginif(a==2'b11)a=2'b0;elsea=a+2'b1;endcase(a)2'b0:beginsel=4'b0111;display_num=num[3];end2'b01:begindisplay_num=num[2];sel=4'b1011;end2'b10:begindisplay_num=num[1];sel=4'b1101;enddefault:beginsel=4'b1110;display_num=num[0];endendcaseif(display_num)seg=8'b1001_1111;elseseg=8'b0000_0011;endalways@(posedge clk)beginif(Y)led=1;elseled=0;endendmoduletop.vmodule top(input clk,input rst_n,input btn,input A,output [7:0]seg,output [3:0] sel,output led);wire oi;wire op;wire [3:0] num;wire scan;wire Y;anti_dither u_anti_dither(.clk (clk ),.btn (btn ),.rst_n (rst_n ),.op (op ));num u_num(。