资源描述
可编程逻辑器件设计及应用实验报告
46
2020年5月29日
文档仅供参考
Harbin Institute of Technology
可编程逻辑器件设计及应用
实验报告
实验一:电路图方法设计:异步16分频
一、 实验内容
1、 熟悉ISE M的安装及使用
2、 熟悉电路图方式的输入方法;
3、 熟悉ISE环境下的波形仿真
4、 学习SIE安装过程
5、 建立一个新的工程(cpld 9500系列)
6、 输入电路图异步16分频,如图1-1所示:
图1-1
二 实验结果
1、异步16分频电路图如图1-2所示:
图1-2
2、 建立测试波形方法仿真激励图形,如图1-3所示:
图1-3
3、 引脚约束条件如下:
NET "CLK" LOC = "P6";
NET "CLR" LOC = "P7";
NET "O1" LOC = "P42";
NET "O2" LOC = "P37";
NET "O3" LOC = "P40";
NET "O4" LOC = "P39";
4、 最终仿真结果如图1-4,1-5所示:
图1-4
图1-5
三 实验结果讨论分析
经过本次试验,初步掌握了ISE的使用方法,经过ISE自带库文件完成电路的搭建,实现了对输入时钟的2分频,4分频,8分频和16分频,经过最终的试验验证得到了正确的试验结果。
指导教师签字:
实验二 电路图方法分层设计:全加器
一、实验内容
1、 建立一个新的工程(cpld 9500系列)
2、 建立一个独立的电路图(All_ADD)
3、 输入电路图: 一位全加器
图2-1一位全加器
4、 建立测试波形方法仿真激励图形
图2-2波形仿真激励
5、 功能仿真
记录结果,分析正确性。
6、 生成电路模块
图2-3模块建立
7、 利用电路模块设计8位全加器,(新电路图或者顶层电路图)
图2-4 8位全加器(顶层电路图)
8、 建立测试波形方法仿真激励图形
图2-5 8位全加器波形仿真激励
9、 学习总线数据预置方式:经过使用相同名字来对总线进行连接设置,和总线数据格式。
二 实验结果
一位全加器功能仿真结果:
图2-6 功能仿真结果
8位全加器功能仿真结果一(无进位):
图2-7 功能仿真结果
8位全加器功能仿真结果二(有进位):
图2-8 功能仿真结果
三 实验结果讨论分析
本次试验充分体现了模块化设计思想,首先我们运用库文件实现了一位全加器,也即实验中的ALL_ADD模块,在实现此模块后进行仿真分析,确定无误后,运用8个一位全加器实现实现8位全加器,考虑进位。
在实验中进一步熟悉了软件的使用流程和具体的实际操作如操作总线结构等基本操作,可谓知行合一。
指导教师签字:
实验三 Verilog语言方法设计:8位全加器
一、实验内容
1、 建立一个新的工程(cpld 9500系列)
2、 建立一个Verilog模块(All_ADD8)
图3-1 建立一个新的verilog模块
3、 输入全加器
图3-2 输入全加器
4、 建立测试波形方法仿真激励图形
测试波形一:
图3-3 测试波形
测试波形二:
图3-4 测试波形
5、 功能仿真
记录结果,分析正确性。
6、 建立Verilog测试模块
源代码如下:
7、 功能仿真
记录结果,分析正确性。进位结果。理解掌握语言描述。
8、 8位可预置计数器(试验扩展)
9、 建立一个Verilog模块(Counter8)
源代码如下:
`timescale 1ns / 1ps
module extentest_v;
reg [7:0] D;
reg CLK;
reg CLR;
reg PR;
wire [7:0] Q;
extendex uut
(
.D(D),
.CLK(CLK),
.CLR(CLR),
.PR(PR),
.Q(Q)
);
parameter PERIOD = 200;
always begin
CLK = 1'b0;
#(PERIOD/2) CLK = 1'b1;
#(PERIOD/2);
end
initial begin
D = 0;
CLR = 0;
PR = 0;
#100;每隔100ns变换一次输入数据
PR = 1; D = 17; CLR = 0;
#100;
PR = 0;
#100;
end
endmodule
10、 学习总线数据预置方式
11、 自己建立仿真过程(波形+Verilog测试)
二 实验结果
测试波形一结果:
图3-5 仿真测试结果
测试波形二结果:
图3-6 仿真测试结果
文件测试结果:
图3-7 仿真测试结果
更改数据测试结果:
图3-8 仿真测试结果
三 实验结果讨论分析
本次试验与上次试验的不同之处在于:上次试验是经过库文件链接电路图先实现1位全加器,在此基础上运用8个1位全加器按照逻辑链接在一起实现8位全加器,而在本次试验中,我们运用的是Verilog语言实现,个人感觉这种更加简单清楚,首先是这种方法省去了电路链接的麻烦,其次是它的实现过程中只需要编程实现模块即可,不用先生成1位全加器,然后再去实现8位全加器,编程仿真实现想要的结果后能够直接生成8位全加器模块,操作极为简单。
指导教师签字:
实验四 LED显示模块设计
一、实验内容
1、 在上一工程基础上继续做
a、 工程名称:MyProject1
b、 选择器件:Spartan3E
2、 建立LED显示模块(verilog)
图4-1 LED显示模块
l 功能说明:
a、 数据输入:4bits;
b、 数据输出;8bits;
c、 功能:翻译16进制到7段LED显示(参照显示16进制数对照表)
l 过程说明:
a、 建立Verilog模块;
b、 建立Verilog仿真;
c、 验证模块正确性;
3、 建立显示数据锁存分配模块(verilog)
图4-2 数据锁存模块
l 功能说明:
a、 数据输入:8bits。
b、 CK:锁存信号,上升沿锁存输入数据
c、 数据输出:锁存输出最后输入的两字节数据,分别对应4位输出
l 过程说明:
a、 建立Verilog模块;
b、 建立Verilog仿真;
c、 验证模块正确性;
4、 建立电路图方式顶层模块显示模块
图4-3 顶层
5、 联合验证;
二 实验结果
输入波形一:
图4-4 测试波形
得到的相应仿真结果图一:
图4-5 仿真结果
输入波形二:
图4-6 测试波形
得到的相应仿真波形结果图二:
图4-7 仿真结果
三 实验结果讨论分析
本次试验依然使用的是Verilog语言,个人觉得实现的关键之处在于输入输出的对应,我们对照共阴极发光二极管的显示模式,为每一个输入经过编程实现其对应的输出即可。
本次试验更深入了解的Verilog编程语言,以及电路设计的模块化实现,在本次试验中引入了时钟,对时钟的生成与操作有了初步的了解为下一次试验打下了基础,与此同时,我还学习到了Verilog语言一些特有的编程规则。
指导教师签字:
实验五 串行口设计
一、 实验内容
预备知识:
串行通信:数据一位一位次序发送或接收。
异步通信:它用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下: 在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(能省略),最后是停止位1。用这种格式表示字符,则字符能一个接一个地传送。
无奇、偶校验的工作模式(10位):
有奇、偶校验的工作模式(11位):
(1) 波特率:在串行通信中,用波特率来描述数据的传输速度,所谓波特率,即每秒钟传送的二进制位数,其单位是bps(bits per second).它是衡量串行数据速度快慢的重要指标.
国际上规定的一个标准波特率系列:
110,300,600,1200,1800,2400,4800,9600,14.4K,19.2K,28.8K,33.6K,56Kbps
(2) 奇偶校验:对传送数据中1的个数进行校验,若二者不一致,则说明数据传送过程中出现了差错.奇偶校验的特点是按字符校验,数据传输速度将受到影响,一般只用于异步串行通信中。
实验过程:
1、 建立一个新的工程
a、 工程名称:MyProject1
b、 选择器件:Spartan3E
2、 建立模式控制模块(verilog)
图5-1 模式控制模块
l 功能说明:
a、 DataIn:控制数据输入、8bits;低4位用于选择波特率模式,最高位用于选择奇、偶校验是否有效;
b、 WR:控制数据写入,1bit;上升沿锁存输入数据;
c、 FreOut:波特率模式选择输出,DataIn低4位,由WR上升沿锁存保持;0—9变化;大于9不变化。
d、 ModOut:奇、偶校验模式选择;DataIn最高位,由WR上升沿锁存保持;
e、 默认值:FreOut =6;ModOu=1;
l 过程说明:
a、 建立Verilog模块;
b、 建立Verilog仿真;
c、 验证模块正确性;
源代码如下:
module ModeCon(DataIn, WR, FreOut, ModOut);
input [7:0] DataIn;
input WR;
output [3:0] FreOut;
output ModOut;
reg ModOut=1;//ModOut初始值为1
reg [3:0] FreOut=6;//FreOut初始值为6
always @(posedge WR)
begin
ModOut<=DataIn[7];
if(DataIn[3:0]<9)
FreOut<=DataIn[3:0];
end
endmodule
测试代码如下:
module ModeConTest_v;
reg [7:0] DataIn;
reg WR;
wire [3:0] FreOut;
wire ModOut;
parameter PERIOD = 100; //value=时钟周期(单位ns)
always begin
WR = 1'b0;
#(PERIOD/2) WR = 1'b1;
#(PERIOD/2);
end
// Instantiate the Unit Under Test (UUT)
ModeControl uut (
.DataIn(DataIn),
.WR(WR),
.FreOut(FreOut),
.ModOut(ModOut)
);
initial begin
DataIn = 0;
WR = 0;
// Wait 100 ns for global reset to finish
#100;
DataIn=16'h12;
#100;
DataIn=16'h23;
#100;
DataIn=16'h44;
#100;
DataIn=16'h96;
// Add stimulus here
end
endmodule
3、 建立波特率发生器模块(verilog)
图5-2 波特率发生模块
l 功能说明:
a、 FreSel:波特率控制数据输入、4bits;0—9变化,对应选择波特率300、600、1200、1800、2400、4800、9600、14.4K、19.2K、28.8Kbps共10种变化。
b、 CLK:时钟射入,频率为22.1184MHz;
c、 CLK_S:对应波特率分频输出,根据FreSel输入控制数据进行对应分频,对应模式有300、600、1200、1800、2400、4800、9600、14.4K、19.2K、28.8Kbps
d、 CLK_S16:对应波特率16倍分频输出;
l 过程说明:
a、 建立Verilog模块;
b、 建立Verilog仿真;
c、 验证模块正确性;
d、 建立电路图方式顶层模块Serial
e、 连接波特率发生器模块和模式控制模块进行联合验证;
源代码如下:
module FreqMod(FreSel, CLK, CLK_S16, CLK_S);
input [3:0] FreSel;
input CLK;
output CLK_S16;
output CLK_S;
reg CLK_S=0;
reg CLK_S16=0;
reg [16:0]count=0;
reg [16:0]count_16=0;
reg [16:0]num=0;
reg [16:0]num16=0;
always @(posedge CLK)
begin
if(FreSel==0)
num<=36864;//300
else if(FreSel==1)
num<=18432;//600
else if(FreSel==2)
num<=9216;//1200
else if(FreSel==3)
num<=6144;//1800
else if(FreSel==4)
num<=4608;//2400
else if(FreSel==5)
num<=2304;//4800
else if(FreSel==6)
num<=1152;//9600
else if(FreSel==7)
num<=768;//14.4k
else if(FreSel==8)
num<=576;//19.2k
else if(FreSel==9)
num<=384;//28.8k
end
always @(posedge CLK)
begin
count<=count+1;
num16<=num/(16);
count_16=count_16+1;
if(count>=num)
begin
CLK_S<=~CLK_S;
count<=0;
end
if(count_16>=num16)
begin
CLK_S16<=~CLK_S16;
count_16<=0;
end
end
endmodule
测试代码如下:
module FreqModTest_v;
// Inputs
reg [3:0] FreSel;
reg CLK;
// Outputs
wire CLK_S16;
wire CLK_S;
parameter PERIOD = 100; //value=时钟周期(单位ns)
always begin
CLK= 1'b0;
#(PERIOD/2) CLK = 1'b1;
#(PERIOD/2);
end
// Instantiate the Unit Under Test (UUT)
BitProducer uut (
.FreSel(FreSel),
.CLK(CLK),
.CLK_S16(CLK_S16),
.CLK_S(CLK_S)
);
initial begin
// Initialize Inputs
// Wait 100 ns for global reset to finish
#100;
FreSel=1001;
// Add stimulus here
end
endmodule
4、 建立发送数据模块(verilog)
图5-3 发送数据模块
l 功能说明:
a、 DataIn:发送数据输入、8bits;
b、 WR:控制数据写入,1bit;上升沿锁存输入数据;写入后下一个CLK上升沿开始立即发送数据
c、 CLK:时钟射入,对应波特率时钟;
d、 Mod:模式输入,0对应无奇偶校验;1对应有奇偶校验;
e、 TX:串行数据输出,平时高电平,当有数据输入后,下一个CLK上升沿开始立即发送数据;
f、 BUSY:空闲指示,当TX输出时为高,其它时间为低;
l 过程说明:
a、 建立Verilog模块;
b、 建立Verilog仿真;
c、 验证模块正确性;
d、 加入顶层模块Serial
e、 进行联合验证;
源代码如下:
module TxMod(DataIn, WR, CLK, Mod, TX, BUSY);
input [7:0] DataIn;
input WR;
input CLK;
input Mod;
output TX;
output BUSY;
reg Tx=1;
reg Busy=0;
reg [7:0]data=0;
reg flag=0;
reg [3:0]count=1;
reg num=0;
always @(posedge WR)
begin
data<=DataIn;
num<=data[0]+data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+data[7];
flag<=1;
end
always @(posedge CLK)
begin
if(flag==1)
begin
Busy<=1;
if(count==1)
Tx<=0;
else if(count==2)
Tx<=data[0];
else if(count==3)
Tx<=data[1];
else if(count==4)
Tx<=data[2];
else if(count==5)
Tx<=data[3];
else if(count==6)
Tx<=data[4];
else if(count==7)
Tx<=data[5];
else if(count==8)
Tx<=data[6];
else if(count==9)
Tx<=data[7];
else if(count==10)
begin
if(Mod==0)
Tx<=1;
else if(Mod==1)
Tx<=num;
count<=0;
flag<=0;
end
count<=count+1;
end
else
Tx=1;
Busy=0;
end
endmodule
5、 建立发送数据模块(verilog)
图5-4 发送数据模块
l 功能说明:
a、 RX:串行数据输入、1bits;
b、 CLK:时钟输入,对应16倍波特率时钟。
目的:提高采样率,在第一时刻发现起始脉冲;同时对每一位进行3次采样(时间平均),已剔出干扰;
c、 Mod:模式输入,0对应无奇偶校验;1对应有奇偶校验;
d、 TX:串行数据输出,平时高电平,当有数据输入后,下一个CLK上升沿开始立即发送数据;
e、 DataOut:接收转换后数据;
f、 EN:接收完成使能,平时为第电平,接收完成后保持一个波特率周期高电平。
g、 ERR:奇偶校验错误指示,平时为第电平,接收完成后保持一个波特率周期高电平。
l 过程说明:
a、 建立Verilog模块;
b、 建立Verilog仿真;
c、 验证模块正确性;
d、 加入顶层模块Serial
进行联合验证;
二 实验结果
(1) 模式选择模块
在Mod=1时,进行如下仿真波形设置:
图5-5 测试波形设置
得到如下仿真结果:
图5-6 仿真结果
在Mod=0时,进行如下仿真波形设置:
图5-7 测试波形设置
得到如下仿真结果:
图5-8 仿真结果
在FreOut =6;ModOut=1默认值时,设置仿真测试波形如下:
图5-9 测试波形设置
得到仿真结果如下:
图5-10 仿真结果
(2) 波特率发生模块
仿真波形设置如下:
图5-11 测试波形设置
仿真结果如下:
图5-12 仿真结果
(3) 数据发送模块
仿真测试输入波形如下:
图5-13 测试波形设置
仿真结果如下:
图5-14 仿真结果
(4) 接收模块
测试波形设置如下:
图5-15 测试波形设置
仿真结果如下:
图5-16 仿真结果
图5-17 仿真结果
(5) 联合仿真验证
由上述四个模块构成的顶层文件如下图所示:
图5-18 顶层文件
对其进行波形仿真验证,测试波形设置如下图:
图5-19 测试波形
图5-20 测试波形
测试结果如下:
图5-21 仿真结果
图5-22 仿真结果
三 实验结果讨论分析
实验中的串行口模块由4个基本模块组成,分别是模式控制模块、波特率产生模块、接收模块和发送模块,本次试验令我收获最大的地方就是就是对设计流程的逐步熟悉,从模式控制模块、波特率控制模块、接收模块到发送模块一步一步实现,在每一步仿真验证后最终将每个部分合在一起实现本次试验。
本次试验耗时时间最长,前期的预备工作及其重要,多和同学讨论最终才能顺利完成本次试验。
指导教师签字:
展开阅读全文