华中科技大学Verilog语言实验报告

合集下载

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 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实验报告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中的运算需求。

Verilog-HDL实验报告

Verilog-HDL实验报告

HDL实验报告专业电子科学与技术姓名学号指导老师1 实验一Modelsim仿真软件的使用1.1 实验目的(1)熟悉Modelsim 软件;(2)掌握Modelsim 软件的编译、仿真方法;(3)熟练运用Modelsim 软件进行HDL 程序设计开发。

1.2 实验步骤(1)学习使用Modelsim软件;(2)分析原理及功能;(3)用Verilog HDL编写程序;(4)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。

1.3 实验内容用Verilog HDL 程序实现一个异或门,Modelsim 仿真,观察效果。

1.4.1 程序module my_xor(ina,inb,out);input ina,inb;output out;assign out=ina^inb;endmodulemodule t_xor;reg ina,inb;wire out;initialbeginina=1'b0;forever #20 ina=~ina;endinitialbegininb=1'b0;forever #10 inb=~inb;endmy_xor tt(.ina(ina),.inb(inb),.out(out));endmodule2 实验二简单组合电路设计2.1 实验目的(1)掌握基于Modelsim 的数字电路设计方法;(2)熟练掌握HDL 程序的不同实现方法2.2 实验步骤(1)分析原理及功能;(2)根据原理用Verilog HDL编写程序;(3)编写测试程序进行仿真;(4)观察波形,分析仿真结果是否正确。

2.3 实验内容设计一个三人表决器(高电平表示通过) ,实验内容如下:(1)三个人,一个主裁判,两个副裁判;(2)规则:只要主裁判同意,输出结果为通过;否则,按少数服从多数原则决定是否通过。

使用Verilog HDL 程序实现上述实验内容,并使用modelsim 仿真(要求:至少使用两种方法实现上述实验内容和testbench)。

verilog hdl实验报告

verilog hdl实验报告

verilog hdl实验报告《Verilog HDL实验报告》Verilog HDL(硬件描述语言)是一种用于描述电子系统的硬件的语言,它被广泛应用于数字电路设计和硬件描述。

本实验报告将介绍Verilog HDL的基本概念和使用方法,并通过实验展示其在数字电路设计中的应用。

实验目的:1. 了解Verilog HDL的基本语法和结构2. 掌握Verilog HDL的模块化设计方法3. 熟悉Verilog HDL的仿真和综合工具的使用实验内容:1. Verilog HDL的基本语法和结构Verilog HDL是一种硬件描述语言,其语法和结构类似于C语言。

它包括模块定义、端口声明、信号赋值等基本元素。

在本实验中,我们将学习如何定义Verilog模块,并使用端口声明和信号赋值描述数字电路的行为。

2. Verilog HDL的模块化设计方法Verilog HDL支持模块化设计,可以将复杂的电路分解为多个模块,每个模块描述一个子电路的行为。

在本实验中,我们将学习如何设计和实现Verilog模块,并将多个模块组合成一个完整的数字电路。

3. Verilog HDL的仿真和综合工具的使用Verilog HDL可以通过仿真工具进行功能验证,也可以通过综合工具生成实际的硬件电路。

在本实验中,我们将使用Verilog仿真工具对设计的数字电路进行功能验证,并使用综合工具生成对应的硬件电路。

实验步骤:1. 学习Verilog HDL的基本语法和结构2. 设计一个简单的数字电路,并实现Verilog模块描述其行为3. 使用仿真工具对设计的数字电路进行功能验证4. 使用综合工具生成对应的硬件电路实验结果:通过本实验,我们学习了Verilog HDL的基本概念和使用方法,并成功设计和实现了一个简单的数字电路。

我们使用仿真工具对设计的数字电路进行了功能验证,并使用综合工具生成了对应的硬件电路。

实验结果表明,Verilog HDL在数字电路设计中具有重要的应用价值。

