物理与信息工程学院
数字集成电路设计报告
设计一: 基于 Verilog HDL 的基本数字逻辑设计
设计二: 基于 Verilog HDL 的数字跑表设计
班级:
学号:
专业:
姓名:
指导老师:
2013 年 6 月制
设计一:基于 Verilog HDL 的基本数字逻辑设计
一、 设计目的
1、 熟悉 Xilinx ISE Design Suite 12.3 软件的使用
2、 掌握 Verilog 语言的进行简单的编程
3、 学会使用 Isim 或者 Modelsim 进行功能仿真和时序仿真,并检验正确性
二、 设计原理(包括步骤)
本次实验设计的功能每过一秒,LED 灯循环移位,由于实验板上所提供的时钟
频率为 100MHZ,所以首先需要将时钟分频,从而得到所需要的时钟频率 1HZ,
在此基础上,使用 Verilog 语言进行设计.
首先需要新建一个工程,点击菜单栏里面的 file 中的 new source,会弹出下面窗口,
输入所需要建的工程名字,点击 next ,将配
置改为
,点击 next,之后点击 finish,就创建了一个工程,
然后在工程窗口右击选择 new source 添加 Verilog module,
文件了。编写测首先测试文件时首先选择 simulation,
,点击 next,就可以写设计
就可以写仿真文件了。
三、 设计成果
1、模块划分
1、设计模块
2、仿真模块
2、模块设计
1、设计程序
module flowingLED(
input clk,
input reset,
output reg[7:0] led
);
reg [26:0]counter;
reg flag;//计数器
always @(posedge clk or posedge reset)
begin
if(reset)
begin
counter <= 0;
flag<=0;//归零
end
else if(counter == 27'h1000)
begin
counter <= 0;
flag<=1;
counter <= counter + 27'h1;//循环计数
flag<=0;
end
always @(posedge clk or posedge reset)
begin
led <= 8'b00000001;//置初值
else if(flag==1)
led <= {led[0],led[7:1]};//实现循环移位。。
end
else
begin
end
if(reset)
begin
end
end
endmodule
2、仿真程序
module liushuideng;
reg clk;
reg reset;
wire [7:0] led;
flowingLED uut (
.clk(clk),
.reset(reset),
.led(led)
);
always
#5 clk=~clk;
initial begin
#0 clk = 0;
reset = 0;
#40 reset=1;
#40 reset=0;
#1000000000 $stop;
end
endmodule
四、 仿真结果分析(功能仿真和时序仿真)
功能真波形图
仿:
时序仿真波形图:
从上面波形可以看出:在放大倍数比较小时,得到的波形几乎是一样的,在放大倍数比
较大时,时序仿真输出的边沿会与时钟有一定的偏离,而功能仿真无论放大多少始终与
时钟的边沿保持一致。
五、 下载目标板后实现的功能分析
复位键按下时,开始计数,并且此时 LED1 亮,当时间为 1 秒,LED2 开始
亮,LED1 熄灭,如此,实现八位循坏移位。
六、 存在问题和改进
本次设计实现的功能太过简单,主要是熟悉软件的使用以及语言的运用,
可是在这次设计过程中,却出现了语法编译可以通过,可是出现的仿真波形一直
不对,自己单独检查了好久始终观察不到自己想要的波形。如果功能想要做的更
加完善,可以再简单地增加一些按键操作,比如,按下某个按键让 LED 灯不再
继续亮,而是从头开始循环,或者按下该键停止循环,再次按下键继续循环,虽
然这些程序也是挺简单的,可是能够提高我们写程序的水平以及速度。
七、 心得体会
由于之前只接触到 Verilog 的理论知识,,没有真正使用 Verilog 语言进行编
程,初次学习使用 ISE 软件,还是有一定的难度的,在做的过程中,出现了很多
问题,可是,随着设计的进行,对 Verilog 语法的不断熟悉,刚开始需要同学的
知道,慢慢的就学会了自己找错误并不断纠正,最终使得程序能够成功运行。因
为本次设计没有确定的题目,所以自己设计的程序实现的功能相对简单,没有进
行分模块设计,相信下次设计我能在此基础上设计的功能更多,完成的速度更快。
设计二:基于 Verilog HDL 的数字跑表设计
一、 设计目的
1、 根据所学的理论知识,能够使用 Verilog 语言独立设计计时时间为 1
分钟的程序
2、 利用 ISE 进行功能仿真和逻辑仿真,比较其不同点。
二、 设计原理(包括步骤)
本次设计实现的是计时 1 分钟的程序,时间精度为 0.01 秒,由于实验板
上所提供的时钟频率为 100MHZ,因此需要将时钟进行分频,分为 1000HZ
与 100HZ,设置停止计时/继续计时,复位两个按键,用实验板上四个数
码管显示时间,当计数到 59.55 秒时,LED1 灯亮提示时间将要结束。为
模拟实际按键操作,对于按键的处理额外增加了消抖部分。
三、设计成果
1、模块划分
1、分频模块
2、计数模块
3、数码管显示模块
2、模块设计
1、分频模块
reg [29:0] count1,count2;
always@(negedge clk or posedge reset)
begin
if(reset)
count1=0;
else if(count1==49999)
count1=0;
clk1000=~clk1000;
count1=count1+1;
begin
end
begin
end
else
begin
end
begin
end
else
end
always@(negedge clk1000 or posedge reset)
begin
if(reset)
count2=0;
else if(count2==4)
count2=0;
clk100=~clk100;
count2=count2+1;
end
endmodule
对分频这一模块进行功能仿真得到的波形图如下:
分别观察 clk1000,clk100 在一个周期内的时间,可以看出分频的结果是正确的。
2、计数模块
由于本次设计分为三个模块进行仿真,所以计数模块本身不包含分频模块,所以我采用直接
在计数模块的测试文件中给出相应的 1000HZ 的频率与 100HZ 的频率,不再对 100MHZ 的
频率进行分频,最后将分频模块与计数模块的设计文件综合到一起即可。
主要程序如下:
flag1,LED2;
// LED2 为 LED1 的中间变量,根据 flag 的值判断 LED1 是否亮
reg keyout,run;
//key 的衍生内部信号
reg clr,dout1,dout2,do1,do2;
//reset 的内部衍生信号,以及 6 个消抖的内部变量
always@(posedge clk1000)
begin
dout1 <= reset;
do1 <= key;
dout2 <= dout1;
do2 <= do1;
end
//分别消抖 key 和 reset。
//先判断,清零键即复位键是否被按下。若是,无论计数到何值,
//数码管四位均被清零
//第一次按下 key,无论 clk100 的上升沿是否到来均停止
//计数,再次按下 key,从当前计数值开始计数
always@(negedge clk1000)
begin
clr <=(dout1 | dout2 | run); keyout<=(do1 | do2 ); //这里可以保证在秒表计时过程中不被清零
end
always @(posedge keyout)
begin
run=~run;
end
always@(negedge clk100)
begin
if(!clr)
begin
num0<=0;num1<=0;num2<=0;num3<=0;
end
else
begin
if(run)
begin
if((num3==5)&&(num2==9)&&(num1==5)&&(num0==9))
begin
num0<=0;num1<=0;num2<=0;num3<=0;
end
else
begin
if((num2==9)&&(num1==5)&&(num0==9))
begin
num0<=0;num1<=0; num2<=0;num3<=num3+1;
end
else
begin
if((num1==5)&&(num0==9))
begin
num0<=0; num1<=0;num2<=num2+1; num3<=num3;
end
else
begin
//停止计时/继续计时键 未被按下,则执行下列程序
//当计时到 59:59 时,从零重新开始计时
//LED 控制模块
if((num0==9))
begin
num0<=0; num1<=num1+1;num2<=num2;num3<=num3;
end
else
begin
num0<=num0+1; num1<=num1; num2<=num2; num3<=num3;
end
end
end
end
end
end
end
always@(negedge clk100)
begin
if((num3==5)&&(num2==9)&&(num1==5)&&(num0>=5))
flag1<=1;
else
begin
flag1<=0;
end
end
always@(negedge clk100)
begin
if(flag1==1) LED2=1;
else begin
LED2=0;
end
end
assign LED1=LED2;
endmodule
按键控制波形:
LED1 显示波形