累加器-分频计数器实验报告
计算机组成原理累加器实验报告
课程设计任务书目录一、实验计算机的设计 (4)1、整机逻辑框图设计 (4)2、指令系统的设计 (5)2.1数据格式 (5)2.2指令格式、指令编码、指令助记符、指令功能、操作数的寻址方式 (5)3.微操作控制部件的设计 (8)3.1微指令编码的格式设计 (8)3.2微操作控制信号设计 (8)3.3微程序顺序控制方式设计 (9)3.3.1微程序控制部件组成原理 (9)3.3.2微程序入口地址形成方法 (10)3.3.3控存的下地址确定方法 (11)3.3.4微程序在控存中的分布情况 (12)3.4微程序设计 (12)3.4.1写出每条指令对应的微程序流程图 (12)3.4.2 写出每段微程序中各微指令的二进制编码、16进制编码 (14)3.4.3写出每段微程序在控存中的存放位置 (15)目录4.设计组装实验计算机接线表 (16)5.编写调试程序 (16)二、实验计算机的调试 (18)1调试前准备 (18)2程序调试过程 (18)3调试结果 (20)4出错和故障分析 (20)三、课程设计总结 (21)四、参考文献 (21)一、验计算机的设计1 整机逻辑框图设计模型机是由运算器,控制器,存储器,输入设备,输出设备五大部分组成。
1、运算器又是有299,74LS181完成控制信号功能的算逻部件,暂存器LDR1,LDR2,及三个通用寄存器Ax,Bx,Cx等组成。
2、控制器由程序计数器PC、指令寄存器、地址寄存器、时序电路、控制存储器及相应的译码电路组成。
3、存储器RAM是通过CE和W/R两个微命令来完成数据和程序的的存放功能的。
4、输出设备有两位LED数码管和W/R控制完成的。
图1-1 模型机结构框图图1-1中运算器ALU由U7--U10四片74LS181构成,暂存器1由U3、U4两片74LS273构成,暂存器2由U5、U6两片74LS273构成。
微控器部分控存由U13--U15三片2816构成。
除此之外,CPU的其他部分都由EP1K10集成。
计数器eda实验报告
计数器eda实验报告计数器EDA实验报告引言:计数器是数字电路中常见的基本模块之一,用于计算和记录输入脉冲信号的数量。
在本次实验中,我们将使用EDA工具对计数器进行设计和分析。
通过对计数器的EDA实验,我们旨在深入了解计数器的工作原理和性能特点。
一、实验目的本次实验的目的是通过EDA工具对计数器进行设计和分析,具体包括以下几个方面:1. 了解计数器的基本原理和工作方式;2. 学习使用EDA工具进行电路设计和仿真;3. 分析计数器的性能指标,如最大计数值、计数速度等。
二、实验步骤1. 设计计数器的电路原理图;2. 使用EDA工具进行电路仿真;3. 分析仿真结果,包括计数器的计数规律、计数速度等;4. 调整计数器的参数,观察对计数结果的影响;5. 总结实验结果并提出改进意见。
三、计数器的设计原理计数器是由触发器和逻辑门组成的电路,可以实现对输入脉冲信号的计数功能。
常见的计数器包括二进制计数器、十进制计数器等。
在本次实验中,我们将设计一个4位二进制计数器。
四、EDA工具的使用我们选择使用Xilinx ISE Design Suite进行电路设计和仿真。
该工具具有强大的功能和易于使用的界面,方便我们进行计数器的设计和分析。
五、仿真结果分析通过对计数器的仿真结果进行分析,我们可以得到以下结论:1. 计数器的计数规律:根据计数器的设计原理,我们可以观察到计数器的计数规律为二进制递增。
2. 计数器的计数速度:计数器的计数速度取决于输入脉冲信号的频率和计数器的时钟频率。
通过适当调整时钟频率,我们可以实现不同速度的计数。
六、参数调整与性能改进在实验过程中,我们可以通过调整计数器的参数来改进其性能。
例如,我们可以增加计数器的位数,以提高其计数范围;或者调整计数器的时钟频率,以改变其计数速度。
通过不断优化和改进,我们可以得到更加高效和灵活的计数器设计。
七、实验总结通过本次计数器EDA实验,我们深入了解了计数器的工作原理和性能特点,并学会了使用EDA工具进行电路设计和仿真。
计数器实验报告
实验4计数器及其应用一、实验目的1、学习用集成触发器构成计数器的方法2、掌握中规模集成计数器的使用及功能测试方法二、实验原理计数器是一个用以实现计数功能的时序部件,它不仅可用来计脉冲数,还常用作数字系统的定时、分频和执行数字运算以及其它特定的逻辑功能。
计数器种类很多。
按构成计数器中的各触发器是否使用一个时钟脉冲源来分,有同步计数器和异步计数器。
根据计数制的不同,分为二进制计数器,十进制计数器和任意进制计数器。
根据计数的增减趋势,又分为加法、减法和可逆计数器。
还有可预置数和可编程序功能计数器等等。
目前,无论是TTL还是CMOS集成电路,都有品种较齐全的中规模集成计数器。
使用者只要借助于器件手册提供的功能表和工作波形图以及引出端的排列,就能正确地运用这些器件。
1、中规模十进制计数器CC40192是同步十进制可逆计数器,具有双时钟输入,并具有清除和置数等功能,其引脚排列及逻辑符号如图5-9-1所示。
图5-9-1 CC40192引脚排列及逻辑符号图中LD—置数端 CP U—加计数端 CP D—减计数端CO—非同步进位输出端BO—非同步借位输出端D0、D1、D2、D3—计数器输入端Q0、Q1、Q2、Q3—数据输出端 CR—清除端CC40192的功能如表5-9-1,说明如下:表5-9-1当清除端CR为高电平“1”时,计数器直接清零;CR置低电平则执行其它功能。
当CR 为低电平,置数端LD 也为低电平时,数据直接从置数端D 0、D 1、D 2、D 3 置入计数器。
当CR 为低电平,LD 为高电平时,执行计数功能。
执行加计数时,减计数端CP D 接高电平,计数脉冲由CP U 输入;在计数脉冲上升沿进行 8421 码十进制加法计数。
执行减计数时,加计数端CP U 接高电平,计数脉冲由减计数端CP D 输入,表5-9-2为8421码十进制加、减计数器的状态转换表。
表5-9-2加法计数减计数2、计数器的级联使用一个十进制计数器只能表示0~9十个数,为了扩大计数器范围,常用多个十进制计数器级联使用。
计数与分频电路
电工电子实验报告课程名称:电工电子基础实验B实验名称:计数与分频电路学院:计算机学院班级:学号:姓名:指导教师:学期:2019-2020 学年第2 学期电工电子实验教学中心一、实验目的1.掌握中规模集成电路计数器的逻辑功能及应用。
2.掌握用74LS161构成任意进制计数器的方法。
3.掌握数字电路多个输出波形相位关系的正确测试方法。
4.了解不均匀周期信号波形的测试方法。
二、主要仪器设备及软件软件:Multisim软件硬件:电脑三、实验原理(或设计过程)3.1 计数器工作原理计数器的基本功能是记忆加在输入端上的时钟脉冲个数。
但它的用途很广,不仅可以用来统计输入脉冲的数目,对输入脉冲进行分频,而且还可以用它来完成定时操作、数字运算、代码转换以及产生脉冲波形等特定任务。
3.2 用74LSl61设计M=7的计数器,测试并记录CP、QA、QB、QC、QD各点波形用模N的计数器构成模M的计数器(N>M),一般采用同步置数的方法。
可采用置最小数法、置“0”法和置最大数法。
基本思想是使计数器从预置状态开始计数,当计到满足模值为M的终止状态时产生置数控制信号,下一CP周期进行置数,重复计数过程,从而实现模M的计数。
3.3 设计一个分频比N=5的整数分频电路,观察并记录时钟和输出波形。
可考虑使用74LS161构成一个M=5的计数器,从M=5计数器的最高位获得N=5分频后的输出波形。
此波形的占空比是非对称的。
如下图:FinFout为了获得对称占空比的N=奇整数分频波形(N=5),可先设计一个M=|N/2|(取整)的计数器,再添加一个异或门和一个D触发器。
电路及波形如下FinF(N/2)Fout3.4 设计一个1110010的序列信号发生器,观察并记录时钟和输出波形考虑使用74LS161构成一个M=7的计数器,将计数器的输出送给数据选择器74153作为地址信号,在74153的数据输入端接入相应的序列信号码值,则74153的输出端就可以产生连续变化的序列信号。
特权同学实验一、分频计数实验说明
分频计数实验说明这个实验可以说是verilog入门最最基础的实验了,我们不做太多的理论分析,实践是硬道理。
在实验中,我们把分频输出的信号clk_div和蜂鸣器连接在一起,大家就可以真真切切的感受到什么是分频了。
下面的程序里,用了20bit 的计数器cnt,循环的计数,所以说一个周期有2的20次幂也即大约有1M分频,因为主时钟50MHz(周期就是20ns),所以20ms一个计数周期。
蜂鸣器就以20ms 的周期性发声,大家可以改变cnt的值看看效果。
大家可以直接运行同目录下的clkdivverilog的工程进行下载配置。
代码如下:module clkdiv(clk,rst_n,clk_div);input clk; //50MHzinput rst_n; //低电平复位信号output clk_div; //分频信号//---------------------------------------------------reg[19:0] cnt; //分频计数器always @ (posedge clk or negedge rst_n) //异步复位if(!rst_n) cnt <= 20'd0;else cnt <= cnt+1'b1; //寄存器cnt 20ms循环计数//----------------------------------------------------reg clk_div_r; //clk_div信号值寄存器always @ (posedge clk or negedge rst_n)if(!rst_n) clk_div_r <= 1'b0;else if(cnt == 20'hfffff) clk_div_r <= ~clk_div_r; //每20ms让clk_div_r值翻转一次assign clk_div = clk_div_r;endmodule。
分频器设计实验报告
分频器设计实验报告竭诚为您提供优质文档/双击可除分频器设计实验报告篇一:n分频器分析与设计一、实验目的掌握74190/74191计数器的功能,设计可编程计数器和n分频器,设计(n-1/2)计数器、分频器。
二、实验原理分频是对输入信号频率分频。
1、cD4017逻辑功能2、74190/74191逻辑功能3、集成计数器级联当所需计数器模数超过所选计数器最大计数状态时,需要采取多片计数器级联。
方法分为异步级联和同步级联。
4、集成计数器的编程在集成计数器的时序基础上,外加逻辑门电路等,反馈集成计数器的附加功能端,达到改变计数器时序的目的。
可采用复位编程和置数编程两种。
5、多片74190/74191计数器级联可根据具体计数需求和增减需求,选用74190或74191,选择不同功能、同步或异步设计等。
6、74190/74191计数器编程由于没有复位端,因此只能使用置数编程,置数端置为0即可异步置数。
可根据需求设计n进制加法或减法计数器。
n与译码逻辑功能如下。
7、74191组成(n-1/2)分频器电路如下图:u3计数器的两个循环中,一个循环在cp的上升沿翻转;另一个是在cp的下降沿翻转,使计数器的进制减少1/2,达到(n-1/2)分频。
三、实验仪器1、直流稳压电源1台2、信号发生器1台3、数字万用表1台4、实验箱1台5、示波器1台四、仿真过程1、按照cD4017和74191功能表验证其功能。
2、74191组成可编程计数器(1)构成8421bcD十进制加法计数器,通过实验验证正确性,列出时序表。
设计图如下仿真波形如下(2)构成8421bcD十进制减法计数器,通过实验验证正确性,列出时序表。
设计图如下:仿真波形如下篇二:数字逻辑实验报告(5分频器)实验报告课程名称:实验项目:姓名:专业:班级:学号:数字逻辑实验5分频器的原理及实现计算机科学与技术计算机14-8班计算机科学与技术学院实验教学中心20XX年12月15日实验项目名称:5分频器的原理及实现一、实验要求设计一个5分频器,使输出信号的频率是时钟脉冲信号频率的1/5。
分频器实验报告
分频器实验报告分频器实验报告引言:分频器是电子电路中常见的一种器件,它可以将输入信号的频率降低或提高到所需的频率范围内。
在本次实验中,我们将通过搭建一个简单的分频器电路来研究其工作原理和性能。
实验目的:1. 了解分频器的基本原理和工作方式;2. 掌握分频器的搭建方法;3. 研究不同参数对分频器性能的影响。
实验器材:1. 信号发生器;2. 电阻、电容、电感等被动元件;3. 示波器;4. 电源。
实验步骤:1. 搭建分频器电路:根据实验要求,选择合适的被动元件和电路拓扑,搭建分频器电路。
2. 连接信号发生器:将信号发生器的输出端与分频器电路的输入端相连。
3. 连接示波器:将示波器的探头分别连接到分频器电路的输入端和输出端。
4. 设置信号发生器:根据实验要求,设置信号发生器的频率和幅度。
5. 测试分频器性能:通过示波器观察分频器输入信号和输出信号的波形,并记录相关数据。
6. 改变参数:根据实验要求,逐步改变分频器电路中的参数,如电阻、电容、电感等,观察其对分频器性能的影响。
7. 分析实验结果:根据实验数据和观察结果,分析分频器的工作原理和性能特点。
实验结果:通过实验观察和数据记录,我们得到了以下实验结果:1. 分频器的工作频率范围:根据实验所用的被动元件和电路拓扑,我们确定了分频器的工作频率范围。
2. 分频比的变化:通过改变分频器电路中的参数,我们观察到了分频比的变化情况,并记录了相应的数据。
3. 分频器的输出波形:通过示波器观察,我们得到了分频器输出信号的波形,并分析了其特点。
讨论与分析:根据实验结果,我们可以得出以下结论:1. 分频器的工作原理:分频器通过改变输入信号的频率来实现频率的降低或提高。
2. 分频器的性能特点:分频器的性能受到电路拓扑和被动元件参数的影响,不同的参数设置会导致不同的分频比和输出波形。
结论:通过本次实验,我们深入了解了分频器的工作原理和性能特点。
分频器作为一种常见的电子电路器件,在通信、计算机等领域有着广泛的应用。
累加器实验报告心得
累加器实验报告心得引言累加器是计算机领域常用的一种数据结构,用于累加计算。
在本次实验中,我们通过设计和实现一个累加器,进一步理解了累加器的原理和基本用法。
在实验过程中,我们遇到了一些问题并加以解决,掌握了一些调试技巧。
同时,通过编程实践,我们也深入了解了累加器在计算机科学中的应用。
实验目的本次实验的主要目的是掌握累加器的基本原理,并通过编程实现一个累加器。
具体而言,我们需要实现一个简单的累加器,能够将给定数量的整数相加并输出累加结果。
理论与设计累加器的基本原理非常简单,即不断将新的值与原有值相加,然后更新为新的累加结果。
在本次实验中,我们采用了一种基于循环的设计方法。
具体而言,我们使用一个循环来不断读入新的整数,然后将其与累加结果相加,并将结果更新为新的累加结果。
直到读入的整数数量达到给定数量为止,循环结束,输出最终累加结果。
实验过程在设计和实现累加器的过程中,我们遇到了一些问题,并通过不断调试和修改最终得到了正确的结果。
首先,我们注意到累加结果的数据类型应当与输入整数的数据类型相同。
因此,我们选择使用整型作为累加器的数据类型。
接下来,我们根据实验要求,实现了一个简单的循环结构,用于读入给定数量的整数。
在循环中,我们使用一个变量存储累加结果,并在每次循环中将读入的整数与累加结果相加,并将结果更新为新的累加结果。
最后,在循环结束后,我们输出最终的累加结果。
在进行初始测试时,我们发现累加器没有正确计算出累加结果。
经过仔细检查后发现,我们没有正确初始化累加结果的值。
因此,我们在循环开始之前,给累加结果赋予一个初始值,确保计算正确进行。
随后,我们再次进行了测试,发现累加器能够正确计算累加结果。
另外,在实验过程中,我们也注意到了一些累加器的应用场景。
累加器常用于计算某个指标累积值的情况,比如经济增长、能源消耗等。
累加器可以方便地累计各个数据点的值,并计算总和。
这种累加的结果对于分析趋势和预测未来变化非常有用。
汇编语言实验报告——累加器
《汇编语言》实验报告——累加器制作2014级计算机科学与工程学院学号:姓名一、实验要求:1.显示 INPUT N:,提示用户输入数字字串2.检测输入字串的合法性,非法给出提示3.将输入数字字串转化为数值,存入变量n4.累加1~n,存入变量sum5.以十进制显示sum二、流程图:三、源代码:DATAS SEGMENTstr1 db "Input N:","$"str2 db "sum=","$"str3 db 0ah,"error","$"n dw 0sum dw 0DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXLEA dx,str1;输出提示符mov ah,9int 21hinput:mov ah,01;输入数字int 21hcmp al,0dh;判断是否为回车jz step1cmp al,"0";判断字符合法性jb errorcmp al,"9"ja errorsub al,"0";转化为ASCII码mov ah,0;此段将高位乘10push axmov ax,nshl ax,1push axmov cl,2shl ax,clpop bxadd ax,bxmov bx,0;高位与低位相加pop bxadd ax,bxmov n,axxor cx,cx;设定累加次数mov cx,njmp inputstep1:mov ax,cxsub cx,1step2:add ax,cx;求累加和loop step2mov sum,axlea dx,str2mov ah,9int 21hmov cx,0mov ax,sumstep3:mov dx,0mov bx,10;将结果除以10并把余数压进栈div bxpush dxinc cxcmp ax,0hjnz step3step4:xor ax,axpop ax ;栈内依次输出mov dx,axadd dx,30hint 21hloop step4jmp lasterror:lea dx,str3;输出错误提示语mov ah,9int 21hlast:MOV AH,4CHINT 21HCODES ENDSEND START四、实验测试截图五、实验心得:本次试验的目的在于通过编辑累加器程序来熟悉汇编语言中对循环结构的使用,其中包括循环输入字符并判断合法性、累加计算、循环输出计算结果。
数字电路 实验 计数器及其应用 实验报告
实验六计数器及其应用一、实验目的1.学习用集成触发器构成计数器的方法2.掌握同步计数的逻辑功能、测试方法及功能扩展方法3.掌握构成任意进制计数器的方法二、实验设备和器件1.+5V直流电源2.双踪示波器3.连续脉冲源4.单次脉冲源5.逻辑电平开关6.逻辑电平显示器7.译码显示器8.CC4013×2(74LS74)CC40192×3(74LS192)CC4011(74LS00)CC4012(74LS20)三、实验原理计数器是一个用以实现计数功能的时序部件,它不仅可用来计脉冲数,还常用作数字系统的定时、分频和执行数字运算以及其它特定的逻辑功能。
计数器种类很多。
计数器计数时所经历的独立状态总数为计数器的模(M)。
计数器按模可分为二进计数器(M=2n)、十进计数器(M=10n)和任意进制计数器(M≠2n、M≠10n)。
按计数脉冲输入方式不同,可分为同步计数和异步计数。
按计数值增减趋势分为:加法计数器、减法计数器和可逆(加/减)计数器。
1.用D触发器构成异步二进制加/减计数器图6-1是用四只D触发器构成的四位二进制异步加法计数器,它的连接特点是将每只D触发器接成T 触发器,再由低位触发器的Q端和高一位的CP端相连接。
若将图6-1稍加改动,即将低位触发器的Q端与高一位的CP端相连接,即构成了一个4位二进制减法计数器。
2.中规模十进制计数器、十六进制计数器(1)CC40192是同步十进制可逆计数器,具有双时钟输入,并具有清除和置数等功能。
当清除端CR为高电平“1”时,计数器直接清零;CR置低电平则执行其它功能。
当CR为低电平,置数端LD也为低电平时,数据直接从置数端D0、D1、D2、D3置入计数器。
当CR为低电平,LD为高电平时,执行计数功能。
执行加计数时,减计数端CP D接高电平,计数脉冲由CP U输入;在计数脉冲上升沿进行8421码十进制加法计数。
执行减计数时,加计数端CP U接高电平,计数脉冲由减计数端CP D 输入,表6-2为8421码十进制加、减计数器的状态转换表。
分频器实验报告
end;
architecture bhv ofcnt4is
signal c1:std_logic_vector(2 downto 0);
signal m1:std_logic;
begin
process(clk,c1)
begin
if rising_edge(clk) then
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求
(3)波形文件存盘。选择File→Save As,将以默认名为cnt10.vwf的波形文件存入文件夹d\work\cnt10中。
(4)将工程shift的端口信号节点选入波形编辑器中。
(5)编辑输入波形。
(6)启动仿真器。现在所有的设置进行完毕,选择Processing→Start Simulation命令,直到出现Simulation was successful,仿真结束。
signal c1,c2:std_logic_vector(2 downto 0);
begin
process(clk,c1)
begin
if rising_edge(clk) then
if(c1="100") then c1<="000"; else c1<=c1+1;
end if; end if;
end process;
(4)工具设置。
(5)结束设置。
3:半程编译。
编译前首先选择Processing→Start Complilation命令,启动半程编译。
4:时序仿真。
工程编译通过后
分频器实验报告
分频器实验报告
《分频器实验报告》
实验目的:通过实验分频器的工作原理,了解其在电子电路中的应用。
实验器材:信号发生器、示波器、分频器、电压表、电流表、导线等。
实验原理:分频器是一种能够将输入信号按照一定的频率分成不同频率的输出
信号的电路。
在实验中,我们将使用信号发生器产生一个特定频率的信号,然
后通过分频器将其分成不同频率的输出信号,最后通过示波器观察输出信号的
波形。
实验步骤:
1. 将信号发生器的输出端连接到分频器的输入端,将分频器的输出端连接到示
波器。
2. 调节信号发生器的频率,观察示波器上的波形变化。
3. 记录不同频率下的输出波形,并测量输出信号的电压和电流。
实验结果:通过实验我们观察到,在不同频率下,分频器的输出波形呈现出不
同的频率特性,符合分频器的工作原理。
同时,我们还测量了输出信号的电压
和电流,验证了分频器的输出特性。
实验结论:分频器是一种广泛应用于电子电路中的重要器件,通过实验我们深
入了解了分频器的工作原理和特性。
在实际应用中,分频器可以用于信号处理、通信系统、音频设备等领域,具有重要的应用价值。
通过本次实验,我们不仅对分频器有了更深入的了解,同时也提高了对电子电
路原理的理解和应用能力。
希望通过今后的实验和学习,能够更加深入地掌握
电子电路的知识,为未来的科研和工程实践打下坚实的基础。
数电实验报告3.2-二十九进制计数器-分频器
数电实验报告3.2-二十九进制计数器-分频器<时序逻辑电路设计实验>实验报告学生姓名:李旭文超周班级学号:1138033 1138019指导老师:潘秀琴<实验报告内容>一、实验名称:时序逻辑电路设计实验二、实验学时:5学时三、实验目的:1、初步掌握用Verilog HDL 语言设计时序逻辑电路的基本思路和方法,并对同步二进制加法计数器、加减可控计数器、任意进制计数器(以60进制计数器为例)等进行逻辑电路设计和功能仿真。
2、初步学习分析分频电路设计的思路,并进行功能仿真。
(选做)四、实验内容1、假设现有同步十进制加法计数器(出了具有数据输入、时钟控制、状态输出之外,还具有异步清零、同步置数功能),用Verilog HDL设计二十九进制计数器,并进行功能仿真。
2、用同步二进制加法计数器设计一分频电路,并进行功能仿真,分析经过分频后所得到信号频率和输入时钟信号频率之间的关系。
在此基础上进一步分析输入信号为8MHZ时,要想得到2分频、4分频输出信号的设计该如何实现给出具体实现方法(选作)五、实验原理计数器是最常用的时序逻辑电路,从计算机的微处理器地址发生器到频率计都需要用到计数器。
常见计数器有加法计数器和减法计数器。
加法计数器时根据二进制加法原理,每来一个脉冲计数值加1;减法计数器根据二进制减法原理每来一个脉冲计数器值减1。
同一计数器兼具有加法和减法功能,成为加减可控计数器或可逆计数器。
任意进制计数器设计是完成用现有进制计数构成所需要容量的计数器设计任务,其实现方法有置零法、置数法,并行进位和串行进位法,具体实现原理参见本课程第六章相关内容。
六、实验步骤1、实验前准备(预习)(1)认真阅读实验目的、内容及要求,清楚本实验要干什么(2)根据要求复习及查阅相关学习资料,整理完成本实验任务的基本思路(3)设计完成本实验的实现方案2、编程、调试及功能实现(1)逻辑功能代码编写:根据确定的实现方案,在软硬件实验环境下,用VerilogHDl语言进行可编程逻辑电路功能设计,完成程序代码编写。
计数器的应用实验报告
(一)、74ls74数字集成块介绍(1)74ls74引脚图及功能(2)74ls74逻辑图(3)74ls74真值表(二)、74ls112数字集成块介绍(1)74ls112引脚图及功能CLK1、CLK2————时钟输入端(下降沿有效)J1、J2、K1、K2————数据输入端Q1、Q2、/Q1、/Q2————输出端CLR1、CLR2————直接复位端(低电平有效)PR1、PR2————直接置位端(低电平有效)(2)74ls112真值表说明H-高电平↓-高到低电平跳变L-低电平Q0-稳态输入建立前Q 的电平X-任意/Q0-稳态输入建立前/Q 的电平(3)74ls112功能图(三)、异步4位二进制加法和减法计数器。
(1)74ls74组成异步四位二进制加法器设计过程用四个D触发器串接起来可以构成四位二进制加法计数器(每个D 触发器连接为T’触发器)。
计数器的每级按逢二进一的计数规律,由低位向高位进位,可以对输入的一串脉冲进行计数,并以16为一-个计数值环。
其累计的脉冲数等于2" (n为计数的位数)。
状态转换图实验结果当点击仿真开始运行键时,进行加法计算,从0000加到1111,到达1111后又变回0000进行下一循环的加法计算。
而将A置于高电位,则进行减法计算,从1111减值0000,到达0000后又变回1111进行下一循环的减法计算。
各触发器的脉冲信号输入为异步输入,有四个脉冲信号输入端。
对二进制进行加法计算,即电路是一个异步四位二进制加法计数器。
(2)74ls74组成异步四位二进制减法器设计原理用四个D触发器串接起来可以构成四位二进制减法计数器(每个D 触发器连接为T’触发器)。
计数器的每级按逢二进一的计数规律,由高位向低位进位,可以对输入的一串脉冲进行计数,并以16为一-个计数值环。
其累计的脉冲数等于2" (n为计数的位数)。
实验结果当点击仿真开始运行键时,进行减法计算,从1111减值0000,到达0000后又变回1111进行下一循环的减法计算。
数电实验报告:计数器及其应用-计数器应用实验报告
数字电子技术实验报告实验四:计数器及其应用一、实验目的:1、熟悉常用中规模计数器的逻辑功能。
2、掌握二进制计数器和十进制计数器的工作原理和使用方法。
二、实验设备:1、数字电路实验箱;2、74LS90。
三、实验原理:1、计数是一种最简单基本运算,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时具有分频功能。
计数器按计数进制分有:二进制计数器,十进制计数器和任意进制计数器;按计数单元中触发器所接收计数脉冲和翻转顺序分有:异步计数器,同步计数器;按计数功能分有:加法计数器,减法计数器,可逆(双向)计数器等。
2、74LS90是一块二-五-十进制异步计数器,外形为双列直插,NC表示空脚,不接线,它由四个主从JK触发器和一些附加门电路组成,其中一个触发器构成一位二进制计数器;另三个触发器构成异步五进制计数器。
在74LS90计数器电路中,设有专用置“0”端R0(1),R0(2)和置“9”端S9(1)S9(2)。
其中前两个为异步清0端,后两个为异步置9端。
CP1, CP2为两个时钟输入端;Q0~Q3为计数输出端。
当R1=R2=S1=S2=0时,时钟从CP1引入,Q0输出为二进制;从CP2引入,Q3输出为五进制。
时钟从CP1引入,二Q0接CP1,则Q3Q2Q1Q0输出为十进制(8421码);时钟从CP2引入,而Q3接CP1,则Q0Q3Q2Q1输出为十进制(5421码)。
四、实验原理图及实验结果:1、实现0~9十进制计数。
1)实验原理图如下:(函数信号发生器:5V 3Hz 偏移2.5V方波)2)实验结果:解码器上依次显示0~9十个数字。
2、实现六进制计数。
1)实验原理图如下:(函数信号发生器:5V 3Hz 偏移2.5V方波)2)实验结果:解码器上依次显示0~5六个数字。
3、实现0、2、4、6、8、1、3、5、7、9计数。
1)实验原理图如下:(函数信号发生器:5V 3Hz 偏移2.5V方波)2)实验结果:解码器上依次显示0、2、4、6、8、1、3、5、7、9十个数字。
实验4 计数器和分频器报告
实验4 计数器和分频器一.计数器实验设计方案1.原理:计数器是数字系统中常用的一种可统计时钟的个数的时序逻辑部件。
计数器中的“数”是触发器的状态组合。
某一种触发器状态组合代表某个“数”,即“编码”。
计数器循环一次所包括的状态总数就是称作“容量”或“模”。
在计数脉冲作用下,使状态逐个迁移成不同的状态组合来实现数的增加和减少。
2.VHDL代码:(1)2选1多路选择器library ieee;use ieee.std_logic_1164.all;entity mux4_2_1 isport(d0,d1:in std_logic_vector(3 downto 0);sel:in std_logic_vector(1 downto 0);dout:out std_logic_vector(3 downto 0));end mux4_2_1;architecture rtl of mux4_2_1 isbegindout<=d0 when sel="00"elsed1 when sel="01";end rtl;(2)十三进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity exp_cnt13 isport( Clk,clrn,En:in std_logic;cq:out std_logic_vector(3 downto 0);cq1:out std_logic_vector(3 downto 0);cout:out std_logic);end exp_cnt13;architecture bhv of exp_cnt13 issignal cqi:std_logic_vector(3 downto 0);signal cqi1:std_logic_vector(3 downto 0);beginprocess(En,Clk,clrn,cqi)beginif clrn='0' thencqi<="0000";elsif Clk'event and Clk='1' thenif En='1' thenif cqi<12 thencqi<=cqi+1;elsecqi<="0000";end if;end if;end if;if cqi=12 thencout<='1';elsecout<='0';end if;cq<=cqi;if cqi>9 thencq1<="0001";cqi1<=cqi-10;elsecq1<="0000";cqi1<=cqi;end if;cq<=cqi1;end process;end bhv;3.结构框图:实验波形仿真①波形图:②操作说明:设置网格为80ns,设置clk选低电平,为一个周期80ns的函数;把clrn设置为高电平;设置En选高电平; 设置cq为一个周期函数,根据数组在每段的值设置cq[0] 到cq[3]的值,然后仿真波形,看输出的cout的波形,通过下载到实验箱可以验证波形的正确性。
分频器实验报告
实验二:分频器`timescale 1ns / 1psmodule Timer(CLKin,RST,CLK1); //分频模块输出2Hz信号input CLKin,RST; //系统时钟信号50MHz和复位信号output CLK1; //分频后的脉冲信号reg [26:0]counter; //计数器reg tmp;always @(negedge RST,posedge CLKin)if(!RST)begincounter<=0;tmp<=0;endelse if(counter==12500000-1)begincounter<=0;tmp<=~tmp;endelse counter<=counter+1;assign CLK1=tmp; //状态输出endmodule//先验证分频模块是否好用module Div_freg1(CLK1,CLK2);//将2Hz信号二分频变为1Hz input CLK1;output CLK2;reg[1:0] count;reg clk_tmp;parameter SET_K=2'd2;assign CLK2=clk_tmp;always@(posedge CLK1)beginif(count==SET_K)begincount<=0;clk_tmp<=~clk_tmp;endelse count<=count+1;endendmodulemodule Div_freg2(CLK1,CLK3);//将2Hz信号四分频变为0.5Hz input CLK1;output CLK3;reg[2:0] count;reg clk_tmp;parameter SET_K=3'd4;assign CLK3=clk_tmp;always@(posedge CLK1)beginif(count==SET_K)begincount<=0;clk_tmp<=~clk_tmp;endelse count<=count+1;endendmodulemodule Div_freg3(CLK1,CLK4);//将2Hz信号八分频变为0.25Hz input CLK1;output CLK4;reg[3:0] count;reg clk_tmp;parameter SET_K=4'd8;assign CLK4=clk_tmp;always@(posedge CLK1)beginif(count==SET_K)begincount<=0;clk_tmp<=~clk_tmp;endelse count<=count+1;endendmodulemodule Div_freg4(CLK1,CLK5);//将2Hz信号十六分频变为0.125Hz input CLK1;output CLK5;reg[4:0] count;reg clk_tmp;parameter SET_K=5'd16;assign CLK5=clk_tmp;always@(posedge CLK1)beginif(count==SET_K)begincount<=0;clk_tmp<=~clk_tmp;endelse count<=count+1;endendmodulemodule KEY_select(KEY,CLK2,CLK3,CLK4,CLK5,CLK);//信号选择模块input [1:0] KEY;input CLK2,CLK3,CLK4,CLK5;output reg CLK;always@(KEY)begincase(KEY)2'b00:CLK<=CLK2;2'b01:CLK<=CLK3;2'b10:CLK<=CLK4;2'b11:CLK<=CLK5;endcaseendendmodulemodule top_v(CLKin,RST,CLK,KEY);input CLKin,RST;input [1:0]KEY;output CLK;wire w0,w1,w2,w3,w4;Timer U1(.CLKin(CLKin),.RST(RST),.CLK1(w0));Div_freg1 U2(.CLK1(w0),.CLK2(w1));Div_freg2 U3(.CLK1(w0),.CLK3(w2));Div_freg3 U4(.CLK1(w0),.CLK4(w3));Div_freg4 U5(.CLK1(w0),.CLK5(w4));KEY_select U6(.KEY(KEY),.CLK2(w1),.CLK3(w2),.CLK4(w3),.CLK5(w4),.CLK(CLK)); endmodule实验三:12小时模式`timescale 1ns / 1psmodule second(clk,clr,en,sech,secl,enmin);//秒钟计数模块input clr,clk,en;output [3:0]sech,secl;output enmin;reg [7:0]count;assign sech=count[7:4];assign secl=count[3:0];assign enmin=((count==8'h59)&&(en==1'b1))?1:0;always@(posedge clk,negedge clr)beginif(!clr) count<=8'h00;else if(en)beginif(count==8'h59)count<=8'h00;else if(count[3:0]==9)count<=count+7;else count<=count+1;endendendmodulemodule minute (clk,clr,en,minh,minl,enhr); //分钟计数模块input clr,clk,en;output[3:0]minh,minl;output enhr ;reg [7:0] count ;assign minh=count [7:4];//分钟十位assign minl=count [3:0];//分钟个位assign enhr=(count==8'h59&&en==1'b1)?1:0;//产生进位信号always@(posedge clk,negedge clr )beginif(!clr) count<=8'h00;//低电平复位,异步复位else if(en)beginif ( count==8'h59) count <=8'h00;//计满60清零else if ( count [3:0]==9) count <= count +7;// BCD 码调整else count <=count +1;endendendmodulemodule hour(clk,clr,en,hrh,hrl,judge);//时钟计数模块input clr,clk,en;output reg judge;//十二小时判断output [3:0] hrh,hrl;reg [7:0] count;assign hrh=count [7:4];//时钟十位assign hrl=count [3:0];//时钟个位always@(posedge clk,negedge clr)beginif(!clr)count<=8'h00;//低电平复位,异步复位else if(en )beginif (count==8'h12)beginif(judge==0)begin judge<=~judge;count<=8'h01;end//记满12点之后变为下午一点else if(judge==1)begin judge<=~judge;count<=8'h01;end//记满下午12点之后变为凌晨1点end//计满12清零else if (count [3:0]==9)count<=count+7;// BCD 码调整else count <=count +1;endendendmodulemodule div_freg(clk,clk1hz,clk_scan); //分频模块input clk;//系统时钟50MHzoutput clk1hz, clk_scan;//clk1hz为1Hz, clk _ scan 为数码管扫描时钟reg[24:0]count;//计数器,最大计数值为25000000-1reg clk_tmp ;parameter SET_K =25000-1;//设置分频系数SET_Kassign clk1hz=clk_tmp;assign clk_scan=count[14];//分频比为2^15//逻辑功能实现always@(posedge clk)beginif(count==SET_K)//判断计数值begincount<=0;//到达计数值,计数器将会被清零clk_tmp<=~clk_tmp ;//同时改变计数寄存器的状态endelse count<=count+1;//计数器加1endendmodulemodule seg_select(clk,sech,secl,minh,minl,hrh,hrl,seg_sel,q,judge); //数码管选通模块input [3:0] sech,secl,minh,minl,hrh,hrl;//待显示的字符input judge;input clk;//数码管扫描时钟output reg [3:0] q;//当前显示的字符output reg [2:0] seg_sel;//数码管位选信号reg [2:0]cnt;always @( posedge clk )beginif(cnt==3'd7)cnt<=0;else cnt<=cnt+1;case(cnt)3'd0: begin q<= secl;seg_sel<=3'b000; end //扫描秒钟个位3'd1: begin q<= sech;seg_sel<=3'b001; end //扫描秒钟十位3'd2: begin q<= minl;seg_sel<=3'b010; end //扫描分钟个位3'd3: begin q<= minh;seg_sel<=3'b011; end //扫描分钟十位3'd4: begin q<= hrl;seg_sel<=3'b100; end //扫描时钟个位3'd5: begin q<= hrh;seg_sel<=3'b101; end //扫描时钟十位3'd6: begin q<= 4'b1010;seg_sel<=3'b110; end //分隔符3'd7:beginif(judge==0)begin q<=4'b1011;seg_sel<=3'b111;endelse if(judge==1)begin q<=4'b1100;seg_sel<=3'b111;endend //上下午default: q<= 4'b1111;//数码管共阳,不显示endcaseendendmodulemodule decoder (q,seg);//数码管显示模块input [3:0] q;//当前显示的字符output reg[7:0] seg;//数码管段选信号输出always@(q)begincase(q)4'b0000:seg<=8'b11000000;//数码管共阳,显示数据"0"4'b0001:seg<=8'b11111001;//数码管共阳,显示数据"1"4'b0010:seg<=8'b10100100;//数码管共阳,显示数据"2"4'b0011:seg<=8'b10110000;//数码管共阳,显示数据"3"4'b0100:seg<=8'b10011001;//数码管共阳,显示数据"4"4'b0101:seg<=8'b10010010;//数码管共阳,显示数据"5"4'b0110:seg<=8'b10000010;//数码管共阳,显示数据"6"4'b0111:seg<=8'b11111000;//数码管共阳,显示数据"7"4'b1000:seg<=8'b10000000;//数码管共阳,显示数据"8"4'b1001:seg<=8'b10010000;//数码管共阳,显示数据"9"4'b1010:seg<=8'b10111111;//数码管共阳,显示数据"-"4'b1011:seg<=8'b10001000;//数码管共阳,显示数据"A"4'b1100:seg<=8'b10001100;//数码管共阳,显示数据"P"default:seg<=8'b11111111;//数码管共阳,不显示endcaseendendmodulemodule top_v(clk,clrn,seg,seg_sel);//顶层模块input clk,clrn;//clk为系统时钟输入,clrn 为异步清零端号output [7:0] seg ; //数码管段选信号输出output [2:0] seg_sel ;//数码管位选信号输出wire w0,w1,w2,w3,w5,w12;wire[3:0] w4,w6,w7,w8,w9,w10,w11;assign w2=1;//秒钟模块计数使能端设置为高电平,允许计数minute U1(.clk(w0),.clr(clrn),.en(w1),.enhr(w3),.minh(w8),.minl(w9));second U2(.clk(w0),.clr(clrn),.en(w2),.enmin(w1),.sech(w10),.secl(w11));hour U3(.clk(w0),.clr(clrn),.en(w3),.hrh(w6),.hrl(w7),.judge(w12));div_freg U4(.clk(clk),.clk1hz(w0),.clk_scan(w5));decoder U5(.q(w4),.seg(seg));seg_selectU6(.clk(w5),.hrh(w6),.hrl(w7),.minh(w8),.minl(w9),.sech(w10),.secl(w11),.q(w4),.seg_sel(seg_sel ),.judge(w12));endmodule实验三:24小时模式`timescale 1ns / 1psmodule second(clk,clr,en,sech,secl,enmin);//秒钟计数模块input clr,clk,en;output [3:0]sech,secl;output enmin;reg [7:0]count;assign sech=count[7:4];assign secl=count[3:0];assign enmin=((count==8'h59)&&(en==1'b1))?1:0;always@(posedge clk,negedge clr)beginif(!clr) count<=8'h00;else if(en)beginif(count==8'h59)count<=8'h00;else if(count[3:0]==9)count<=count+7;else count<=count+1;endendendmodulemodule minute (clk,clr,en,minh,minl,enhr); //分钟计数模块input clr,clk,en;output[3:0]minh,minl;output enhr ;reg [7:0] count ;assign minh=count [7:4];//分钟十位assign minl=count [3:0];//分钟个位assign enhr=(count==8'h59&&en==1'b1)?1:0;//产生进位信号always@(posedge clk,negedge clr )beginif(!clr) count<=8'h00;//低电平复位,异步复位else if(en)beginif ( count==8'h59) count <=8'h00;//计满60清零else if ( count [3:0]==9) count <= count +7;// BCD 码调整else count <=count +1;endendendmodulemodule hour(clk,clr,en,hrh,hrl);//时钟计数模块input clr,clk,en;output [3:0] hrh,hrl;reg [7:0] count;assign hrh=count [7:4];//时钟十位assign hrl=count [3:0];//时钟个位always@(posedge clk,negedge clr)beginif(!clr)count<=8'h00;//低电平复位,异步复位else if(en )beginif(count==8'h23)count<=8'h00;//计满24清零else if (count [3:0]==9)count<=count+7;// BCD 码调整else count <=count +1;endendendmodulemodule div_freg(clk,clk1hz,clk_scan); //分频模块input clk;//系统时钟50MHzoutput clk1hz, clk_scan;//clk1hz为1Hz, clk _ scan 为数码管扫描时钟reg[24:0]count;//计数器,最大计数值为25000000-1reg clk_tmp ;parameter SET_K =25000000-1;//设置分频系数SET_Kassign clk1hz=clk_tmp;assign clk_scan=count[14];//分频比为2^15//逻辑功能实现always@(posedge clk)beginif(count==SET_K)//判断计数值begincount<=0;//到达计数值,计数器将会被清零clk_tmp<=~clk_tmp ;//同时改变计数寄存器的状态endelse count<=count+1;//计数器加1endendmodulemodule seg_select(clk,sech,secl,minh,minl,hrh,hrl,seg_sel,q); //数码管选通模块input [3:0] sech,secl,minh,minl,hrh,hrl;//待显示的字符input clk;//数码管扫描时钟output reg [3:0] q;//当前显示的字符output reg [2:0] seg_sel;//数码管位选信号reg [2:0]cnt;always @( posedge clk )beginif(cnt==3'd7)cnt<=0;else cnt<=cnt+1;case(cnt)3'd0: begin q<= secl;seg_sel<=3'b000; end //扫描秒钟个位3'd1: begin q<= sech;seg_sel<=3'b001; end //扫描秒钟十位3'd2: begin q<= 4'b1010;seg_sel<=3'b010; end //分隔符3'd3: begin q<= minl;seg_sel<=3'b011; end //扫描分钟个位3'd4: begin q<= minh;seg_sel<=3'b100; end //扫描分钟十位3'd5: begin q<= 4'b1010;seg_sel<=3'b101; end //分隔符3'd6: begin q<= hrl;seg_sel<=3'b110; end //扫描时钟个位3'd7: begin q<= hrh;seg_sel<=3'b111; end //扫描时钟十位default: q<= 4'b1111;//数码管共阳,不显示endcaseendendmodulemodule decoder (q,seg);//数码管显示模块input [3:0] q;//当前显示的字符output reg[7:0] seg;//数码管段选信号输出always@(q)begincase(q)4'b0000:seg<=8'b11000000;//数码管共阳,显示数据"0"4'b0001:seg<=8'b11111001;//数码管共阳,显示数据"1"4'b0010:seg<=8'b10100100;//数码管共阳,显示数据"2"4'b0011:seg<=8'b10110000;//数码管共阳,显示数据"3"4'b0100:seg<=8'b10011001;//数码管共阳,显示数据"4"4'b0101:seg<=8'b10010010;//数码管共阳,显示数据"5"4'b0110:seg<=8'b10000010;//数码管共阳,显示数据"6"4'b0111:seg<=8'b11111000;//数码管共阳,显示数据"7"4'b1000:seg<=8'b10000000;//数码管共阳,显示数据"8"4'b1001:seg<=8'b10010000;//数码管共阳,显示数据"9"4'b1010:seg<=8'b10111111;//数码管共阳,显示数据"-"default:seg<=8'b11111111;//数码管共阳,不显示endcaseendendmodulemodule top_v(clk,clrn,seg,seg_sel);//顶层模块input clk,clrn;//clk为系统时钟输入,clrn 为异步清零端号output [7:0] seg ; //数码管段选信号输出output [2:0] seg_sel ;//数码管位选信号输出wire w0,w1,w2,w3,w5;wire[3:0] w4,w6,w7,w8,w9,w10,w11;assign w2=1;//秒钟模块计数使能端设置为高电平,允许计数minute U1(.clk(w0),.clr(clrn),.en(w1),.enhr(w3),.minh(w8),.minl(w9));second U2(.clk(w0),.clr(clrn),.en(w2),.enmin(w1),.sech(w10),.secl(w11));hour U3(.clk(w0),.clr(clrn),.en(w3),.hrh(w6),.hrl(w7));div_freg U4(.clk(clk),.clk1hz(w0),.clk_scan(w5));decoder U5(.q(w4),.seg(seg));seg_selectU6(.clk(w5),.hrh(w6),.hrl(w7),.minh(w8),.minl(w9),.sech(w10),.secl(w11),.q(w4),.seg_sel(seg_sel ));endmodule实验四:红外传感器控制步进电机//---------------------------------------------------------------------------//--描述:红外驱动模块//---------------------------------------------------------------------------/*Timing control.`define HEAD_HIGH 24'h6_DDD0 // 9.000ms @ 50MHz, standard is 24'h6_DDD0.`define HEAD_LOW24'h3_6EE8 // 4.500ms @ 50MHz, standard is 24'h3_6EE8`define BIT_0_HIGH24'h6D60 // 0.560ms @ 50MHz, standard is 24'h6D60`define BIT_0_LOW24'h6E5A // 0.565ms @ 50MHz, standard is 24'h6E5A`define BIT_1_HIGH24'h6D60 // 0.560ms @ 50MHz, standard is 24'h6D60`define BIT_1_LOW24'h1_4A14 // 1.685ms @ 50MHz, standard is 24'h1_4A14`define REP_HEAD_HIGH 24'h6_DDD0 // 9.000ms @ 50MHz, standard is 24'h6_DDD0.`define REP_HEAD_LOW24'h1_B774 // 2.250ms @ 50MHz, standard is 24'h1_B774`define REP_BIT_HIGH24'h6D60 // 0.560ms @ 50MHz, standard is 24'h6D60`define REP_BIT_LOW24'hF4240 // 20.00ms @ 50MHz, standard is 24'hF4240 *///high_time 为红外引导码9ms低电平,(high_time[23:14] == `HEAD_HIGH)//24'h6_DDD0 = (0110_11)01_1101_1101_0000 的[23:14]是(01_1011) = 10'h1B//1B+14个0=6C000 X 20ns = 8.85ms`define HEAD_HIGH 10'h1B//(0110_11)01_1101_1101_0000 约8.85ms`define HEAD_LOW10'hD//(0011_01)10_1110_1110_1000 约4.26ms`define BIT_0_HIGH10'h1//(0000_01)10_1101_0110_0000 约0.33ms`define BIT_0_LOW10'h1//(0000_01)10_1110_0101_1010 约0.33ms`define BIT_0_LOW210'h2//(0000_10)00_0000_0000_0000 约0.66ms`define BIT_1_HIGH10'h1//(0000_01)10_1101_0110_0000 约0.33ms`define BIT_1_LOW10'h5//(0001_01)00_1010_0001_0100 约1.64ms`define BIT_1_LOW210'h4//(0001_00)00_0000_0000_0000 约1.31ms`define REP_HEAD_HIGH 10'h1B//(0110_11)01_1101_1101_0000 约8.85ms`define REP_HEAD_LOW10'h6//(0001_10)11_0111_0111_0100 约1.97ms`define REP_BIT_HIGH10'h1//(0000_01)10_1101_0110_0000 约0.33ms`define REP_BIT_LOW10'h3D//(1111_01)00_0010_0100_0000 约19.99msmodule Ir_Module(//输入端口CLK_50M,RST_N,IR_DATA,//输出端口o_ir_data);//---------------------------------------------------------------------------//--外部端口声明//---------------------------------------------------------------------------input CLK_50M;//系统时钟input RST_N;//系统复位input IR_DATA;//红外输入管脚output [ 7:0]o_ir_data;//从红外读出的数据//---------------------------------------------------------------------------//--内部端口声明//---------------------------------------------------------------------------reg[ 3:0]ir_fsm_cs;//状态机的当前状态reg[ 3:0]ir_fsm_ns;//状态机的下一个状态reg[23:0]time_cnt;//计时器reg[23:0]time_cnt_n;//time_cnt的下一个状态reg[23:0]low_time;//低电平计时器(实际是高电平)reg[23:0]low_time_n;//low_time的下一个状态reg[23:0]high_time;//高电平计时器(实际是低电平)reg[23:0]high_time_n; //high_time的下一个状态reg[ 7:0]bit_cnt;//用来记录8位串行红外数据组成一个字节reg[ 7:0]bit_cnt_n;//bit_cnt的下一个状态reg[ 1:0]detect_edge;//检测边沿寄存器wire[ 1:0]detect_edge_n;//detect_edge的下一个状态reg[31:0]ir_data;//从红外读出的数据reg[31:0]ir_data_n;//ir_data的下一个状态reg[31:0]ir_data_reg;//红外数据的缓存寄存器reg[31:0]ir_data_reg_n;//ir_data_reg的下一个状态reg posedge_reg;//检测上升沿wire posedge_reg_n;//posedge_reg的下一个状态wire head_code;//红外引导码wire bit_0_code;//逻辑0(实际逻辑1)wire bit_1_code;//逻辑1(实际逻辑0)wire rep_head_code;//重复引导码wire rep_bit_code; //重复码parameter FSM_IDLE = 4'h0;//空闲状态parameter FSM_DATA = 4'h1;//串行数据接收状态parameter FSM_DATA_END= 4'h2;//数据接收完成状态parameter FSM_REP_BIT = 4'h3;//处理重复码状态parameter FSM_REP_BIT_END= 4'h4;//重复码处理完成状态//时序电路,用来给detect_edge寄存器赋值always @ (posedge CLK_50M or negedge RST_N)beginif(!RST_N)//判断复位detect_edge <= 2'h0;//初始化detect_edge值elsedetect_edge <= detect_edge_n;//用来给detect_edge赋值end//组合电路,检测上升沿assign detect_edge_n = {detect_edge[0] , {~IR_DA TA}};//将红外信号取反并接收//时序电路,用来给posedge_reg寄存器赋值always @ (posedge CLK_50M or negedge RST_N)beginif(!RST_N)//判断复位posedge_reg <= 1'h0;//初始化posedge_reg值elseposedge_reg<= posedge_reg_n;//用来给posedge_reg赋值end//组合电路,判断上升沿,如果detect_edge等于01,posedge_reg_n就置1assign posedge_reg_n = (detect_edge == 2'b01) ? 1'b1 : 1'b0;//时序电路,用来给time_cnt寄存器赋值always @ (posedge CLK_50M or negedge RST_N)beginif(!RST_N)//判断复位time_cnt<= 24'h0;//初始化time_cnt值elsetime_cnt<= time_cnt_n;//用来给time_cnt赋值end//组合电路,计数器用于记录高电平或者低电平的脉冲宽度always @ (*)beginif(detect_edge[0] != detect_edge[1])//判断电平变化time_cnt_n = 24'h0;//如果红外信号发生变化,time_cnt_n就从0开始计数elsetime_cnt_n = time_cnt + 24'h1;//否则,time_cnt就加1end//时序电路,用来给high_time寄存器赋值always @ (posedge CLK_50M or negedge RST_N)beginif(!RST_N)//判断复位high_time <= 24'h0;//初始化high_time值elsehigh_time <= high_time_n;//用来给high_time赋值end//组合电路,实际记录的是IR_DA TA上的低电平宽度,因为上面对IR_DATA做了一次取反操作always @ (*)beginif(detect_edge == 2'b10)//判断下降沿high_time_n = time_cnt;//如果判断为下降沿,则开始计数elsehigh_time_n = high_time;//否则保持不变end//时序电路,用来给low_time寄存器赋值always @ (posedge CLK_50M or negedge RST_N)beginif(!RST_N)//判断复位low_time <= 24'h0;//初始化low_time值elselow_time <= low_time_n;//用来给low_time赋值end//组合电路,实际记录的是IR_DA TA上的高电平宽度,因为上面对IR_DATA做了一次取反操作always @ (*)beginif(IR_DATA)//判断高电平low_time_n= time_cnt;//如果判断为高电平,则开始计数elselow_time_n= low_time;//当IR_DATA变成0时就保持不变end//低电平至少8.85ms,高电平至少4.26ms,就被认为是引导码,head_code就为1assign head_code = (high_time[23:14] == `HEAD_HIGH) && (low_time[23:14] == `HEAD_LOW) && posedge_reg;//低电平至少0.33ms,高电平至少0.33ms或者0.66ms,被认为是逻辑"0",bit_0_code就为1 assign bit_0_code = (high_time[23:14] == `BIT_0_HIGH) && ((low_time[23:14] == `BIT_0_LOW) || (low_time[23:14] == `BIT_0_LOW2)) && posedge_reg;//低电平至少0.33ms,高电平至少1.31ms或者1.66ms,被认为是逻辑"1",bit_1_code就为0 assign bit_1_code = (high_time[23:14] == `BIT_1_HIGH) && ((low_time[23:14] == `BIT_1_LOW) || (low_time[23:14] == `BIT_1_LOW2)) && posedge_reg;//重复引导码assign rep_head_code = (high_time[23:14] == `REP_HEAD_HIGH) && (low_time[23:14] == `REP_HEAD_LOW) && posedge_reg;//重复码assign rep_bit_code = (high_time[23:14] == `REP_BIT_HIGH) && (low_time[23:14] == `REP_BIT_LOW) && posedge_reg;//时序电路,用来给bit_cnt赋值的always @ (posedge CLK_50M or negedge RST_N)beginif(!RST_N)//判断复位bit_cnt<= 8'h0;//初始化bit_cntelsebit_cnt<= bit_cnt_n;//用来给bit_cnt赋值end//组合电路,用来记录8位串行红外数据组成一个字节always @ (*)beginif(ir_fsm_cs != FSM_DA TA)//判断状态机当前状态是否在接收数据状态bit_cnt_n= 8'h0;//如果不等于,bit_cnt_n则清零else if((ir_fsm_cs == FSM_DATA) && posedge_reg)//判断状态机当前状态是否在接收数据状态以及是否在上升沿bit_cnt_n= bit_cnt + 8'h1;//如果条件成立,则记录8位串行红外数据elsebit_cnt_n= bit_cnt;//否则保持不变end//时序电路,用来给ir_fsm_cs赋值的always @ (posedge CLK_50M or negedge RST_N)beginif(!RST_N)//判断复位ir_fsm_cs<= FSM_IDLE;//初始化ir_fsm_cs的值elseir_fsm_cs<= ir_fsm_ns;//用来给ir_fsm_cs赋值end//组合电路,状态机的控制核心always @ (*)begincase(ir_fsm_cs)//判断当前的状态FSM_IDLE:if(head_code)//收到引导码后ir_fsm_ns = FSM_DA TA;//进入串行接收状态else if(rep_head_code)//收到重复码后ir_fsm_ns = FSM_REP_BIT;//进入处理重复码状态elseir_fsm_ns = ir_fsm_cs; //否则保持不变FSM_DATA:if(bit_cnt == 8'h20)//接收4个字节(地址码,地址反码,命令码,命令反码)ir_fsm_ns = FSM_DA TA_END;//接收完毕后,进入数据完成状态else if(rep_head_code || head_code || rep_bit_code)//判断重复码ir_fsm_ns = FSM_IDLE;//进入空闲状态elseir_fsm_ns = ir_fsm_cs;//否则保持不变FSM_DATA_END:ir_fsm_ns = FSM_IDLE;//进入空闲状态FSM_REP_BIT:if(rep_bit_code)//判断重复码ir_fsm_ns = FSM_REP_BIT_END;//进入重复码处理完成状态else if(rep_head_code || head_code || bit_0_code || bit_1_code) //判断重复码ir_fsm_ns = FSM_IDLE;//进入空闲状态elseir_fsm_ns = ir_fsm_cs; //否则保持不变FSM_REP_BIT_END:ir_fsm_ns = FSM_IDLE;//进入空闲状态default:ir_fsm_ns = FSM_IDLE; //进入空闲状态endcaseend//时序电路,用来给ir_data_reg赋值的always @ (posedge CLK_50M or negedge RST_N)beginif(!RST_N)//判断复位ir_data_reg<= 32'h0;//初始化ir_data_reg elseir_data_reg<= ir_data_reg_n;//用来给ir_data_reg赋值的end//组合电路,记录接收到的串行码32bit,每接收一位,判断是0还是1后移位保存。
数字系统设计实验报告计数器、累加器
实验五计数器设计一、实验目的:1)复习计数器的结构组成及工作原理。
2)掌握图形法设计计数器的方法。
3)掌握Verilog HDL语言设计计数器的方法。
4)进一步熟悉设计流程、熟悉数字系统实验开发箱的使用。
二、实验器材:数字系统设计试验箱、导线、计算机、USB接口线三、实验内容:1)用图形法设计一个十进制计数器,仿真设计结果。
下载,进行在线测试。
2)用Verilog HDL语言设计一个十进制的计数器(要求加法计数;时钟上升沿触发;异步清零,低电平有效;同步置数,高电平有效),仿真设计结果。
下载,进行在线测试。
四、实验截图1)原理图:2)仿真波形:3)文本程序:5)波形仿真:五、实验结果分析、体会:这次实验,,由于试验箱有抖动,故在原理图上加了去抖电路,但是在波形仿真的时候无需考虑抖动,所以我在波形仿真的时候将去抖电路消除了,方便观察实验六累加器设计一、实验目的:1)学习了解累加器工作原理;2)了解多层次结构的设计思路;3)学会综合应用原理图和文本相结合的设计方法。
二、实验器材:数字系统设计试验箱、导线、计算机、USB接口线三、实验内容:1)在文本输入方式下设计分别设计出8位的全加器和8位的寄存器,并分别存为add8_8.v和reg8.v;2)在原理图输入方式下通过调用两个模块设计出累加器电路,并存为add8.bdf, 进行功能仿真;3)下载,进行在线测试。
四、实验截图1)8位累加器原理图:2)波形仿真:3)文本输入8位加法器语言及符号:生成元器件:4)文本输入8位寄存器:生成图元:五、实验总结:通过本次实验,学习了解累加器工作原理,了解多层次结构的设计思路,学会综合应用原理图和文本相结合的设计方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉纺织大学
电子与电气工程学院
通信工程专业
实验报告
课程:FPGA课程开发板利用
班级:通信11701
学号:1703290104
姓名:舒振中
实验成绩:______________
2019年11 月28日
1.实验名称:设计一个8位累加器
2.实验要求:
1:用quartus2编写一段累加器的代码
2:运行代码成功后,并画出程序框图
3:用8个LED验证成果
3.实验设计:
设计一个电路结构和逻辑功能图
4.程序代码:
Module accum(accum,data,ena,clk1,rst);
Output [7:0] accum;
Input[7:0] data;
Input ena,clk1,rst;
Reg[7:0] accum;
Always @(posedge clk1)
Begin
If(rst)
Accum<=8’b0000_0000;
else if(ena)
Accum<=data;
End
Endmodule
对照芯片引脚图绑管脚;实现功能
调试结果:用按键控制LED。
8位按键代表8进制数,从第一个按键开始。
每次给一个按键置1,LED闪亮一次。
5.调试心得体会
总体来说fpga调试知道累加器原理,加上开发版的基本使用。
实现数字的累加。
实验拓展:设计一个分频计数器让led 0.5s保持亮0.5s灭
实验代码:
module counter(
input clk, //输入时钟复位信号
input rst_n,
output reg led //输出led
);
reg [24:0]cnt;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt<=25'd0;
else if(cnt==25'd49_9990_999) //25位的计数器,实现加法器计数
cnt<=25'd0;
else
cnt<=cnt+1'b1;
always@(posedge clk or negedge rst_n)
if(!rst_n)
led<=1'b0;
else if(cnt==25'd24_999_999) //当技术到cnt(计数器)的一半时led反向
led<=~led;
Endmodule
重点:理解时钟,分频计数;
实验室遇到的问题:else if(cnt==25'd49_9990_999) 》》为led亮灭一次共的时间
而我最开始写的是else if(cnt==25'd24_9990_999)led始终亮。