人人范文网 范文大全

北航eda实验报告数字部分

发布时间:2020-03-02 15:14:54 来源:范文大全 收藏本文 下载本文 手机版

Verilog数字电路设计

实验报告

院系: 组员:

年月日

Verilog实验报告

目录

分组概况 ....................................................................................................................................3 分组概况 ................................................................................................................................3 实验概况 ................................................................................................................................4 实验感想 ................................................................................................................................5

实验内容 ....................................................................................................................................9 实验一 ....................................................................................................................................9 实验二 ..................................................................................................................................15 实验三 ..................................................................................................................................25 实验四 ..................................................................................................................................33

Verilog实验报告

一、分组概况

组长:

主要负责各次实验的总体进程,以及选做实验的代码编译。在实验报告中负责统筹规划及后期编排。

组员:

负责各次实验必做实验源代码的录入及仿真。在实验报告中负责报告前期录入,包括各次实验的简要内容、步骤等。

Verilog实验报告

二、实验概况

本课程共安排四次实验,其内容是:

1、练习

一、简单的组合逻辑设计

练习

二、简单分频时序逻辑电路的设计 选做

一、设计一个字节(8位)的比较器

2、练习

三、利用条件语句实现计数分频时序电路

练习

五、用always块实现较复杂组合逻辑电路 选做

一、利用10MB时钟设计一个单周期波形 选做

二、运用always块设计一个8路数据选择器

3、练习

四、阻塞赋值与非阻塞赋值的区别

练习

六、在Verilog中使用函数 练习

七、在Verilog中使用任务

练习题

5、综合一个可以计算正整数平方、立方、阶乘的函数 思考题

3、在blocking模块中实现对两种写法的仿真

4、必做

一、设计一个串行数据检测器

必做

二、楼梯灯——基本任务 选做

一、楼梯灯——扩展任务

Verilog实验报告

三、感想

通过这4次的实验,我们基本熟悉Modelsim 软件,掌握了Modelsim 软件的编译、仿真方法。同时在编写程序的过程中,加深了我们对课上所讲的语法的认识以及学会了测试模块的编写。经过实验一,我们掌握了基本组合逻辑电路,基本时序电路;经过实验二,我们掌握条件语句在简单时序模块设计中的使用、在Verilog模块中应用计数器以及用always实现较大组合逻辑电路;经过实验三,我们掌握阻塞赋值与非阻塞赋值的概念与区别,了解函数的定义和在模块设计中的使用,掌握任务在verilog模块设计中的应用;经过实验四,我们掌握利用有限状态机实现一般时序逻辑分析的方法。在实验过程中,我们也遇到过程序编写以及软件仿真上的问题。程序编写时,要注意一些细节,比如符号,全角与半角等。软件仿真过程中,我们出现过程序无错,但添加波形运行后,却没有波形的情况,最后上网百度,找到了解决方法。实验总体来说,都比较顺利。对于难度较大的实验四,只要思路清晰,考虑到所有的情况,就能做出来。

Verilog实验报告

四、实验内容 第一次实验课:

练习一 简单的组合逻辑设计

实验目的: (1) 掌握基本组合逻辑电路的实现方法 (2) 初步了解两种基本组合逻辑电路的生成方法 (3) 学习测试模块的编写 (4) 通过综合和布局布线了解不同层次仿真的物理意义 实验原理:

实验代码提供的是一个可综合的数据比较器。从语句中可以看出是比较数据a,b的结果,结果相同输出1,否则输出0.测试模块用于检测模块设计是否正确,给出输入信号,观察模块的内部信号和输出信号以确定设计是否正确。综合就是把compare.v文件送到synplify或其他综合器进行处理,启动综合器编译。布局布线就是把综合后的另一种文件(EDIF),在布线工具控制下进行处理,启动布局布线的编译。 实验内容:

模块源代码的组合逻辑仿真与测试

实验代码:

