第一篇:北航eda实验报告数字部分
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;
assign 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(表达式)
进行所给代码计数分频器的仿真测试并观察输出波形
实验代码:
modulefdivsion(RESET,F10M,F500K);input F10M,RESET;output F500K;reg F500K;reg [7:0]j;always @(posedge F10M)if(!RESET)begin F500K<=0;j<=0;end else begin if(j==9)begin j<=0;F500K<=~F500K;end else j<=j+1;end endmodule 实验仿真:
测试程序:
`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)进一步了解assign与always两种组合电路实现方法的区别和注意点;(3)学习测试模块中随机数的产生和应用;(4)学习综合不同层次的仿真,并比较结果。实验原理:
(1)自触发always块:
例:采用非阻塞赋值的自触发振荡器
module osc2(clk);outputclk;regclk;initial #10 clk=0;always @(clk)#10 clk<=~clk;endmodule @(clk)的第一次触发之后,非阻塞赋值的RHS表达式便计算出来,并把值赋给LHS的时间并安排在更新事件队列中。在非阻塞赋值更新事件队列被激活之前,又遇到了@(clk)触发语句,并且always块再次对clk的值变化产生反应。当非阻塞LHS的值在同一时刻被更新时,@(clk)再一次触发。
本实验示例中使用了电平敏感的always块,所谓电平敏感的触发条件:@后的括号内电平里表中的任何一个电平发生变化(与时序逻辑不同,它在@后的括号内没有沿敏感关键词,如posedge或negedge),就能触发always块的动作。(2)assign与always
Verilog实验报告
使用assign结构来实现组合逻辑电路,如果逻辑关系比较复杂,不容易理解语句的功能,而适当采用always来设计组合逻辑,使源代码语句的功能容易理解。
同一组合逻辑电路分别用always块和连续赋值语句assign描述时,代码的形式大相径庭,但在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<=0;j<=0;end else begin if(j==199)begin j<=j+1;out<=~out;end
Verilog实验报告
else begin if(j==299)begin j<=j+1;out<=~out;end else if(j==499)j<=0;else j<=j+1;end end endmodule 实验仿真:
测试程序:
`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块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。在时序逻辑设计中,通常使用非阻塞赋值语句,而在实现组合逻辑的assign结构中,或者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<=a;c<=b;$display(“nonblocking:a=%d,b=%d,c=%d.”,a,b,c);end endmodule 实验仿真:
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<=0;else begin result<=n*factorial(n)/((n*2)+1);end end
function [31:0] factorial;input [3:0] operand;reg [3:0] index;begin factorial=operand?1:0;for(index=2;index<=operand;index=index+1)factorial=index*factorial;end endfunction
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<=15;i=i+1)
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<任务名> <端口及数据类型声明语句> <语句1> „„ 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<=0;else begin case(opcode)3'd0: result<=pingfang(n);
Verilog实验报告
3'd1: result<=lifang(n);3'd2: result<=jiecheng(n);default: result=8'hx;endcase end end
function [7:0] jiecheng;input [3:0] operand;reg [3:0] index;begin jiecheng=operand?1:0;for(index=2;index<=operand;index=index+1)jiecheng=index*jiecheng;end endfunction
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<=IDLE;end else case(state)IDLE: state<=x ?A : IDLE;A: state<=x ?B : IDLE;B: state<=x ?C : IDLE;C: state<=x ?D :IDLE;D: state<=x ?state : IDLE;
default:state=IDLE;endcase assign z=(state==D);endmodule
Verilog实验报告
实验仿真:
测试程序:
`timescale 1ns/1ns `include “./lianxiti7.v” modulelianxititop;regclk,rst;reg[23:0] data;wire[2:0] state;wirez,x;assign 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;count1<=8'b0;count_1<=3'b0;end else if(switch[0]=='b1&&count_1<4)count_1<=count_1+1;else case(state1)
state1_start: if(switch[0]=='b1)begin state1<=state1_up;count1<=78;end
Verilog实验报告
else begin
state1<=state1_start;light[0]<='b0;end
state1_up: begin
light[0]<='b1;
state1<=state1_work;end
state1_work: if(count1>0)begin
count1<=count1-1;end else
if(switch[0]=='b0)begin
state1<=state1_down;end else begin
state1<=state1_other;
count1<=39;end
state1_other: if(switch[0]=='b1)
state1<=state1_other;else
if(count1>0)begin
count1<=count1-1;end else
state1<=state1_down;
state1_down: begin light[0]<='b0;count_1<=3'b0;state1<=state1_start;end
default: state1<=state1_start;
endcase
always@(posedge clk10)if(!rst)begin state2<=state2_start;count2<=8'b0;count_2<=3'b0;end else if(switch[1]=='b1&&count_2<4)count_2<=count_2+1;else case(state2)
state2_start: if(switch[1]=='b1)begin state2<=state2_up;count2<=78;end else begin state2<=state2_start;light[1]<='b0;end
state2_work: if(count2>0)begin count2<=count2-1;end else if(switch[1]=='b0)begin
Verilog实验报告
state2<=state2_down;end else begin
state2<=state2_other;
count2<=39;end
state2_other: if(switch[1]=='b1)
state2<=state2_other;else
if(count2>0)begin
count2<=count2-1;end else
state2<=state2_down;
state2_down: begin
light[1]<='b0;
count_2<=3'b0;
state2<=state2_start;end
state2_up: begin
light[1]<='b1;
state2<=state2_work;end
default:
state2<=state2_start;
endcase
always@(posedge clk10)if(!rst)begin
state3<=state3_start;count3<=8'b0;count_3<=3'b0;end else if(switch[2]=='b1&&count_3<4)count_3<=count_3+1;else case(state3)
state3_start: if(switch[2]=='b1)begin state3<=state3_up;count3<=78;end else begin state3<=state3_start;light[2]<='b0;end
state3_work: if(count3>0)begin count3<=count3-1;end else if(switch[2]=='b0)begin
state3<=state3_down;end else begin state3<=state3_other;
实验仿真:
测试程序:
`timescale 10ms/1ms module loutid1_t;reg clk10,rst;reg[2:0] swh;wire[2:0] light;
Verilog实验报告
count3<=39;end
state3_other: if(switch[2]=='b1)
state3<=state3_other;else
if(count3>0)begin
count3<=count3-1;end else
state3<=state3_down;
state3_down: begin
light[2]<='b0;
count_3<=3'b0;
state3<=state3_start;end
state3_up: begin
light[2]<='b1;
state3<=state3_work;end
default:
state3<=state3_start;
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;count1<=8'b0;count_1<=3'b0;end else if(switch[0]=='b1&&count_1<4)count_1<=count_1+1;else case(state1)
state1_start: if(switch[0]=='b1)
Verilog实验报告
begin
state1<=state1_up;count1<=78;end else begin
state1<=state1_start;light[0]<='b0;end
state1_work: if(count1>0)begin
count1<=count1-1;
if(switch[0]=='b0&&(state2==3'b010||state3==3'b010))begin
light[0]<='b0;state1<=state1_down;end end else
if(switch[0]=='b0)begin
state1<=state1_down;end else begin
state1<=state1_other;count1<=39;end
state1_other: if(switch[0]=='b1)
state1<=state1_other;else
if(count1>0)begin
count1<=count1-1;if(switch[0]=='b0&&(state2==3'b010||state3==3'b010))begin
light[0]<='b0;state1<=state1_down;end end else state1<=state1_down;
state1_down: begin light[0]<='b0;count_1<=3'b0;state1<=state1_start;end
state1_up: begin light[0]<='b1;state1<=state1_work;end
default: state1<=state1_start;
endcase
always@(posedge clk10)if(!rst)begin state2<=state2_start;count2<=8'b0;count_2<=3'b0;end else if(switch[1]=='b1&&count_2<4)count_2<=count_2+1;else case(state2)
state2_start: if(switch[1]=='b1)begin state2<=state2_up;count2<=78;
Verilog实验报告
end else begin
state2<=state2_start;light[1]<='b0;end
state2_work: if(count2>0)begin
count2<=count2-1;
if(switch[1]=='b0&&(state1==3'b010||state3==3'b010))begin
light[1]<='b0;state2<=state2_down;end end else
if(switch[1]=='b0)begin
state2<=state2_down;end else begin
state2<=state2_other;count2<=39;end
state2_other: if(switch[1]=='b1)
state2<=state2_other;else
if(count2>0)begin
count2<=count2-1;if(switch[1]=='b0&&(state1==3'b010||state3==3'b010))begin
light[1]<='b0;
state2<=state2_down;end end else state2<=state2_down;
state2_down: begin light[1]<='b0;count_2<=3'b0;state2<=state2_start;end
state2_up: begin light[1]<='b1;state2<=state2_work;end
default: state2<=state2_start;
endcase
always@(posedge clk10)if(!rst)begin state3<=state3_start;count3<=8'b0;count_3<=3'b0;end else if(switch[2]=='b1&&count_3<4)count_3<=count_3+1;else case(state3)
state3_start: if(switch[2]=='b1)begin state3<=state3_up;count3<=78;end else begin state3<=state3_start;
Verilog实验报告
light[2]<='b0;end
state3_work: if(count3>0)begin
count3<=count3-1;
if(switch[2]=='b0&&(state1==3'b010||state2==3'b010))begin
light[2]<='b0;state3<=state3_down;end end else
if(switch[2]=='b0)begin
state3<=state3_down;end else begin
state3<=state3_other;count3<=39;end
state3_other: if(switch[2]=='b1)
state3<=state3_other;else
if(count3>0)begin
count3<=count3-1;if(switch[2]=='b0&&(state1==3'b010||state2==3'b010))begin
light[2]<='b0;
state3<=state3_down;end end else
state3<=state3_down;
Verilog实验报告
state3_down: begin light[2]<='b0;count_3<=3'b0;state3<=state3_start;end
state3_up: begin light[2]<='b1;
state3<=state3_work;end
default:
state3<=state3_start;
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
assignswh = up | down;
light_Allm5(clk10,rst,swh,light);endmodul仿真结果:
第二篇:北航_电子实习_数字部分实验报告
报告名称:电子电路设计训练数字部
分
学院:仪器科学与光电工程学院
目录
实验报告概述:...............................................................................................................3
一、选做实验总结:.................................................................................................3(1)补充练习2:楼梯灯设计.............................................................................3(2)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序...................................................................................................................5(3)(4)(5)
二、(1)(2)(3)(4)(5)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形..................6 练习题4:运用always块设计一个8路数据选择器......................................6 练习题5:设计一个带控制端的逻辑运算电路.............................................7 练习一:简单组合逻辑设计.........................................................................7 练习三:利用条件语句实现计数分频失序电路.............................................7 练习四:阻塞赋值与非阻塞赋值得区别.......................................................8 练习五:用always块实现较复杂的组合逻辑电路........................................8 练习六:在verilog HDL中使用函数..............................................................9 必做实验总结:.................................................................................................7(6)练习七:在verilog HDL中使用任务..............................................................9(7)练习八:利用有限状态机进行时许逻辑设计..............................................10
三、实验总结及体会:............................................................................................10
四、选作程序源代码...............................................................................................11(1)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形................11(2)练习题4:运用always块设计一个8路数据选择器....................................12(3)练习题5:设计一个带控制端的逻辑运算电路...........................................13(4)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序.................................................................................................................14(5)补充练习2:楼梯灯设计...........................................................................16
图表目录
Figure 1 楼梯灯任务4..............................................................................................5 Figure 2 组合逻辑.....................................................................................................5 Figure 3 时序逻辑.....................................................................................................6 Figure 4 周期波形....................................................................................................6 Figure 5 8路数据选择器..........................................................................................6 Figure 6 逻辑运算电路.............................................................................................7 Figure 7 组合逻辑设计.............................................................................................7 Figure 8 计数分频时序电路......................................................................................8 Figure 9 阻塞赋值与非阻塞赋值得区别....................................................................8 Figure 10 always块组合逻辑电路.............................................................................9 Figure 11 使用函数..................................................................................................9 Figure 12 使用任务................................................................................................10 Figure 13 有限状态机............................................................................................10
电子电路设计训练(数字部分)实验报告
实验报告概述:
本实验报告为对四次电子电路设计训练(数字部分)实验的总结,主要包括以下四部分:
第一部分为选做实验总结,主要包括每个选择实验的设计思路、运行结果、注意事项、心得体会;
第二部分为必做实验总结,包括运行结果、总结、心得体会; 第三部分为课程总结和体会,是对全部实验及课程的总结; 第四部分为选做实验部分源代码;
一、选做实验总结:
(1)补充练习2:楼梯灯设计
设计思路:
本题给出楼梯的运行规则,并分别给与四个相应任务进行编程设计,考虑到程序的通用性及FPGA高速并行处理的优点,主要思路如下:
根据运行规则(8s内和大于8s等),对每个灯的相应状态进行编程,设计时序逻辑及有限状态机;由于在总体上看,每个灯的状态变化相对独立(只有一个人上楼除外),故对每个灯编程所得到的程序代码可通用于其它灯(只需要改变相应寄存器定义即可),此即为灯控制模块,对4个不同的任务,只需设计其它部分判断逻辑,即可完成任务要求;如此设计,可大大提高程序设计效率、易用性,同时如果面对更多的灯控制需要,也可快速进行修改部署。
下面针对不同任务给出不同处理方法:
任务1/任务3:由于任务1和任务3在定义上有很大相同点,比如同样是一个人走楼梯,若不考虑一个人同时在两层使两个灯亮,则事实上就是一个人始终只能使一盏灯亮,亮起后盏时熄灭前一盏;在保持每个灯控制模块不改变的情况下,利用非阻塞赋值,判断该人目前所处状态及位置(上楼/下楼,楼层),同时规定输出,同时只能亮一盏灯;
任务2:由于输入信号已被赋值给寄存器变量,此时只需在系统时钟作用下对寄存器中输入变量进行判断,满足要求即为正确信号,再输入灯控制模块;
任务4:由于已有灯控制模块,此时只需结合任务2防抖电路,直接输出状态信号所对应的结果即可;
(单个)灯控制模块代码:
always @(posedgeclk)begin signal_test[0]<=signal[0];if(signal_test[0]==signal[0])
begin
i0=i0+1;
end else
i0=0;if(i0>=5)
begin signal_reg[0]=signal[0];
end
if(state0==light_off)
begin
k0=0;
k0a=0;
k0b=0;
end else
k0=k0+1;
case(signal_reg[0])
1: if(!reset)
begin
state0=light_off;
end
else
begin
k0a=k0a+1;*分栏显示,详细代码见报告第四部分;
运行结果:
if((k0a >= 79)&&(k0<=119))
state0=light_on12;
else
state0=light_on8;
end
0:if(!reset)
begin
state0=light_off;
end
else if(k0a==0)
state0=light_off;endcase
case(state0)
light_off:light_reg[0]=0;
light_on8:
begin light_reg[0]=1;
if(k0b==79)
state0=light_off;
else
k0b=k0b+1;
end
light_on12:
begin
light_reg[0]=1;
if(k0b==119)
state0=light_off;
else
k0b=k0b+1;
end endcase end
Figure 1楼梯灯任务4
Figure 2楼梯灯信号防抖部分放大结果
(2)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序
设计思路:
纯组合排序中,设计sort排序任务对数列中的元素进行排序,通过调用任务实现对不同元素的排序功能,并将排序完成的结果直接输出;
冒泡排序即为每次将两个相邻数进行比较,大的数后“浮”,每一趟比较获得较大值并置于数列末位;
根据题目要求,每比较一次,即将调换位置的数字进行输出;同样设计sort任务,对两数字进行比较并排序;
通过排序控制和逻辑判断代码,控制sort任务的有效调用,进而实现冒泡排序功能;
根据设计要求,程序中只设计有一个输入端口,通过对输入信号不断移位,模拟串并行信号转换,从而完成穿行输入,并行比较的功能;
运行结果:
Figure 3组合逻辑
Figure 4时序逻辑
(3)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形
设计思路:
对输入时钟进行计数,通过if语句进行判断,若满足判断条件,则按要求改变输出信号;如此循环往复,即可产生所需单周期形状的周期波形;
运行结果:
Figure 5周期波形
(4)练习题4:运用always块设计一个8路数据选择器
设计思路:
利用define宏定义预先定义,利于后期程序功能的扩充和调整;同时利用case语句判断信号,并将相对应信号输出,进而完成系统目标功能;
运行结果:
Figure 68路数据选择器
(5)练习题5:设计一个带控制端的逻辑运算电路
设计思路:
设计三个函数分别完成三个要求的计算,通过函数调用实现相应功能;设计的控制端为同步控制端,需要通过时钟信号从而进行检测复位;
运行结果:
Figure 7逻辑运算电路
二、必做实验总结:
(1)练习一:简单组合逻辑设计
语法要点:
Assign语句构成的组合逻辑电路,若输入a,b改变,则输出equal;
利用assign equal=(a==b)?1:0语句,可同时完成判断赋值功能,大大减少代码量; 运行结果:
Figure 8组合逻辑设计
(2)练习三:利用条件语句实现计数分频时序电路
语法要点:
此程序主要练习了对输入时钟进行计数,判断,从而实现分频输出;
在实际应用中,可以通过该方式获得不同占空比或频率的信号供系统使用;
课本程序问题修改:
课本测试程序中未定义F10M_clk变量,故应将测试程序fdivision_TOP中出现的该变量改为已定义的F10M;
运行结果:
Figure 9计数分频时序电路
(3)练习四:阻塞赋值与非阻塞赋值的区别
语法要点:
阻塞赋值呈现的是一种立即赋值的状态,即同一个变量在前后语句中用到,语句间的顺序会影响到输出的结果;
非阻塞赋值对每一个块中语句间的相对位置没有要求,只在该块语句全部运行完成后同一进行赋值;
运行结果:
Figure 10阻塞赋值与非阻塞赋值得区别
(4)练习五:用always块实现较复杂的组合逻辑电路
语法要点:
Always@实现了对若干输入信号的敏感,即只要有一个信号改变,输出即改变; 通过case语句,实现了选择性输出,对不同功能进行综合;
运行结果:
Figure 11 always块组合逻辑电路
(5)练习六:在verilog HDL中使用函数
语法要点:
函数最基本功能即实现计算,通过对不同函数定义,实现不同的计算功能;同时定义函数,可以利于在该模块外对某函数功能的调用,增强了程序的通用性和功能性,同时可以使程序结构更加清晰,易读易懂;
运行结果:
Figure 12使用函数
(6)练习七:在verilog HDL中使用任务
语法要点:
相比函数,任务的调用功能更强大,可以实现运算并输出多个结果的功能,同时任务并不返回计算值,只通过类似C语言中的形参和实参的数据交换,实现功能;任务的定义和调用可
以只程序结构更明晰,功能更丰富;
程序中通过对比较顺序的设计,实现了对4个数字,进行5次比较即可成功完成排序功能的目的;
运行结果:
Figure 13使用任务
(7)练习八:利用有限状态机进行时许逻辑设计
语法要点:
设计有限状态机主要需要进行状态分配,状态编码,然后利用case语句进行判断,从而改变相应状态,实现状态转移和输出变换;
对涉及时钟的一般时序逻辑,主要运用非阻塞(〈=)赋值完成功能;
课本程序问题修改:
在modelsim 10中,测试文件时钟无法仿真,故只能保持与课本测试文件相同的思路,重新编写测试文件,仿真结果如下,与课本完全一致;
运行结果:
Figure 14有限状态机
三、实验总结及体会:
通过半个学期的学习和实验,我初步掌握了verilogHDL语言和modelsim软件,可以通过编程实现数字电路基础中几乎全部简单逻辑芯片的功能,同时可以用编程实现相对复杂一点的逻辑电路和功能.总体而言,四次实验内容相对简单,几乎是在课后实验的基础上稍稍做了提高,以利于我们掌握并巩固课上学习的知识。有几个课后实验内容,按照程序输入后无法进行波形仿真,在改正一些错误定义,或者重写测试程序后,都能顺利完成实验任务。通过实验上机,巩固了我们的理论知识,加强了实际运用的能力,对整个课程的学习起到了很好的作用。
最后一个补充实验相对复杂,但实现的方法却可以有很多,在实际写代码前进行构思分析,在这个实验中显得尤为重要,例如,如何发挥FPGA并行处理的能力,如何提高程序的通用性,能够将所设计的模块结构同时完成四个任务,如何设计代码提高效率的同时节省硬件资源„„都是在设计构思中不得不考虑的环节,因此,通过最后一个实验的设计,能够很好的锻炼我们解决实际生活中问题的能力,使我们对所学的知识能够真正有所使用。
运用verilog HDL语言进行硬件电路设计,已成为未来电路设计的主要趋势,学习这门语言及相应软件,能够帮助我们在以后的学习及科研中,大大提高我们的效率,使我们能够快速搭建实验平台,完成目标功能。
虽然8周的课,时间相对较短,但通过这8周的学习,我对verilog HDL语言有了全面的认识,对基本的语法都有了很好的掌握,虽然时间有限,不能对verilog HDL语言有更深入的认识,但通过这8周的学习,我为我将来进一步深化使用这个工具打下了坚实的基础。
四、选作程序源代码(1)练习题3:利用10MB的时钟,设计一个单周期形状的周期波形 主程序:
module fdivison_2(RESET,F10M,clk_out,j);input F10M,RESET;output clk_out;output[12:0] j;
regclk_out;
reg[12:0] j;always @(posedge F10M)begin if(!RESET)begin clk_out<=0;j<=0;end
else begin if(j==199)
begin
j<=j+1;clk_out<=1;
end
else if(j==299)
begin
j<=j+1;clk_out<=0;
end
else if(j==499)
j<=0;
else j<=j+1;end end
endmodule
output[3:0] out;
reg[3:0] out;
always @(a or b or c or d or e or f or g or h or selet)
begin
case(selet)
`s1:out=a;
`s2:out=b;
`s3:out=c;
`s4:out=d;
`s5:out=e;
`s6:out=f;
`s7:out=g;
`s8:out=h;default:out=4'hz;endcase
end
endmodule
测试程序: `timescale 1 ns/1 ns
module muxtest;
wire[3:0] out;reg[3:0] a,b,c,d,e,f,g,h;reg[2:0] selet;
parameter times1=8;
initial
begin
a=0;
b=1;
c=2;d=3;
e=4;
f=5;
g=6;
h=7;selet=3'h0;
repeat(5)测试程序:
`timescale 1ns/100ps `define clk_cycle 50 module TOP_2;reg F10M,RESET;wire clk;wire[12:0] j;always #`clk_cycle
F10M = ~F10M;
initial
begin
RESET=1;
F10M=0;
#100 RESET=0;
#100 RESET=1;
#10000 $stop;
end
fdivison_2 fdivison_2(.RESET(RESET),.F10M(F10M),.clk_out(clk),.j(j));
endmodule
(2)练习题4:运用always块设计一个8路数据选择器
主程序: `define s1 3'd0 `define s2 3'd1 `define s3 3'd2 `define s4 3'd3 `define s5 3'd4 `define s6 3'd5 `define s7 3'd6 `define s8 3'd7
module mux_8(a,b,c,d,e,f,g,h,selet,out);
input[3:0] a,b,c,d,e,f,g,h;
input[2:0] selet;
begin
#100 selet=selet+1;
end
selet=0;repeat(times1)
begin
#100 selet=selet+1;
a={$random}%16;
b={$random}%16;
c={$random}%16;
d={$random}%16;
e={$random}%16;
f={$random}%16;
g={$random}%16;
h={$random}%16;
end
#100 $stop;
end
mux_8 m0(a,b,c,d,e,f,g,h,selet,out);endmodule
(3)练习题5:设计一个带控制端的逻辑运算电路
主程序:
`define sqrR 4'd0 `define triR 4'd0 `define factR 4'd0
module sqr(a,reset,clk,sqr_out,tri_out,fact_out);
input[3:0] a;input reset,clk;output[7:0] sqr_out,tri_out,fact_out;reg[7:0] sqr_out,tri_out,fact_out;
always @(posedgeclk)begin
if(!reset)
{sqr_out,tri_out,fact_out}={`sqrR,`triR,`factR};
else
begin
sqr_out=sqr_cal(a);tri_out=tri_cal(a);fact_out=fact_cal(a);
end end
function[7:0] sqr_cal;
input[3:0] a;
begin sqr_cal=a*a;
end endfunction
function[7:0] tri_cal;
input[3:0] a;
begin tri_cal=a*a*a;
end endfunction
function[7:0] fact_cal;
input[3:0] a;
begin
if(a>5)fact_cal=0;
else
begin
case(a)
0:fact_cal=1;
1:fact_cal=1;
2:fact_cal=2;
3:fact_cal=6;
4:fact_cal=24;
5:fact_cal=120;endcase
end
end endfunction
endmodule
测试程序:
`timescale 1 ns/100 ps `define clk_cycle 50
module sqrTEST;
reg[3:0] a,i;regreset,clk;
wire[7:0] sqr_out,tri_out,fact_out;
initial
begin clk=0;
a=0;
reset=1;
#100 reset=0;
#100 reset=1;
for(i=0;i<=6;i=i+1)
begin
#200 a=i;
end
#100 $stop;
end
always #`clk_cycleclk=~clk;
sqr m(a,reset,clk,sqr_out,tri_out,fact_out);
endmodule
(4)练习题6:用两种不同的设计方法设计一个功能相同的模块,完成4个数据的冒泡排序
组合逻辑实现程序:
module bub(ai,bi,ci,di,ao,bo,co,do);
input[7:0] ai,bi,ci,di;output[7:0] ao,bo,co,do;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n;
parameter so=4;
//
always @(ai or bi or ci or di)begin
{ar,br,cr,dr}={ai,bi,ci,di};
for(n=so;n>1;n=n-1)
//
bb(ar,br,cr,dr,n);
{ao,bo,co,do}={ar,br,cr,dr};end
task bb;
// inout[7:0] x1,x2,x3,x4;
input[3:0] n;
// reg[7:0] temp;reg[3:0] s;
if(n>0)
for(s=1;s begin case(s) 1:sort2(x1,x2);2:sort2(x2,x3); 3:sort2(x3,x4);endcase end endtask task sort2;inout[7:0] x,y;reg[7:0] temp; if(x>y) begin temp=x; x=y; y=temp; end endtask endmodule 组合逻辑测试程序: `timescale 1 ns/100 ps module bubTEST;reg[7:0] ai,bi,ci,di;wire[7:0] ao,bo,co,do; initial begin ai=0;bi=0;ci=0;di=0; repeat(4) begin #100 ai={$random}%256; bi={$random}%256; ci={$random}%256; di={$random}%256; end #100 $stop; end bub m0(ai,bi,ci,di,ao,bo,co,do); endmodule 时序逻辑实现程序: module bub_1(in,clk,ar,br,cr,dr,ao,bo,co,do); input[7:0] in;input clk;output[7:0] ao,bo,co,do;output[7:0] ar,br,cr,dr;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n,s,q; parameter so=4; initial begin n=0; s=0; q=0; end always @(posedgeclk)begin if(n<=so) begin n=n+1;ar<=in;br<=ar;cr<=br;dr<=cr; end if(n==so+1) begin n<=so+2; s<=so; q<=1; end if(s>1) begin {ao,bo,co,do}<={ar,br,cr,dr}; if(q begin case(q) 1:sort2(ar,br); 2:sort2(br,cr); 3:sort2(cr,dr);endcase q<=q+1; end else begin s<=s-1; q<=1; end end end task sort2;inout[7:0] x,y;reg[7:0] temp; if(x>y) begin temp=x; x=y; y=temp; end endtask endmodule 时序逻辑测试程序: `timescale 1 ns/100 ps module bubTEST_1;reg[7:0] in;regclk; wire[7:0] ao,bo,co,do,ar,br,cr,dr; initial begin clk=0; in=0; begin repeat(4) #100 in={$random}%256; end #100 $stop; end always #50 clk=~clk; bub_1 m0(in,clk,ar,br,cr,dr,ao,bo,co,do); endmodule (5)补充练习2:楼梯灯设计 主程序: module final2(signal,reset,clk,light); input[2:0] signal; input reset,clk; output[2:0] light; reg[2:0] signal_reg,light_reg,light_test,signal_test; reg[11:0] k0,k1,k2,k0a,k1a,k2a,k0b,k1b,k2b; reg[1:0] state0,state1,state2; reg[3:0] i0,i1,i2; parameter light_off=2'b00,light_on8=2'b01,light_on12=2'b10;initial begin k0=0;k1=0;k2=0; k0a=0;k1a=0;k2a=0; k0b=0;k1b=0;k2b=0; i0=0;i1=0;i2=0;light_reg=3'b000; state0=light_off; state1=light_off; state2=light_off;signal_reg=0;signal_test=signal;end // // always @(posedgeclk)begin signal_test[0]<=signal[0];if(signal_test[0]==signal[0]) begin i0=i0+1; end else i0=0;if(i0>=5) begin signal_reg[0]=signal[0]; end if(state0==light_off) begin k0=0; k0a=0; k0b=0; end else k0=k0+1; case(signal_reg[0]) 1: if(!reset) begin state0=light_off; end else begin k0a=k0a+1; if((k0a >= 79)&&(k0<=119)) state0=light_on12; else state0=light_on8; end 0:if(!reset) begin state0=light_off; end else if(k0a==0) state0=light_off;endcase case(state0) light_off:light_reg[0]=0; light_on8: begin light_reg[0]=1; if(k0b==79) state0=light_off; else k0b=k0b+1; end light_on12: begin light_reg[0]=1; if(k0b==119) state0=light_off; else k0b=k0b+1; end endcase end always @(posedgeclk)begin signal_test[1]<=signal[1];if(signal_test[1]==signal[1]) begin i1=i1+1; end else i1=0; if(i1>=5) begin signal_reg[1]=signal[1]; end if(state1==light_off) begin k1=0; k1a=0; k1b=0; end else k1=k1+1; case(signal_reg[1]) 1: if(!reset) begin state1=light_off; end else begin k1a=k1a+1; if((k1a >= 79)&&(k1<=119)) state1=light_on12; else state1=light_on8; end 0:if(!reset) begin state1=light_off; end else if(k1a==0) state1=light_off;endcase case(state1) light_off:light_reg[1]=0; light_on8: begin light_reg[1]=1; if(k1b==79) state1=light_off; else k1b=k1b+1; end light_on12: begin light_reg[1]=1; if(k1b==119) state1=light_off; else k1b=k1b+1; end endcase end // // always @(posedgeclk)begin signal_test[2]<=signal[2];if(signal_test[2]==signal[2]) begin i2=i2+1; end else i2=0;if(i2>=5) begin signal_reg[2]=signal[2]; end if(state2==light_off) begin k2=0; k2a=0; k2b=0; end else k2=k2+1; case(signal_reg[2]) 1: if(!reset) begin state2=light_off; end else begin k2a=k2a+1; if((k2a >= 79)&&(k2<=119)) state2=light_on12; else state2=light_on8; end 0:if(!reset) begin state2=light_off; end else if(k2a==0) state2=light_off;endcase case(state2) light_off:light_reg[2]=0; light_on8: begin light_reg[2]=1; if(k2b==79) state2=light_off; else k2b=k2b+1; end light_on12: begin light_reg[2]=1; if(k2b==119) state2=light_off; else k2b=k2b+1; end endcase casex(light_reg) 3'b000:light_test=000; 3'b001:light_test=001; 3'b01x:light_test=010; 3'b1xx:light_test=100;endcase end assign light=light_test;endmodule 测试程序: `timescale 10ms/10ms module final_TOP2;reg[2:0] signal;regclk,reset; wire[2:0] light; initial begin clk=0; reset=1; #2 reset=0; #10 reset=1; #10 signal=3'b111; #10 signal=3'b000; #900 signal=3'b111; #100 signal=3'b000; #900 signal=3'b011; #100 signal=3'b000; #900 signal=3'b001; #900 signal=3'b000; #100 $stop;end always #5 clk=~clk; final2 m(signal,reset,clk,light);endmodule 实验一: QUARTUS II 软件使用及组合电路设计仿真 实验目的: 学习QUARTUS II 软件的使用,掌握软件工程的建立,VHDL源文件的设计和波形仿真等基本内容。 实验内容: 1.四选一多路选择器的设计 基本功能及原理 : 选择器常用于信号的切换,四选一选择器常用于信号的切换,四选一选择器可以用于4路信号的切换。四选一选择器有四个输入端a,b,c,d,两个信号选择端s(0)和s(1)及一个信号输出端y。当s输入不同的选择信号时,就可以使a,b,c,d中某一个相应的输入信号与输出y端接通。 逻辑符号如下: 程序设计: 软件编译: 在编辑器中输入并保存了以上四选一选择器的VHDL源程序后就可以对它进行编译了,编译的最终目的是为了生成可以进行仿真、定时分析及下载到可编程器件的相关文件。仿真分析: 仿真结果如下图所示 分析: 由仿真图可以得到以下结论: 当s=0(00)时y=a;当s=1(01)时y=b;当 s=2(10)时y=c;当s=3(11)时y=d。符合我们最开始设想的功能设计,这说明源程序正确。2.七段译码器程序设计 基本功能及原理: 七段译码器是用来显示数字的,7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用VHDL译码程序在FPGA或CPLD中实现。本项实验很容易实现这一目的。输出信号的7位分别接到数码管的7个段,本实验中用的数码管为共阳极的,接有低电平的段发亮。数码管的图形如下 七段译码器的逻辑符号: 程序设计: 软件编译: 在编辑器中输入并保存了以上七段译码器的VHDL源程序后就可以对它进行编译了,编译的最终目的是为了生成可以进行仿真、定时分析及下载到可编程器件的相关文件 。仿真分析: 仿真结果如下图所示: 分析: 由仿真的结果可以得到以下结论: 当a=0(0000)时led7=1000000 此时数码管显示0; 当a=1(0001)时led7=1111001 此时数码管显示1; 当a=2(0010)时led7=0100100 此时数码管显示2; 当 a=3(0011)时led7=0110000 此时数码管显示3; 当 a=4(0100)时led7=0011001 此时数码管显示4; 当 a=5(0101)时led7=0010010 此时数码管显示5; 当 a=6(0110)时led7=0000010 此时数码管显示6; 当 a=7(0111)时led7=1111000 此时数码管显示7; 当 a=8(1000)时led7=0000000 此时数码管显示8; 当a=9(1001)时led7=0010000 此时数码管显示9; 当a=10(1010)时led7=0001000 此时数码管显示A; 当a=11(1011)时led7=0000011 此时数码管显示B; 当 a=12(1100)时led7=1000110 此时数码管显示C; 当a=13(1101)时led7=0100001 此时数码管显示D; 当a=14(1110)时led7=0000110 此时数码管显示E; 当a=15(1111)时led7=0001110 此时数码管显示F; 这完全符合我们最开始的功能设计,所以可以说明源VHDL程序是正确的。 实验心得: 通过这次实验,我基本掌握了QUARTUS II软件的使用,也掌握了软件工程的建立,VHDL源文件的设计和波形仿真等基本内容。在实验中,我发现EDA这门课十分有趣,从一个器件的功能设计到程序设计,再到编译成功,最后得到仿真的结果,这其中的每一步都需要认真分析,一遍又一遍的编译,修改。当然,中间出现过错误,但我依然不放弃,一点一点的修改,验证,最终终于出现了正确的仿真结果,虽然有一些毛刺,但是总的来说,不影响整体的结果。 实验二:计数器设计与显示 实验目的: (1)熟悉利用QUARTUS II中的原理图输入法设计组合电路,掌握层次化的设计方法; (2)学习计数器设计,多层次设计方法和总线数据输入方式的 仿真,并进行电路板下载演示验证。实验内容: 1.完成计数器设计 基本功能及原理: 本实验要设计一个含有异步清零和计数使能的4位二进制加减可控计数器,即有一个清零端和使能端,当清零端为1时异步清零,即所有输出值都为0,当使能端为0时,计数器停止工作,当使能端为1时,正常工作,由时钟控制。另外,还应该有一个控制端,当控制端为0时,进行减法运算,当控制端为1时,进行加法运算。输出端有输出值和进位端,当进行加法运算时,输出值递增,当减法运算时,输出值递减,同时进位端进行相应的变化。 4位二进制加减计数器的逻辑符号: 程序设计: 软件编译: 在编辑器中输入并保存了以上4位二进制加减计数器的VHDL源程序后就可以对它进行编译了,编译的最终目的是为了生成可以进行仿真、定时分析及下载到可编程器件的相关文件。仿真分析: 仿真结果如下: 分析: 由仿真图可以得到以下结论: 当enable端为0时,所有数值都为0,当enable端为1时,计数器正常工作;当reset端为1时,异步清零,所有输出数值为0,当reset端为0时,正常工作;当updown端为0时,进行减法运算,当updown为1时,进行加法运算;另外,当程序进行减法运算时,出现借位时,co为1,其余为0,当进行加法运算时,出现进位时,co为1,其余为0。图中所有的功能与我们设计的完全一样,所以说明源程序正确。2.50M分频器的设计 基本功能及原理: 50M分频器的作用主要是控制后面的数码管显示的快慢。即一个模为50M的计数器,由时钟控制,分频器所有的端口基本和上述4位二进制加减计数器的端口一样,原理也基本相同。分频器的进位端(co)用来控制加减计数器的时钟,将两个器件连接起来。50M分频器的逻辑符号如下: 程序设计: 软件编译: 在编辑器中输入并保存了以上50M分频器的VHDL源程序后就可以对它进行编译了,编译的最终目的是为了生成可以进行仿真、定时分析及下载到可编程器件的相关文件。仿真分析: 结果如下: 上图为仿真图的一部分,由于整个图太大,所以显示一部分即可,其余部分如图以上图规律一直递增,直到50M为止,然后再重复,如此循环。 上图是部分输出的显示,由于整个图太大,所以只显示部分,其余部分如图递增。 分析: 由仿真图可以看出,当reset为0,enable为1时(因为本实验中计数器的模值太大,为了尽可能多的观察出图形,可让reset一直为0,enable一直为1,即一直正常工作),输出值由0一直递增到50M,构成一个加法计数器,与我们设计的功能一致。3.七段译码器程序设计 基本功能及原理: 七段译码器是用来显示数字的,7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用VHDL译码程序在FPGA或CPLD中实现。本项实验很容易实现这一目的。输出信号的7位分别接到数码管的7个段,本实验中用的数码管为共阳极的,接有低电平的段发亮。 七段译码器的逻辑符号: 程序设计: 软件编译: 在编辑器中输入并保存了以上七段译码器的VHDL源程序后就可以对它进行编译了,编译的最终目的是为了生成可以进行仿真、定时分析及下载到可编程器件的相关文件。仿真分析: 仿真结果如下图所示: 分析:具体分析与实验一中七段译码器的分析相同,在此不再赘述。计数器和译码器连接电路的顶层文件原理图: 原理图连接好之后就可以进行引脚的锁定,然后将整个程序下载到已经安装好的电路板上,即可进行仿真演示。 实验心得: 经过本次试验,我学到了很多。首先,我加强了对QUARTUS II软件的掌握;其次,我掌握了电路图的顶层文件原理图的连接,学会了如何把自己设计的程序正确的转化为器件,然后正确的连接起来,形成一个整体的功能器件;最后,我学会了如何安装以及如何正确的把完整的程序下载到电路板上,并进行演示验证。 实验三:大作业设计 (循环彩灯控制器) 实验目的: 综合应用数字电路的各种设计方法,完成一个较为复杂的电路设计。实验内容: 流水灯(循环彩灯)的设计 设计任务: 设计一个循环彩灯控制器,该控制器可控制10个发光二极管循环点亮,间隔点亮或者闪烁等花型。要求至少三种以上花型,并用按键控制花型之间的转换,用数码管显示花型的序号。基本原理: 该控制器由两部分组成,一部分是一个50M的分频器,其主要用来控制花色变化的快慢;另一部分是一个彩灯控制器,该彩灯控制器可由两个开关控制花型的序号,10个输出分别控制10个发光二极管的亮暗,当输出为1时,该发光二极管亮,输出为0时,该二极管灭。将分频器的co端用来控制彩灯控制器的时钟,将两个器件连接起来。1.分频器的设计 50M分频器与实验二中的分频器一样,这里不再赘述。2.彩灯控制器的设计 基本原理: 该彩灯控制器由时钟控制,reset异步清零,enable当做使能端,由两个开关do(0-1)来控制选择不同的花型,10个输出端lig(0-9)来控制10个LED灯的亮灭。因为用了两个开关来控制花型,所以一共有4种花色。 彩灯控制器的逻辑符号: 程序设计: 3.七段译码器的设计 七段译码器是用来显示不同花型的序号的,其设计与实验一中的设计一样,这里不再赘述。循环彩灯控制器的原理图: 仿真波形如下: 第一种花型: 第二种花型: 第三种花型: 第四种花型: 仿真分析: 将以上仿真波形图和源程序对比,我们可以看到,仿真出来的波形和我们设计的功能一致,这说明源VHDL程序是正确的。实验心得: 本次试验是在没有老师指导的情况下自己完成的,我在参考了网上的程序的情况下,最终成功的设计并正确的演示出了循环彩灯的不同花型。通过本次试验,我真正的体会到了DEA这门课的乐趣,也发现它对我们的学习和生活带来很大的方便。 EDA课程实验报告 ----移位相加8位硬件乘法器电路计 ou 1 移位相加硬件乘法器设计 一.实验目的 1、学习移位相加8 位硬件乘法器电路设计; 2、学习应用EDA 技术进行项目设计的能力 二.实验原理 该乘法器是由8位加法器构成的以时序方式设计的8位乘法器。其乘法原理是:乘法通过逐项移位相加原理来实现,从被乘数的最低位开始,若 为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。 实验箱内部结构图 : 三.实验设备 1.安装QUARTUS II 软件的PC一台; 2.实验箱一个 四.实验步骤 1.输入下列VHDL程序: 2.编译程序,并连接实验箱并下载 3.在实验箱上按下列要求进行设置: ①选择模式1 ②CLKK控制移位相加速度,接clock0=4Hz ③A[7..0]、B[7..0]输入数据 显示于此4个数码管上 ④DOUT[15..0]接数码管8/7/6/5,显示16位乘积:PIO31—PIO16 ⑤接键8(PIO49):高电平清0,低电平计算允许 ⑥A[7..0]接键2/1,输入8位乘数 PIO7—PIO0(模式1)⑦B[7..0]接键2/1,输入8位被乘数 PIO7—PIO0(模式1) 五.实验结果 实验程序编译运行后RTL电路图 ou 1)2 (模式 实验RTL电路 A[7..0]接键2/1,输入8位乘数:A2(十六进制)B[7..0]接键4/3,输入8位被乘数:33(十六进制)可得结果DOUT[15..0]:2046(十六进制)六:心得体会 通过电子设计的数字部分EDA设计,我们掌握了系统的数字电子设计的方法,也知道了实验调试适配的具体操作方法。 通过实验,进一步加深了对EDA的了解,让我对它有了浓厚的兴趣。但是在调试程序时,遇到了不少问题,编译下载程序时,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。 ou 3 EDA 实验报告 姓名:汤灿亮 学号:2012118060 班级:1211自动化 实验一 QUARTUS Ⅱ的设计流程 一、实验目的: 1、掌握QUARTUSⅡ安装过程; 2、熟悉QUARTUSⅡ设计环境; 3、掌握QUARTUSⅡ的设计过程。 二、实验内容: 用文本输入法设计一个二进制加法器。 三、实验步骤: (一)、创建工作文件夹 在windows中新建一个文件夹(又称工作库或WORK LIBRARY),用于保存设计工程项目的有关文件。注:设计工程项目的所有有关文件不能保存在根目录下,必须保存在一个文件夹之下。例如建立的文件夹:E:CNT10 (二)、启动Quartus II 点击QUARTUSⅡ9.0图标打开QUARTUSⅡ9.0设计窗口。或点击QUARTUSⅡ9.0图标打开QUARTUSⅡ9.0设计窗口 (三)、设计文件输入 1、打开输入文件编辑器 点击菜单Filenew„选择Verilog HDL file建立一个文本设计文件。用文本输入法输入程序。 2、保存文件,文件名同程序的模块名。后缀.v (四)、全编译(逻辑综合) 1、创建工程 点击菜单FileNew Project Wizard…….进行工程设置。完成工程文件夹的选定、工程名、顶层设计文件名(主程序)、编程器件的选择等工程设置。 2、编译前的相关设置设置 ⑴选择PLD芯片:AssignmenmtsSettingsDevice弹出的窗口中选择选择芯片。 ⑵选择配置芯片的工作方式AssignmenmtsSettingsDeviceDevice&Pin Options弹出的窗口中首选General项,在Options栏中选择Auto-restart-configuration after error.⑶选择配置芯片和编程方式:AssignmenmtsSettingsDeviceDevice&Pin Options弹出的窗口中选择Configuration栏,在窗口中设置配置方式,配置芯片和是否需要生成压缩的配置文件。 ⑷选择输出设置:(1)-(4)项默认方式,可以不做任何操作,⑸选择目标器件闲置引脚的状态:AssignmenmtsSettingsDeviceDevice&Pin Options弹出的窗口中选择Unused Pins栏,在窗口中对闲置的引脚设置,推荐设置为As input tri-stated。 3、执行全程编译:ProcessingStart Compilation。完成对设计项目的检 错、逻辑综合、结构综合、配置文件生成以及时序分析。 (五)、功能仿真(或时序仿真) 建议先做功能仿真,以检验设计项目的逻辑真确性,这样可以提高设计效率。 1、功能仿真设置:AssignmenmtsSettings弹出的窗口中选择Simulator Settings。在右边Simulation mode中选择 Functional.2、ProcessingGenerate Functional Simulation netlist,生成功能仿真所需的文件。 3、建立波形文件并进行功能仿真 ⑴FileNew,在窗口中选择Vector Waveform file打开向量波形文件编辑器。 ⑵设置仿真时间区域:可默认。一般几十微妙。时间区域过长,使仿真时间变长,影响仿真效率。 ⑶在向量波形文件编辑器中添加项目的相关引脚。原则上是所有引脚,但有的项目引脚很多,可以只添加必要的一些引脚。双击向量波形文件编辑器Name栏的空白区域后,会弹出一个“Insert Node or Bus”对话框,在弹出的对话框中选择“Node Finder„”按钮,则弹出“Node Finder„”对话框,选择Filter:Pins:all,然后点击List,Nodes Found栏将列出所有输入、输出端口。选择要观察的信号,点击“>”命令按钮加入到观察目标窗口中。选择OK,则在波形图中加入了待观察信号的图形。 或者执行ViewUtility WindowsNode Finder命令打开Node Finder窗口,在弹出的窗口中将所需引脚拖入波形编辑器中。 ⑷编辑输入波形:对所有的输入引脚设置合适的波形。⑸启动仿真器:ProcessingStart Simulation.⑹观察分析仿真结果。仿真结果保存于文件“Simulation Report”,此文件在仿真完成后会自动弹出。若仿真结果有出入,重新修改程序,直到仿真结果没有问题。 (六)、下载验证: 1、芯片选择ACEX1KEP1K30QC208-2; 2、引脚锁定: 3、全编译; 4、下载线连接:将25针连下一端连接电脑LPT1口,一端连接到编程模块的DB25接口,再用十针连线一头插入通用编程模块JTGA下载接口处,另一头连接到目标芯片的下载接口。 5、打开实验箱电源,将模式选择开关CTRL的(2)(4)(8)拨至ON,使按键KD1,KD2,LED1,LED2,LED3,LED4,LED5等有效。 6、下载:ToolsProgrammer,完成下载。 7、拨动开关按键KD1,KD2验证电路。 四、实验程序及仿真结果 (一)、实验程序: 时序仿真结果: 波形文件及仿真: 五、实验箱现象描述 注:在程序正确,正确操作实验箱并成功下载并正常运行程序的前提下,现象为:实验箱上一排设定的LED灯,分别为4个表示四位二进制码,一个表示使能信号EN,一个表示复位信号RST,一个表示置数信号,一个进位位COUT,高电平时表示进位,四个用于置数的灯。EN信号高电平有效,低电平起保持作用,RST低电平有效,起复位作用,LOAD信号低电平有效,起置数作用。启动实验箱,让EN灯亮(高电平),RST灯亮(高电平),LOAD灯亮(高电平),此时表示四位二进制码的LED灯分别从0到9计数(约为1S记一个数),到10的时候,显示数的四个LED灯表示成0(全灭),进位位灯(COUT)闪动一次(表示进一位),如此反复。使EN灯熄灭(低电平),显示数的灯停止变动,保持在它当前所表示的数值。恢复EN灯亮,继续计数。使RST灯熄灭(低电平),显示数的灯立即变为全灭(表示复位为0)。设置任意值,使LOAD灯熄灭(低电平),显示灯变成设置的数值,然后正常计数。 六、心得体会 在这次实验中,QUARTUS II软件是英文版的,一下基本功能在第一次中还是不够熟悉,通过问老师同学,慢慢的了解到QUARTUS Ⅱ软件的基本使用方法,以及从编写程序到下载到实验箱验证运行的基本流程,实验二用原理图输入法设计2位频率计 一、实验目的: 1.熟悉和掌握用QUARTUS Ⅱ的原理图输入方法设计简单数字系统的方法,并通过一个2位频率计的设计掌握用EDA软件进行数字系统设计的详细流程。2.掌握用EDA技术的层次化设计方法; 3.掌握多个数码管动态显示的原理与方法 二、实验内容 用原理图输入法设计一个2位频率计 三、实验步骤 1.在顶层文件设计窗口中设计频率计,频率计的设计分成几部分设计,分别是一个2位十进制计数器,一个时序控制电路,一个显示电路模块。 2.先设计2位十进制计数器,如图显示为设计好的2位十进制计数器。 步骤:(1)、点击file—new,弹出如图所示窗口,点击design File中Block diagram/schematic file,再点击ok即可。(2)、在弹出的bdf文件设计窗口中设计所需的设计,设计完成后,点击编译按钮,编译无误后,再进行时序仿真。 结果如图: (3)、即可点击file—created/update—create symbol files for current file.生成元件符号,供高层次设计调用。注意:需要独立建立工程,2位十进制计数器的工程名和bdf文件名都为counter8。 3、设计时序控制电路,设计步骤与设计2位类似,设计完成后,一样需要设计文件符号供高层次设计调用,如图为设计好的时序控制电路。 4.在顶层设计窗口中设计顶层设计,最终的设计如图 进行时序仿真无误后进行波形仿真,结果如图: 可以从波形仿真中看出,当输入的待测信号的周期为410ns的时候,所测的的频率的最后两位为39。 四、试验箱验证及现象描述 引脚正确设定并正确下载到试验箱后,调节待测信号频率,当输入为4hz时,数码管上显示04,当输入为8hz,数码管上显示08,当输入为16HZ时,数码管 上显示为16,当输入为128hz时,数码管上显示为28。 五、心得体会 这次实验中,按照书上面的接线图,完成基本的接线,然后在电脑上面设计原理图,进行实验的测试,掌握用EDA技术的层次化设计方法,在实验中也出现过点失误,软件运行出错,经过检查,发现软件没有破解,在实验中还是要注意小细节。 实验三简易正弦波信号发生器设计 一、实验目的: 1、进一步熟悉QuartusII设计流程; 2、熟悉LMP_ROM与FPGA硬件资源的使用方法。3、熟悉SignalTap II嵌入式逻辑分析仪的使用方法。 二、实验内容 用原理图设计一个简易的正弦波信号发生器。 三、实验步骤 1.建立一个工程,取名为SIN_GNT。 2.生成.mif文件,用直接编辑法。点击file—new—memory file—memory initialization file,点击OK,选number为128位,word size为8位,点击ok,填写 表格,结果如图 3.以原理图方式对LPM_ROM进行设置和调用,在工程原理图编辑窗中双击,出现symbol框图中点击megawizard plug-in manager,在所示窗口中点击memory compiler的ROM:1-PORT,取文件名为ROM78,正弦波数据初始化文件选择DATA7X8.mif,即可生成正弦信号数据存储器ROM,如图所示 4.用原理图方式对7为计数器LPM模块,方法与制作ROM78模块类似,如图所示 5.新建一个原理图设计窗口,取名为SIN_GNT,在窗口里面设计所需的电路,结果如图,进行时序仿真,无误后建立波形文件,结果如图 由图可知,在时间脉冲的作用下,AR计数,相对于的,Q也从正弦信号数据存储器ROM中输出相对应的数值,由这两项,这可以在示波器上输出正弦波。 四、心得体会 在实验中,LPM 是参数可设置模块库Library of Parameterized Modules 的英语缩写,Altera 提供的可参数化宏功能模块和LPM 函数均基于Altera 器件的结构做了优化设计。在许多实用情况中,必须使用宏功能模块才可以使用一些Altera 特定器件的硬件功能。例如各类片上存储器、DSP 模块、LVDS 驱动器、嵌入式PLL 以及SERDES 和DDIO 电路模块等等。这些可以以图形或硬件描述语言模块形式方便调用的宏功能块,使得基于EDA 技术的电子设计的效率和可靠性有了很大的提高LPM可实现基于LPM的流水线的累加器的设计,逻辑数据采样电路设计,简易正弦信号发生器的设计 实验四用状态机实现序列检测器的设计 一、实验目的 1、熟悉状态机的作用及设计方法; 2、学习用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。 二、实验原理 序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果与检测器预先设置的码相同,则输出为1,否则输出为0。 三、实验内容 设计一个序列检测器,对1110010进行检测,对设计进行仿真测试并给出仿 真波形。 四、实验步骤 (1)运行软件,创建一个工程,取名为SHCK,打开文本文件编辑窗口,输入编写好的程序,如图所示。 取名为shiyan4,保存生成shiyan4.v文件。 (2)编译,时序仿真,直至无错误。 (3)建立波形文件,保存,取名为SHCK。设置各个需要的设置的参数,仿真时间设置为50us,时钟信号周期为4us,复位信号高电平有效,一般情况保持低电平,设置输入信号DIN含有输入数据段如图1110010,如图所示 (4)点击波形仿真,结果如图 由仿真结果可以看出,只有当输入完整的1110010时,输出信号才是高电平。(5)点击tools—netlist viewers—state machine viewers,查看状态转换表。 四、心得体会 通过本次实验掌握了如何用Verilog HDL语言实现状态机的原理,运用状态机实现序列检测器的设计,进一步掌握了课堂上所学到的知识,但同时充分的感觉到了自己的不足之处,今后一定要加强自己弱势方面的学习,用心学好EDA教科书上的知识,并抽时间在课外进行深入地学习,相信下次试验情况会有很大程度的改观第三篇:EDA实验报告
第四篇:EDA实验报告
第五篇:EDA实验报告