Verilog 实验报告

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```四、实验结果与分析(一)基本逻辑门的结果通过仿真,与门、或门和非门的输出结果与预期的逻辑功能完全一致,验证了代码的正确性。

华中科技大学数字逻辑实验小设计说明

华中科技大学数字逻辑实验小设计说明

数字电路与逻辑设计课程小设计题目:简单运算器运算电路设计专业:计算机科学与技术班级:CS1409学号:U201414813姓名:唐礼威指导教师:徐老师一、设计题目每位同学自选下列题目之一。

(1)时序信号发生器设计(2)地址译码电路设计(3)自选(容要求参见(1)、(2))二、设计容要求2.1、简单运算器设计用Verilog实现一个满足设计要求的简单运算器的运算电路。

2.1.1设计要求设计一个能实现两种算术运算和两种逻辑运算的4 位运算器。

参加运算的4 位二进制代码分别存放在4个寄存器A、B、C、D 中,要求在选择变量控制下完成如下4种基本运算:(1)实现A加B,显示运算结果并将结果送寄存器A;(2)实现A减B,显示运算结果并将结果送寄存器B;(3)实现A与C,显示运算结果并将结果送寄存器C;(4)实现A异或D,显示运算结果并将结果送寄存器D。

2.1.2 功能描述根据设计要求,为了区分4种不同的运算,需设置2个运算控制变量。

设运算控制变量为S1 和S O,可列出运算器的功能,如表1所示。

根据功能描述可得出运算器的结构框图,如图1所示。

整个电路可由传输控制电路、运算电路、显示电路3部分组成。

简单运算功能说明表运算器的结构框图由简单运算器的结构图可知其由传输控制电路、运算电路和运算结果显示电路三个大部分构成,其中运算电路又由算术运算电路、逻辑运算电路构成。

这次设计主要是利用Verilog语言设计运算器中运算电路部分。

2.1.3 电路设计运算电路的逻辑电路图如下:由运算电路的逻辑电路图可以看出运算器中的逻辑关系,运算器主要由一片74LS283芯片和4个寄存器及8个异或门和4个与门构成。

由运算电路逻辑电路图可以初步构思设计个子模块的功能。

但是仅有运算电路的逻辑电路图还不够,还需要整体运算器的逻辑电路图才能确定各个子模块的输入与输出关系。

运算电路的完整逻辑电路图如下:可以看到运算电路逻辑图只是其中一部分,其中74LS283芯片功能为超前进位的全加器,可以将它设计为一个加法器模块。

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

专业:计算机科学与技术班级: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 故障及分析刚开始跑出来很多线是断的,后来发现是引脚对应部分的代码没有写完整。

后来加法器和ACC的参数顺序写错,导致接线与题给的不一致,发现问题后及时改正了。

1.6 仿真与结果Schematic图形如下:第一个数据通路:第二个数据通路:由以上两图可得,成功完成了要求的数据通路的设计,满足了各基本器件的输入输出链接要求;改变数据线宽度后再检查电路图,发现数据线做出相应改变,完成该实验。

1.7 心得与体会对数据通路的设计有了更好的理解,明白了数据通路的基本器件构成,熟悉了这些器件的功能和端口,掌握了Verilog完成基本运算器件的设计,完成了数据通路的设计。

2 FSM实验2.1 实验目的掌握用Verilog语言进行FSM设计、实现和仿真的方法。

2.2 实验内容及要求5.1_1、用FSM实现一个mealy型序列检测器,对一位的串行输入序列中的“1”的数量进行检测。

如果“1”的总数可以被3整除,输出“1”,否则输出“0”。

5.1_2、用FSM实现一个moore型序列检测器,对两位的串行输入序列进行检测。

输入01,00时,输出0,输入11,00时,输出1,输入10,00时,输出反向。

5.1_3、用FSM实现一个计数器(采用存储器),对一位的输入进行计数。

计数序列为:000,001,011,101,111,010。

5.2、用FSM实现一个序列识别器,该FSM的状态转移图如下所示,它能够对一位的串行输入序列中的“1”的数量进行检测。

如果FSM发现输入“1”的总数可以被3整除时,输出“1”;否则,输出“0”。

同时针对“***********”输入序列,写出相应的仿真程序并进行真波测试。

2.3 实验方案先根据要求画出状态图,根据状态图编写程序,根据程序编写仿真程序,最后得出结果和结论。

2.4 实验步骤5.1_1状态图:in=1/0in=0/0in=1/0 in=1/0in=1/15.1_2状态图:in=00in=01 in=10 in=11in=00 in=00 in=00out=0 out 翻转 out=1S0 S1S4 S3S0S1 S2S3S4 S5 S65.1_3状态图:1.根据以上状态图编写源程序(见附录)2.运行综合Run Synthesis3.综合正确后编写仿真程序4.仿真,得到仿真波形,验证结果2.5 故障及分析无故障2.6 仿真与结果5.1_1:如图,1的个数是3的倍数时输出1与预期一致5.1_2:如图,输入01后再输入00,输出0;输入11后再输入00,输出1;输入10后再输入00,输出翻转:与预期一致5.1_3:如图,输出序列为000,001,011,101,111,010(重复)与预期一致5.2:如图,1的个数是3的倍数时输出1与预期一致2.7 心得与体会这次实验通过FSM设计明白了设计的过程和步骤,首先要知道分为哪些状态,设计的是何种电路,如何选择用mealy还是moore型电路,状态转移要如何实现。

知道了mealy型和moore型电路的区别:当要求输出对输入快速响应并希望电路简单时选择mealy型,当要求时序输出稳定,能接受输出序列晚一个周期,即选择moore型电路不增加电路复杂性时,选择moore型电路。

3 意见和建议建议老师上课还是用中文PPT比较好,另外作业练习也用中文给出来,题目要求也尽量具体些,这样会减少我们学习的成本,更加有效的学习这门课。

4 附录源程序:4.1(第一个数据通路)//主模块module text4(S0,S1,S2,S3,Clk,reset,load,outR0,outR1,outACC,outS0,outS1,outS2,outS3,outA); parameter WIDTH=8; //位宽8位input S0,S1,S2,S3,Clk,reset,load;output [WIDTH-1:0] outR0,outR1,outACC,outS0,outS1,outS2,outS3,outA;register #(8) R0(inR0,Clk,reset,load,outR0);register #(8) R1(inR1,Clk,reset,load,outR1);register #(8) ACC(inACC,Clk,reset,load,outACC);mux #(8) S0(S0,inS00,inS01,outS0);mux #(8) S1(S1,inS10,inS11,outS1);mux #(8) S2(S2,inS20,inS21,outS2);mux #(8) S3(S3,inS30,inS31,outS3);add #(8) W1(inA0,inA1,outA);assign inS00=outS3;assign inS10=outS3;assign inS01=outR0;assign inS20=outR0;assign inS11=outR1;assign inS21=outR1;assign inA0=outACC;assign inS31=outACC;assign inACC=outA;assign inA1=outS2;assign inS30=outS2;assign inR1=outS1;assign inR0=outS0; endmodule//加法器模块module add(A,B,C);parameter WIDTH=8;input [WIDTH-1:0] A, B; output [WIDTH-1:0] C;wire [WIDTH:0] DA TA; assign DATA=A+B;assign C=DATA[7:0]; endmodule//寄存器模块module register(D,Clk,reset,load,Q); parameter WIDTH=8;input [WIDTH-1:0] D;input Clk,reset,load;output reg [WIDTH-1:0] Q; always @(posedge Clk)if (reset)beginQ <= 8'b0;end else if (load)beginQ <= D;endendmodule//二路选择器模块module mux(s,x,y,m);parameter WIDTH=8;input [WIDTH-1:0] x,y;input s;output [WIDTH-1:0] m;assign m =(s?y:x);endmodule4.2(第二个数据通路)//主模块moduletext2(SUM_SEL,NEXT_SEL,A_SEL,LD_SUM,LD_NEXT,NEXT_ZERO,outSUM_SEL,outNEXT_SE L,outA_SEL,outSUM,outNEXT,outA1,outA2,outMEM);parameter WIDTH=8;input SUM_SEL,NEXT_SEL,A_SEL,LD_SUM,LD_NEXT;wire [WIDTH-1:0]inSUM_SEL00,inSUM_SEL01,outSUM_SEL,inNEXT_SEL00,inNEXT_SEL01,outNEXT_SEL;output [WIDTH-1:0]outSUM_SEL,outNEXT_SEL,outA_SEL,outSUM,outNEXT,outA1,outA2,outMEM;output NEXT_ZERO;mux #(WIDTH) SUM_SEL(SUM_SEL,inSUM_SEL00,inSUM_SEL01,outSUM_SEL);mux #(WIDTH) NEXT_SEL(NEXT_SEL,inNEXT_SEL00,inNEXT_SEL01,outNEXT_SEL);mux #(WIDTH) A_SEL(A_SEL,inA_SEL00,inA_SEL01,outA_SEL);register #(WIDTH) SUM(inSUM,Clk,reset,LD_SUM,outSUM);register #(WIDTH) NEXT(inNEXT,Clk,reset,LD_NEXT,outNEXT);add #(WIDTH) A1(inA10,inA11,outA1);add #(WIDTH) A2(inA20,inA21,outA2);ROM #(WIDTH,WIDTH) MEM(outMEM,inMEM);COM #(WIDTH) COM(inCOM0,inCOM1,NEXT_ZERO); assign inA10=outSUM;assign inA11=outMEM;assign inNEXT_SEL00=outMEM;assign inNEXT_SEL01=0;assign inSUM_SEL00=outA1;assign inSUM_SEL01=0;assign inSUM=outSUM_SEL;assign inNEXT=outNEXT_SEL;assign inA20=outNEXT;assign inA21=1;assign inA_SEL00=outNEXT;assign inA_SEL01=outA2;assign inMEM=outA_SEL;assign inCOM0=outNEXT_SEL;assign inCOM1=0;endmodulemodule COM(a,b,out);parameter WIDTH=8;input [WIDTH-1:0] a,b;output out;reg out;always @(a or b)beginif(a>b)out=1;else out=0;endendmodule//存储器模块module ROM(ROM_data, ROM_addr);parameter data_WIDTH=8;parameter addr_WIDTH=8;output [addr_WIDTH-1:0] ROM_data;input [addr_WIDTH-1:0] ROM_addr;reg [addr_WIDTH-1:0] ROM [data_WIDTH-1:0]; // defining 4x2 ROMassign ROM_data = ROM[ROM_addr]; // reading ROM content at the address ROM_addr initial $readmemb ("ROM_data.txt", ROM, 0, 3); // load ROM content from ROM_data.txt file endmodule//寄存器模块module register(D,Clk,reset,load,Q);parameter WIDTH=8;input [WIDTH-1:0] D;input Clk,reset,load;output reg [WIDTH-1:0] Q;always @(posedge Clk)if (reset)beginQ <= 8'b0;end else if (load)beginQ <= D;endendmodule//加法器模块module add(A,B,C);parameter WIDTH=8;input [WIDTH-1:0] A, B;output [WIDTH-1:0] C;wire [WIDTH:0] DA TA;assign DATA=A+B;assign C=DATA[7:0];endmodule//二路选择器模块module mux(s,x,y,m);parameter WIDTH=8;input [WIDTH-1:0] x,y;input s;output [WIDTH-1:0] m;assign m =(s?y:x);endmodule5.1_1module lab5_1_1(input clk, input reset, input ain, output reg yout, output reg [3:0] count);reg [1:0] state, nextstate;parameter S0=0, S1=1, S2=2, S3=3;always @(posedge clk) // always block to update stateif (reset) beginstate <= S0;count = 0;endelsestate <= nextstate;always @(state or ain) // always block to compute output beginyout = 0;case(state)S0: if(!ain)yout = 1;S1: yout = 0;S2: yout = 0;S3: if(ain)yout = 1;endcaseendalways @(posedge clk) // always block to compute output beginif(ain)count = count + 1;endalways @(state or ain) // always block to compute nextstate begincase(state)S0: if(ain)nextstate = S1;else nextstate = S0;S1: if(ain)nextstate = S2;else nextstate = S1;S2: if(ain)nextstate = S3;else nextstate = S2;S3: if(ain)nextstate = S1;else nextstate = S3;endcaseendendmodule仿真程序:module lab5_1_1_tb();reg clk,reset,ain;wire yout;wire [3:0] count;integer i;parameter TIME = 400;parameter DELAY = 5;lab5_1_1 DUT (.clk(clk), .ain(ain), .count(count), .reset(reset), .yout(yout));initial begin#TIME $finish;endinitial beginclk = 0;for(i = 0; i < (TIME/DELAY); i = i + 1)#DELAY clk = ~clk;endinitial beginreset = 1;#(4*DELAY) reset = 0;#(34*DELAY) reset = 1;#(2*DELAY) reset = 0;endinitial beginain = 0;#(8*DELAY) ain = ~ain;#(4*DELAY) ain = ~ain;#(12*DELAY) ain = ~ain;#(8*DELAY) ain = ~ain;#(4*DELAY) ain = ~ain;#(6*DELAY) ain = ~ain;#(6*DELAY) ain = ~ain;endendmodule5.1_2module lab5_1_2(input clk, input reset, input [1:0] x, output reg yout, output reg [2:0] nextstate);reg [2:0] state;parameter S0=0, S11=1, S21=2, S31=3, S12=4, S22=5, S32=6;always @(posedge clk) // always block to update stateif (reset) beginstate <= S0;nextstate = S0;yout = 0;endelsestate <= nextstate;always @(state) // always block to compute output begincase(state)S0: yout = yout;S12: yout = 0;S22: yout = 1;S32: yout = ~yout;endcaseendalways @(state or x) // always block to compute nextstate begincase(state)S0: if(x == 1)nextstate = S11;else if(x == 3)nextstate = S21;else if(x == 2)nextstate = S31;S11: if(x == 0) nextstate = S12;else if(x == 1) nextstate = S11;else if(x == 3) nextstate = S21;else if(x == 2) nextstate = S31;S12: if(x == 1) nextstate = S11;else if(x == 3) nextstate = S21;else if(x == 2) nextstate = S31;S21: if(x == 0) nextstate = S22;else if(x == 1) nextstate = S11;else if(x == 3) nextstate = S21;else if(x == 2) nextstate = S31;S22: if(x == 1) nextstate = S11;else if(x == 3) nextstate = S21;else if(x == 2) nextstate = S31;S31: if(x == 0) nextstate = S32;else if(x == 1) nextstate = S11;else if(x == 3) nextstate = S21;else if(x == 2) nextstate = S31;S32: if(x == 1) nextstate = S11;else if(x == 3) nextstate = S21;else if(x == 2) nextstate = S31;endcaseendendmodule仿真程序:module lab5_1_2_tb();reg clk,reset;reg [1:0] x;wire [2:0] nextstate;wire yout;integer i;parameter TIME = 200;parameter DELAY = 5;lab5_1_2 DUT (.clk(clk), .x(x), .reset(reset), .yout(yout), .nextstate(nextstate));initial begin#TIME $finish;endinitial beginclk = 0;for(i = 0; i < (TIME/DELAY); i = i + 1)#DELAY clk = ~clk;endinitial beginreset = 1;#(4*DELAY) reset = 0;endinitial beginx = 0;#(8*DELAY) x = 3;#(2*DELAY) x = 2;#(2*DELAY) x = 0;#(4*DELAY) x = 2;#(2*DELAY) x = 0;#(2*DELAY) x = 3;#(2*DELAY) x = 0;#(2*DELAY) x = 1;#(2*DELAY) x = 0;#(2*DELAY) x = 2;#(2*DELAY) x = 3;#(2*DELAY) x = 0;#(6*DELAY) x = 2;#(6*DELAY) x = 0;endendmodule5.1_3module lab5_1_3(input clk, input reset, input x, output reg [2:0] yout, output reg [2:0] nextstate);reg [2:0] state;parameter S0=0, S1=1, S2=2, S3=3, S4=4, S5=5;always @(posedge clk) // always block to update stateif (reset) beginstate <= S0;nextstate = S0;endelsestate <= nextstate;always @(state or x) // always block to compute outputbegincase(state)S0: yout = 0;S1: yout = 1;S2: yout = 3;S3: yout = 5;S4: yout = 7;S5: yout = 2;endcaseendalways @(x or state) // always block to compute nextstate begincase(state)S0: if(x)nextstate = S1;else nextstate = S0;S1: if(x)nextstate = S2;else nextstate = S1;S2: if(x)nextstate = S3;else nextstate = S2;S3: if(x)nextstate = S4;else nextstate = S3;S4: if(x)nextstate = S5;else nextstate = S4;S5: if(x)nextstate = S0;else nextstate = S5;endcaseendendmodule仿真程序:module lab5_1_3_tb();reg clk,reset;reg x;wire [2:0] nextstate;wire [2:0] yout;integer i;parameter TIME = 400;parameter DELAY = 5;lab5_1_3 DUT (.clk(clk), .x(x), .reset(reset), .yout(yout), .nextstate(nextstate));initial begin#TIME $finish;endinitial beginclk = 0;for(i = 0; i < (TIME/DELAY); i = i + 1)#DELAY clk = ~clk;endinitial beginreset = 1;#(4*DELAY) reset = 0;endinitial beginx = 0;#(8*DELAY) x = 1;#(2*DELAY) x = 1;#(2*DELAY) x = 0;#(2*DELAY) x = 1;#(2*DELAY) x = 0;#(2*DELAY) x = 1;#(2*DELAY) x = 0;#(2*DELAY) x = 1;#(2*DELAY) x = 0;#(2*DELAY) x = 1;#(2*DELAY) x = 1;#(2*DELAY) x = 0;#(2*DELAY) x = 1;#(2*DELAY) x = 0;#(2*DELAY) x = 1;#(2*DELAY) x = 0;#(2*DELAY) x = 1;#(2*DELAY) x = 0;endendmodule5.2module lab5_2_1(input clk, input reset, input ain, output reg yout, output reg [3:0] count);reg [1:0] state, nextstate;parameter S0=0, S1=1, S2=2, S3=3;always @(posedge clk) // always block to update stateif (reset) beginstate <= S0;count = 0;endelse beginstate <= nextstate;if(ain)count = count + 1;endalways @(state) // always block to compute outputbeginyout = 0;case(state)S0: yout = 0;S1: yout = 0;S2: yout = 0;S3: yout = 1;endcaseendalways @(posedge clk) // always block to compute output beginendalways @(state or ain) // always block to compute nextstate begincase(state)S0: if(ain)nextstate = S1;else nextstate = S0;S1: if(ain)nextstate = S2;else nextstate = S1;S2: if(ain)nextstate = S3;else nextstate = S2;S3: if(ain)nextstate = S1;else nextstate = S3;endcaseendendmodule仿真程序:module lab5_2_1_tb();reg clk,reset,ain;wire yout;wire [3:0] count;integer i;parameter TIME = 400;parameter DELAY = 5;lab5_2_1 DUT (.clk(clk), .ain(ain), .count(count), .reset(reset), .yout(yout));initial begin#TIME $finish;endinitial beginclk = 0;for(i = 0; i < (TIME/DELAY); i = i + 1)#DELAY clk = ~clk;endinitial beginreset = 1;#(4*DELAY) reset = 0;#(34*DELAY) reset = 1;#(2*DELAY) reset = 0;endinitial beginain = 0;#(8*DELAY) ain = ~ain;#(4*DELAY) ain = ~ain;#(12*DELAY) ain = ~ain;#(8*DELAY) ain = ~ain;#(4*DELAY) ain = ~ain;#(6*DELAY) ain = ~ain;#(6*DELAY) ain = ~ain;endendmodul·指导教师评定意见·一、原创性声明本人郑重声明本报告内容,是由作者本人独立完成的。

相关文档
最新文档