module compare(equal,a,b); inputa,b; output equal;

aign equal =(a==b)?1:0;

endmodule

实验仿真:

测试程序:

`timescale 1ns/1ns `include \"./compare.v\"

module t; rega,b; wire equal; initial begin a=0; b=0; #100 a=0;b=1; #100 a=1;b=1; #100 a=1;b=0;

Verilog实验报告

#100 a=0;b=0; #100 $stop; end

compare m(.equal(equal),.a(a),.b(b));

endmodule 仿真结果:

练习二 简单分频时序逻辑电路的设计

实验目的: (1) 掌握最基本时序电路的实现方法 (2) 学习时序电路测试模块的编写 (3) 学习综合和不同层次的仿真 实验原理:

对于组合逻辑电路,可综合成具体电路结构的时序逻辑电路也有准确的表达方式。在可综合的模型中,通常用always块或者@(posedgeclk)或(negedgeclk)结构表达时序逻辑。实验为二分之一分频器模型。

在always块中,被赋值信号都必须定义为reg型,对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态的。为了正确观察结果,在可综合模块中,常定义一个复位信号reset,其为低电平时对寄存器进行复位。 实验内容:

分频时序电路的仿真测试

实验代码:

modulehalf_clk(reset,clk_in,clk_out); inputclk_in,reset; outputclk_out; regclk_out; always @(posedgeclk_in) begin if(!reset) clk_out=0; elseclk_out=~clk_out; end endmodule 实验仿真:

测试程序:

Verilog实验报告

`timescale 1ns/100ps `define clk_cycle 50 module top; reg clk,reset; wire clk_out; always #`clk_cycle clk=~clk; initial begin clk=0; reset=1; #10 reset=0; #110 reset=1; #100000 $stop; end half_clk m0(.reset(reset),.clk_in(clk),.clk_out(clk_out)); endmodule 仿真结果:

选做一 设计一个字节(8位)比较器

实验内容:

比较两个字节的大小,若a[7:0]大于b[7:0],则输出高电平,否则输出低电平。

实验代码:

module compare8(equal,a,b); input [7:0]a,b; output equal; reg equal; always@(a or b) if(a>b) equal=1; else equal=0; endmodule 实验仿真:

测试程序:

`timescale 1ns/1ns

Verilog实验报告

`include \"./compare8.v\" module test8; reg [7:0]a; reg [7:0]b; wire equal; initial begin a=8\'b10000000; b=8\'b00000000; #100 a=8\'b00001000;b=8\'b00001111; #100 a=8\'b00001111;b=8\'b00011111; #100 a=8\'b11111111;b=8\'b11111111; #100 a=8\'b10101010;b=8\'b00001111; #100 $stop; end compare8 m(.equal(equal),.a(a),.b(b)); endmodule 仿真结果:

第二次实验课

练习三 利用条件语句实现计数分频时序电路

实验目的: (1) 掌握条件语句在简单时序模块设计中的使用 (2) 学习在Verilog模块中应用计数器 (3) 学习测试模块的编写、综合和不同层次的仿真 实验原理:

在可综合的Verilog HDL模型中,常用的条件语句有if „else和case„endcase两种结构,用法和C语言相似。 1.if语句 (1) if(表达式)语句

(2) if(表达式) 语句1 else语句2 (3) if(表达式1)语句1;

else if(表达式2)语句2; else if(表达式3)语句3;

Verilog实验报告

„„ 2.case语句

(1)case(表达式)endcase (2)casez(表达式) endcase (3)casex(表达式) endcase 前者用于不太复杂的分支关系,实际编写模块时常用的是后者。实验代码是一个可综合风格的分频器,可将10M时钟分频为500K,基本原理和二分之一分频器类似,但需要定义一个计数器以准确获得1/20分频。 实验内容:

进行所给代码计数分频器的仿真测试并观察输出波形

实验代码:

