Lab 5 模4递增计数器
集成1101班
1. 实验目的
熟悉用Quartus编译Verilog语言的方法。
掌握用Verilog HDL 语言描述模4递增计数器的方法。
学会FPGA I/O引脚分配和实现过程。
2. 实验内容
a) 使用Verilog语言实现模4递增计数器。
b) 使用Lab4中D或JK触发器作为模块单元。
c) 得到仿真波形。
d) 使用DE0开发板下载。
3. 代码分析
l 主模块实现对D_FF的调用和最后输出。输入时钟信号CP和控制信号nCR,输出NQ0和NQ1,表示一个两位二进制数。
module counter (NQ0,NQ1,CP,nCR);
output NQ0,NQ1;
input CP,nCR;
wire Q0,Q1;
D_FF F0 (Q0,~Q0,CP,nCR);
D_FF F1 (Q1,~Q1,Q0,nCR);
assign NQ0=~Q0, NQ1=~Q1;
endmodule
l D_FF模块实现用D触发器计数。当Rd=0时,Q清零;当 Rd=1时,在CP的上升沿,Q=D.
module D_FF (Q,D,CP,Rd);
output Q;
input D,CP,Rd;
reg Q;
always @(posedge CP or negedge Rd)
if (~Rd) Q <= 1'b0;
else Q <= D;
endmodule
4. 实验步骤
(1)打开Quartus9.1软件,选择“File=>New Project Wizard”,在弹出的窗口中输入项目的名称和存储位置。
(2)单击两次Next后,选择实验板的具体型号。
(3)在“File=>New”的窗口中选择建立Verilog文件。
(4)单击OK后,在Quartus窗口的右方看到该文件,写入代码后选择“File=>Save”,将文件保存在与项目文件同样的位置即可。然后可以看到如下状态:
(5)选择“Processing=》Start Compilation”开始编译,编译通过后可以查看生成的Report。
(6)选择“file->new->vector waveeform file”生成波形图,设置波形。
(7)选择“processing-》generate functional simulation netlist”,再选择“processing=》Start simulation”,生成波形。
(8)选择“assignment=》pins”设置引脚。
(9)选择“Tools=>Programmer”,此时还没有在此项目中安装硬件。选择Hardware Setup安装硬件。因为DEO板是通过USB连接,故选择USB-Blaster。然后选择Close。
(10) 回到Programmer对话框,此时已经有硬件的相关信息。单击Start开始在DEO板上运行。
5. 实验结果
在DEO开发板中测试,能实现预期结果。
输入CP接button0,nCR接sw0,输出接LEDG0和LEDG1。当保持nCR=1时,按button0,LED显示呈现00,01,10,11跳变,实现了递增计数;当nCR=0时,实现清零。
6. 实验总结
通过这个实验让我熟悉了与DEO实验板相关的一系列实验流程,掌握Quartus软件的一些常用操作。通过这次实验中编写简单的代码,复习了它的基本句法等知识,也体验了自己动手,从编写代码到最终硬件实现的快乐,学到了许多书本上学不到的东西,使我受益匪浅。
第二篇:实验报告5_高速计数器
Task Report
1. Purpose
实验目的
1、通过实验,了解高速脉冲输出PTO和PWM的原理和使用方法
2. Equipment
实验设备
Hardware and firmware硬件及固件
Software and version软件及版本
3. Processand emphases
实验流程与重点难点
3.1 实验内容
3.1.1HSC(改变增减方向)
内容:
1、利用输入I0.1的上升沿或下降沿控制HSC的计数方向;
2、I0.1的上升沿为减,I0.1的下降沿为增
3.1.2 HSC(记录脉冲)
内容:利用高速计数器,将PTO输出的脉冲个数记录下来
1、 利用HSC0的模式12实现;
2、 利用HSC0的模式4实现
3.1.3 HSC(内部程序清零)
1、 通过对初始值赋0值来清零,当脉冲再次发生后,高速计数器继续计数;
2、 中断程序清零,则高速计数器不会继续运行
3.2 实验过程
1) 电气连接
如图1所示,将电源提供的24V电压分别于PLC的24V电源接入端口相连,并且将输入方向的M与1M端口短接。
PPI CABLE端口与PLC 端口0(port0)相连,通过PPI电缆实现在线监控。
对于实验3.1.1,用导线将输入端口I0.0和I0.1引出。
对于实验3.1.2和实验3.1.3,用导线将输入端口I0.1 和I0.2引出,将Q0.0的输出接入I0.0,同时将输入方向的L+与输出方向的1L+相连,给负载供电,同时将输入方向的M与输出方向的1M短接。
图1 S7-200组成示意图
2) 端口定义
实验3.1.1中,I0.1的上升沿和下降沿来控制HSC的计数方向;
实验3.1.2中,利用HSC0模式12进行计数时,不需要外部控制,HSC0直接对Q0.0输出的PTO脉冲进行计数。利用HSC0模式4进行计数时,I0.1用于控制计数方向,I0.2用来给HSC0复位。
实验3.1.3中,I0.2用于给HSC0初始值赋0来实现清0。
3) 程序设计
实验3.1.1:
利用HSC0的模式0实现增减计数。因为HSC0的模式0由I0.0做时钟信号,因此可以通过I0.1的上升沿或下降沿对I0.0的脉冲增减计数。
因为选用了HSC0,则控制字节的存储器为SMB37,如图2所示,在初始化时给SMB37赋值为16#FC,表示当前启用HSC,并且可以更新HSC的当前值和计数方向。给HSC0写入当前值可以将数值写入SMB38中。
图2 SMB37控制字节示意图
通过I0.1的上升沿和下降沿改变计数方向,则可以在主程序中通过|P|和|N|检测I0.1的边沿跳变,然后分别给SMB37写入增减控制字。
减计数时,SMB37的值被赋为16#B4,增计数时,SMB37的值被赋为16#BC,每次给SMB赋新值后都要再次关联HSC0。
注意:在该实验中,通过给SMB37赋不同的值来实现增减计数,但是SM37.6必须保持为‘0’, 因为HSC在每次重新关联后会恢复为初始设定值,所以需要将SM37.6置为‘0’。在程序调试过程中,如果I0.1触发上升沿,则HSC0减计数,但当I0.1触发下降沿时,HSC0的值先回到初始设定值0然后随I0.0的脉冲自加。
实验3.1.2:
1、 利用HSC0的模式12实现PTO的脉冲计数
HSC0的模式12对Q0.0的输出脉冲进行计数,此时I0.0为时钟输入,而之前在电气连接时,将Q0.0的输出与I0.0相连,并且Q0.0产生PTO波形(程序中需要写一段PTO的波形产生程序)。所以只需将HSC0通过指令HDEF选择工作在模式12下,就可以对PTO的个数进行计数。
2、利用HSC0的模式4实现PTO的脉冲计数
HSC0工作在模式4下时,属于外部方向控制,内部控制字不起作用,计数器的增减由I0.1控制。与上一程序的区别仅在于指令HDEF选择模式4。虽然I0.1和I0.2分别控制计数方向和复位,但是都无需写进程序中,因为这属于硬件范畴。
实验3.1.3
1、 对初始值赋0使HSC清0,但高速计数器仍然能够继续计数
对初始值赋0可以通过给SMB38写0实现。实验要求高速计数器清0后仍然能够继续计数,则需要保持SMB37的控制位SMB37.6为‘1’,使其能够更新当前值。
该实验中Q0.0依然输出PTO波形,并且与I0.0相连,HSC0对PTO的脉冲数计数。
2、 通过中断程序清0,并且高速计数器不再继续计数
HSC0对应中断事件12,当HSC0当前计数值与预设值相等时,进入中断程序,因此可以考虑在中断程序中对HSC0清0,并且禁用HSC。
HSC0的预设值写在SMD42中,中断程序如图3所示,给SMB37写入控制字节16#40,即可以更新HSC的当前值,并且禁止HSC计数,然后给SMD38写入0,对HSC0的计数器清0(给HSC赋值后一定要再次关联HSC)。
图3 禁用HSC的中断子程序
4. What I have learned
心得与体会
1、 高速计数器一共有12种工作模式,其中模式3至模式12这9种模式下的增减方向不受控制字影响。
2、 PLC高速计数器和一般用计数器的区别主要看读取外部输入对象不同。
PLC高速计数器和PLC程序是两个不同的内部机构。PLC程序是扫描机制,读取的对象是输入映像存储器的数据。一般用计数器也是读取输入映像存储器。PLC高速计数器不是读取输入映像存储器的数据,而是直接读取输入点的数据,不受扫描周期影响。因此,PLC高速计数器一旦启动,其专用的输入点就不再刷新其对应的输入映像存储器。
5. Application range
应用范围
一般高速计数器可以与编码器结合使用,例如用来进行精确定位控制或测量位移等。采用高速计数器进行多点定位,主要为了精确定位,而定位精度既决定于高速计数器的测量,也决定于执行机构的快速性。如果采用普通输出指令,在一个扫描周期的程序执行阶段,改变的是输出印象存储器的值,PLC输出点不会立即刷新,只有在程序执行完毕后,PLC的输出印象存储器才能对输出点刷新,执行输出。因此,为增加定位精度,尽量采用立即输出指令,高速计数器不受扫描周期影响,可以立即刷新PLC输出点,提高程序执行的速率。
6. Ladder Diagram
程序清单
实验3.1.1程序 实验3.1.2程序1(HSC0的模式12) 实验3.1.2程序2(HSC0的模式4)
实验3.1.3程序1(HSC0初始值赋0方法清0) 实验3.1.3程序2(HSC0中断清0)