modulefdivsion(RESET,F10M,F500K); input F10M,RESET; output F500K; reg F500K; reg [7:0]j; always @(posedge F10M) if(!RESET) begin F500K

测试程序:

`timescale 1ns/100ps `defineclk_cycle 50 moduledivision_top; reg F10M,RESET; wire F500K_clk; always #`clk_cycle F10M=~F10M; initial

Verilog实验报告

begin RESET=1; F10M=0; #100 RESET=0; #100 RESET=1; #10000 $stop; end fdivsion m0(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk)); endmodule

仿真结果:

练习五 用always块实现较复杂的组合逻辑电路

实验目的:

(1)掌握用always实现较大组合逻辑电路的方法;

(2)进一步了解aign与always两种组合电路实现方法的区别和注意点; (3)学习测试模块中随机数的产生和应用; (4)学习综合不同层次的仿真,并比较结果。 实验原理:

(1)自触发always块:

例:采用非阻塞赋值的自触发振荡器

module osc2(clk); outputclk; regclk; initial #10 clk=0; always @(clk) #10 clk

本实验示例中使用了电平敏感的always块,所谓电平敏感的触发条件:@后的括号内电平里表中的任何一个电平发生变化(与时序逻辑不同,它在@后的括号内没有沿敏感关键词,如posedge或negedge),就能触发always块的动作。 (2)aign与always

Verilog实验报告

使用aign结构来实现组合逻辑电路,如果逻辑关系比较复杂,不容易理解语句的功能,而适当采用always来设计组合逻辑,使源代码语句的功能容易理解。

同一组合逻辑电路分别用always块和连续赋值语句aign描述时,代码的形式大相径庭,但在always中,若适当运用default(在case结构中)和else(在if„else结构中)语句时,通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为reg型;若不使用default或else对默认项进行说明,则易生成意想不到的锁存器,这一点一定注意!

实验代码:

`define plus 3\'d0 `define minus 3\'d1 `define band 3\'d2 `definebor 3\'d3 `defineunegate 3\'d4 modulealu(out,opcode,a,b); output[7:0] out; reg[7:0] out; input[2:0] opcode; input[7:0] a,b; always@(opcode or a or b) begin case(opcode) `plus: out=a+b; `minus: out=a-b; `band: out=a&b; `bor: out=a|b; `unegate: out=~a; default: out=8\'hx; endcase end endmodule 实验仿真:

测试程序:

`timescale 1ns/1ns `include \"./alu.v\" moduleaultest; wire[7:0] out; reg[7:0] a,b; reg[2:0] opcode; parameter times=5; initial begin a={$random}%256;

Verilog实验报告

b={$random}%256; opcode=3\'h0; repeat(times) begin #100 a={$random}%256; b={$random}%256; opcode=opcode+1; end #100 $stop; end alu alu1(out,opcode,a,b); endmodule 仿真结果:

选做

一、利用10MB时钟设计一个单周期波形

实验内容:

利用原有代码,自己编写模块源代码和测试模块代码,利用10M时钟,设计一个单周期形状的周期波形

实验代码:

module fdivision2(RESET,clk,out); inputclk,RESET; output out; reg out; reg [15:0]j; always @ (posedgeclk) if (!RESET) begin out

Verilog实验报告

else begin if(j==299) begin j

测试程序:

`timescale 1ns/100ps `defineclk_cycle 50 modulefdivision_top; regclk,RESET; wireout_clk; always #`clk_cycleclk=~clk; initial begin RESET=1; clk=0; #1000 RESET=0; #1000 RESET=1; #100000 $stop; end fdivision2fdivision(.RESET(RESET),.clk(clk),.out(out_clk)); endmodule 仿真结果:

Verilog实验报告

选做

二、用always块实现较复杂的组合逻辑电路

实验内容:

运用always块设计一个8路数据选择器。要求:每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位)或输入数据变化时,输出数据也相应的变化。

实验代码:

module lianxi4(out,opcode,a,b,c,d,e,f,g,h); output[3:0] out; reg[3:0] out; input[2:0] opcode; input[3:0] a,b,c,d,e,f,g,h;

always@(opcode or a or b or c or d or e or f or g or h) begin case(opcode) 3\'d0:out=a; 3\'d1:out=b; 3\'d2:out=c; 3\'d3:out=d; 3\'d4:out=e; 3\'d5:out=f; 3\'d6:out=g; 3\'d7:out=h; endcase end endmodule 实验仿真:

测试程序:

`timescale 1ns/1ns `include \"./lianxi4.v\" module lianxi4_t; wire[3:0] out; reg[3:0] a,b,c,d,e,f,g,h; reg[2:0] opcode; parameter times=8; initial begin a={$random}%16; b={$random}%16; c={$random}%16; d={$random}%16; e={$random}%16;

Verilog实验报告

f={$random}%16; g={$random}%16; h={$random}%16; opcode=3\'b0; repeat(times) begin #100 a={$random}%16; b={$random}%16; c={$random}%16; d={$random}%16; e={$random}%16; f={$random}%16; g={$random}%16; h={$random}%16; opcode=opcode+1; 仿真结果:

Verilog实验报告

第三次实验课

练习四 阻塞赋值与非阻塞赋值的区别

实验目的:

(1) 通过实验,掌握阻塞赋值与非阻塞赋值的概念与区别; (2) 了解非阻塞与阻塞赋值的不同使用场合;

(3) 学习测试模块的编写、综合和不同层次的仿真。 实验原理:

非阻塞赋值方式:在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值所得;在编写可综合的时序逻辑模块时,这是最常用的赋值方法。

阻塞赋值方式:赋值语句执行完后,块才结束;被赋的值才赋值语句执行完后立刻就改变;在时序逻辑中使用时,可能会产生意想不到的结果。

在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。在时序逻辑设计中,通常使用非阻塞赋值语句,而在实现组合逻辑的aign结构中,或者always块结构中都必须采用阻塞赋值语句。

实验代码:

module blocking(clk,a,b,c); output[3:0] b,c; input [3:0] a; inputclk; reg [3:0] b,c; always@(posedgeclk) begin b=a; c=b; $display(\"blocking:a=%d,b=%d,c=%d.\",a,b,c); end endmodule

modulenonblocking(clk,a,b,c); output[3:0] b,c; input [3:0] a; inputclk; reg [3:0] b,c; always@(posedgeclk) begin b

Verilog实验报告

测试程序:

`timescale 1ns/100ps `include\"./blocking.v\" `include\"./nonblocking.v\" modulecomparetop; wire [3:0] b1,c1,b2,c2; reg[3:0] a; regclk; initial begin clk=0; forever #50 clk=~clk; end initial begin a=4\'h3; $display(\"_\"); #100 a=4\'h7; $display(\"_\"); #100 a=4\'hf; $display(\"_\"); #100 a=4\'ha; $display(\"_\"); #100 a=4\'h2; $display(\"_\"); $stop; end nonblockingnonblocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1); endmodule 测试结果:

思考题3在blocking模块中实现对两种写法的仿真

实验内容:

在blocking模块中按如下两种写法,仿真与综合的结果会有什么样的变化?做出仿真波形。

实验代码:

Verilog实验报告

module blocking1(clk,a,b,c); output[3:0] b,c; input [3:0] a; inputclk; reg [3:0] b,c; always@(posedgeclk) begin c=b; b=a; end endmodule

module blocking2(clk,a,b,c); output[3:0] b,c; input [3:0] a; inputclk; reg [3:0] b,c; always@(posedgeclk) b=a; always@(posedgeclk) c=b; endmodule 实验仿真:

测试程序:

`include\"./blocking1.v\" `include\"./blocking2.v\" module top; wire [3:0] b1,c1,b2,c2; reg[3:0] a; regclk; initial begin clk=0; forever #50 clk=~clk; end initial begin a=4\'h3; $display(\"_\"); #100 a=4\'h7; $display(\"_\"); #100 a=4\'hf; $display(\"_\"); #100 a=4\'ha; $display(\"_\");

Verilog实验报告

#100 a=4\'h2; $display(\"_\"); $stop; end blocking2 blocking2(clk,a,b2,c2); blocking1 blocking1(clk,a,b1,c1); endmodule 测试结果:

练习六 在Verilog HDL中使用函数

实验目的:

(1)了解函数的定义和在模块设计中的使用; (2)了解函数的综合性问题;

(3)了解许多综合器不能综合复杂的算术运算。 实验原理:

与一般的程序设计语言一样,Verilog HDL中也可使用函数以适应对不同变量采取同一种运算的操作。Verilog HDL函数在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改变这部分电路的输入以得到相应的计算结果。函数的目的是返回一个用于表达式的值。 (1)函数定义

Function(函数名); Begin

„„ End Endfuction (2)函数调用

(,„) 实验内容:

采用同步时钟触发运算的执行,每个clk时钟周期都会执行一次运算,并且在测试模块中,通过调用系统任务$display及在时钟的下降沿显示每次计算的结果。

实验代码:

moduletryfunct(clk,n,result,reset); output [31:0] result; input [3:0] n;

Verilog实验报告

inputreset,clk; reg [31:0] result;

always @(posedgeclk) begin if(!reset) result

function [31:0] factorial; input [3:0] operand; reg [3:0] index; begin factorial=operand?1:0; for(index=2;index

endmodule 实验仿真:

测试程序:

`include \"./tryfunct.v\" `timescale 1ns/1ns `define clk_cycle 50

module tryfunct_test; reg[3:0] n,i; reg reset,clk; wire [31:0] result;

initial begin clk=0; n=0; reset=1; #100 reset=0; #100 reset=1; for (i=0;i

Verilog实验报告

begin #200 n=i; end #100 $stop; end

always #`clk_cycle clk=~clk;

tryfunct m(.clk(clk),.n(n),.result(result),.reset(reset));

endmodule 测试结果:

练习七 在Verilog HDL中使用任务(task)

实验目的:

(1)掌握任务在verilog模块设计中的应用;

(2)学会在电平敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂组合逻辑的高级方法。 实验原理:

当我们希望能够将一些信号进行运算并输出多个结果时,采用函数结构就显得非常不方便,而任务结构在这方面的优势则十分突出。任务本身并不返回计算值,但它通过类似C语言中的形参与实参的数据变换,非常容易实现运算结果的调用。此外,还常常利用任务来包装模块设计中的许多复杂的过程,将许多复杂的操作步骤用一个命名清晰易懂的任务隐藏起来,大大提高程序可读性。 (1)任务和函数的不同

函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位;函数不能启动任务但任务能启动其他任务和函数;函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量;函数返回一个值,任务则不返回值。 (2)任务定义

Task „„ Endtask (3)任务调用

(端口1,端口2,„端口n); 实验内容:

Verilog实验报告

利用电平敏感的always快和一个比较两变量大小排序的任务,设计出四个(4位)并行输入数的高速排序组合逻辑。

实验代码:

module sort4(ra,rb,rc,rd,a,b,c,d); output[3:0] ra,rb,rc,rd; input[3:0] a,b,c,d; reg[3:0] ra,rb,rc,rd; reg[3:0] va,vb,vc,vd;

always @(a or b or c or d) begin {va,vb,vc,vd}={a,b,c,d}; sort2(va,vc); sort2(vb,vd); sort2(va,vb); sort2(vc,vd); sort2(vb,vc); {ra,rb,rc,rd}={va,vb,vc,vd}; end

task sort2; inout[3:0] x,y; reg[3:0] tmp; if(x>y) begin tmp=x; x=y; y=tmp; end endtask

endmodule 实验仿真:

测试程序:

`timescale 1ns/100ps `include \"sort4.v\"

moduletask_test; reg[3:0] a,b,c,d; wire[3:0] ra,rb,rc,rd;

initial

Verilog实验报告

begin a=0;b=0;c=0;d=0; repeat(50) begin #100 a={$random}%15; b={$random}%15; c={$random}%15; d={$random}%15; end

#100 $stop; end

sort4 sort4(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd));

endmodule 测试结果:

选做一 综合一个可以计算整数平方、立方、阶乘的函数

实验内容:

设计一个函数,可以计算整数平方、立方、以及不大于5的阶乘

实验代码:

modulelianxi(clk,n,,opcode,result,reset); output [7:0] result; input [3:0] n,opcode; inputreset,clk; reg [7:0] result;

always @(posedgeclk) begin if(!reset) result

Verilog实验报告

3\'d1: result

function [7:0] jiecheng; input [3:0] operand; reg [3:0] index; begin jiecheng=operand?1:0; for(index=2;index

function [7:0] pingfang; input [3:0] operand; pingfang=operand*operand; endfunction

function [7:0] lifang; input [3:0] operand; lifang=operand*operand*operand; endfunction

endmodule 实验仿真:

测试程序:

`include \"./lianxi.v\" `timescale 1ns/1ns `define clk_cycle 50

module lianxi_test; reg[3:0] n,opcode; regreset,clk; wire [7:0] result; parameter times=20;

initial begin clk=0;

Verilog实验报告

n=0; reset=1; opcode=0; #100 reset=0; #100 reset=1; begin n={$random}%6; opcode={$random}%3; repeat(times) begin #100 n={$random}%6; opcode={$random}%3; end end

#1000 $stop; end

always #`clk_cycleclk=~clk;

lianxi lian(.clk(clk),.n(n),.opcode(opcode),.result(result),.reset(reset));

endmodule 仿真结果:

第四次实验课

必做一[练习题七]设计一个串行数据检测器

实验目的:

(1)掌握利用有限状态机实现一般时序逻辑分析的方法; (2)掌握用Verilog编写可综合的有限状态机的标准模板; (3)掌握用Verilog编写状态机模块的测试文件的一般方法。 实验原理:

(1)有限状态机

有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。一般来说,除了输入部分和输出部分外,有限状态机还含有一组具有“记忆”功能的寄存器,这些寄存器的功能是记忆有限状态机的内部状态,它们常被称为状态寄存

Verilog实验报告

器。在有限状态机中,状态寄存器的的下一个状态不仅与输入信号有关,而且还与该寄存器的当前状态有关,因此有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。其中,寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑又可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的输出。 (2)有限状态机设计

逻辑抽象,得出状态装换图;状态化简;状态分配;选定触发器的类型并求出状态方程、驱动方程和输出方程;按照方程得出逻辑图。

在数字电路中我们已经学习过通过建立有限状态机来进行数字逻辑的设计,而在Verilog HDL硬件描述语言中,这种设计方法得到进一步的发展。通过Verilog HDL提供的语句,我们可以直观地设计出适合更为复杂的时序逻辑的电路。 实验内容:

设计一个串行数据检测器。要求是:连续4个或4个以上为1时输出为1,其他输入情况下为0。编写测试模块对设计的模块进行各种层次的仿真,并观察波形,编写实验报告。

实验代码:

module lianxiti7(x,z,clk,rst,state); inputx,clk,rst; output z; output[2:0]state; reg[2:0]state; wire z;

parameter IDLE=\'d0,A=\'d1,B=\'d2,C=\'d3,D=\'d4;

always@(posedgeclk) if(!rst) begin state

default:state=IDLE; endcase aign z=(state==D); endmodule

Verilog实验报告

实验仿真:

测试程序:

`timescale 1ns/1ns `include \"./lianxiti7.v\" modulelianxititop; regclk,rst; reg[23:0] data; wire[2:0] state; wirez,x; aign x=data[23]; always #10 clk=~clk; always @(posedgeclk) data={data[22:0],data[23]};

initial begin clk=0; rst=1; #2 rst=0; #30 rst=1; data=\'b1001_1110_0111_1101_0101; #500 $stop; end lianxiti7 m(x,z,clk,rst,state); endmodule 仿真结果:

必做二 楼梯灯——基本任务

实验内容:

楼下到楼上依次有3个感应灯:灯

1、灯

2、灯3。当行人上下楼梯时,各个灯感应到后自动点亮,若在8s内感应信号消失,则点亮8s,若感应信号存在时间超过8s,则感应信号消失4s后灯自动关闭。

任务1:做出如上逻辑电路设计并仿真; 任务2:考虑去抖,对于感应信号到达存在毛刺(小于0.5s),设计逻辑并剔出。

实验代码:

module loutid1(clk10,rst,switch,light);

input clk10,rst; input[2:0]switch; output[2:0]light;

reg[2:0]state1,state2,state3; reg[7:0]count1,count2,count3; reg[2:0]count_1,count_2,count_3; reg[2:0]light;

parameter

state1_start=3\'b000,state2_start=3\'b000,state3_start=3\'b000,

state1_work=3\'b001,state2_work=3\'b001,state3_work=3\'b001,

state1_up=3\'b010,state2_up=3\'b010,state3_up=3\'b010,

state1_down=3\'b011,state2_down=3\'b011,state3_down=3\'b011,

state1_other=3\'b100,state2_other=3\'b100,state3_other=3\'b100;

always@(posedge clk10) if(!rst) begin state1

state1_start: if(switch[0]==\'b1) begin state1

Verilog实验报告

else begin

state1

state1_up: begin

light[0]

state1

state1_work: if(count1>0) begin

count1

if(switch[0]==\'b0) begin

state1

state1

count1

state1_other: if(switch[0]==\'b1)

state1

if(count1>0) begin

count1

state1

state1_down: begin light[0]

default: state1

endcase

always@(posedge clk10) if(!rst) begin state2

state2_start: if(switch[1]==\'b1) begin state2

state2_work: if(count2>0) begin count2

Verilog实验报告

state2

state2

count2

state2_other: if(switch[1]==\'b1)

state2

if(count2>0) begin

count2

state2

state2_down: begin

light[1]

count_2

state2

state2_up: begin

light[1]

state2

default:

state2

endcase

always@(posedge clk10) if(!rst) begin

state3

state3_start: if(switch[2]==\'b1) begin state3

state3_work: if(count3>0) begin count3

state3

实验仿真:

测试程序:

`timescale 10ms/1ms module loutid1_t; reg clk10,rst; reg[2:0] swh; wire[2:0] light;

Verilog实验报告

count3

state3_other: if(switch[2]==\'b1)

state3

if(count3>0) begin

count3

state3

state3_down: begin

light[2]

count_3

state3

state3_up: begin

light[2]

state3

default:

state3

endcase

endmodule

Verilog实验报告

parameter HALF_PERIOD = 5;

always #HALF_PERIOD clk10=~clk10;

initial begin

clk10 = 0;

rst = 1;

swh=3\'b000;

#1 rst = 0;

#10 rst = 1;

#100 swh=3\'b000;

#100 swh=3\'b001; #400 swh=3\'b000; #40 swh=3\'b001; #500 swh=3\'b010; #900 swh=3\'b000; #400 swh=3\'b100; #400 swh=3\'b000; #600 swh=3\'b001; #40 swh=3\'b000;

#1000 $stop; end 仿真结果:

选做一:楼梯灯——拓展任务

实验内容:

任务3:若为节约能源,下一个灯点亮的同时将自动关闭上一个灯,作出如上逻辑设计并仿真(仅考虑一个人的情况);

任务4:考虑存在多个人上下楼梯的情况,比如:

行人1已经从灯1到达灯2,灯2受感应自动点亮,但此时行人2刚上楼梯到达灯1的位置,

则灯1和灯2都须点亮,

更加复杂一点,如果行人2是下楼梯刚到达灯3位置,作出如上逻辑设计并仿真;

实验代码:

modulelight_All(clk10,rst,switch,light);

input clk10,rst; input[2:0]switch; output[2:0]light;

reg[2:0]state1,state2,state3; reg[7:0]count1,count2,count3; reg[2:0]count_1,count_2,count_3; reg[2:0]light;

parameter

state1_start=3\'b000,state2_start=3\'b000,state3_start=3\'b000,

state1_work=3\'b001,state2_work=3\'b001,state3_work=3\'b001,

state1_up=3\'b010,state2_up=3\'b010,state3_up=3\'b010,

state1_down=3\'b011,state2_down=3\'b011,state3_down=3\'b011,

state1_other=3\'b100,state2_other=3\'b100,state3_other=3\'b100;

always@(posedge clk10) if(!rst) begin state1

state1_start: if(switch[0]==\'b1)

Verilog实验报告

begin

state1

state1

state1_work: if(count1>0) begin

count1

if(switch[0]==\'b0&&(state2==3\'b010||state3==3\'b010)) begin

light[0]

if(switch[0]==\'b0) begin

state1

state1

state1_other: if(switch[0]==\'b1)

state1

if(count1>0) begin

count1

light[0]

state1_down: begin light[0]

state1_up: begin light[0]

default: state1

endcase

always@(posedge clk10) if(!rst) begin state2

state2_start: if(switch[1]==\'b1) begin state2

Verilog实验报告

end else begin

state2

state2_work: if(count2>0) begin

count2

if(switch[1]==\'b0&&(state1==3\'b010||state3==3\'b010)) begin

light[1]

if(switch[1]==\'b0) begin

state2

state2

state2_other: if(switch[1]==\'b1)

state2

if(count2>0) begin

count2

light[1]

state2

state2_down: begin light[1]

state2_up: begin light[1]

default: state2

endcase

always@(posedge clk10) if(!rst) begin state3

state3_start: if(switch[2]==\'b1) begin state3

Verilog实验报告

light[2]

state3_work: if(count3>0) begin

count3

if(switch[2]==\'b0&&(state1==3\'b010||state2==3\'b010)) begin

light[2]

if(switch[2]==\'b0) begin

state3

state3

state3_other: if(switch[2]==\'b1)

state3

if(count3>0) begin

count3

light[2]

state3

state3

Verilog实验报告

state3_down: begin light[2]

state3_up: begin light[2]

state3

default:

state3

endcase

endmodule实验仿真:

测试程序:

`timescale 10ms/1ms moduletest_light_All; reg clk10,rst; reg[2:0] up,down; wire[2:0] swh; wire[2:0] light;

parameter HALF_PERIOD = 5;

always #HALF_PERIOD clk10=~clk10;

initial

begin

clk10 = 0;

rst = 1;

up = 3\'b000;down = 3\'b000;

#1 rst = 0;

#10 rst = 1;

#100 up = 3\'b001; down = 3\'b000;

#300 up =3\'b010; down = 3\'b000;

#600 up = 3\'b010; down = 3\'b010;

#30 up = 3\'b010;

#900 up = 3\'b100; down = 3\'b001;

#1000 $stop;

end

aignswh = up | down;

light_Allm5(clk10,rst,swh,light); endmodul仿真结果:

北航_电子实习_数字部分实验报告(优秀)

EDA实验报告

EDA实验报告

EDA实验报告

EDA实验报告

EDA实验报告

EDA课程设计——数字时钟

EDA课程设计 数字时钟

北航matlab上机实验报告

数字电路EDA课程设计数字跑表

北航eda实验报告数字部分
《北航eda实验报告数字部分.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档