步长可变的加减计数器

合集下载

可变步长计数器的设计

可变步长计数器的设计

东南大学电工电子实验中心实验报告课程名称:电路与电子线路实验1第 2 次实验实验名称:可变步长计数器的设计院(系):专业:姓名:学号:实验室: 实验组别:同组人员:实验时间:年月日评定成绩:审阅教师:一、实验内容要求1.可变步长计数器的设计内容:实现N步长计数器●实现1/N步长计数器●N为四位二进制数,可现场设置要求:●在Multisim软件平台上设计实验电路●运行并检验实验结果二、实现方案1.N步长计数器设计方案(1)使用1个全加器和4个D触发器实现N步长加减计数器。

4个D触发器用来存储表示运算结果的4位二进制数,其D输入端分别接全加器的运算结果输出端SUM_1, SUM_2, SUM_3, SUM_4,时钟信号端CP接控制开关A。

控制开关A闭合一次,相当于加一次脉冲信号。

全加器的其中一个4位二进制数输入端A1, A2, A3, A4分别接4个D触发器的输出端Q,另一个4位二进制输入端B1, B2, B3, B4则分别接控制开关B,C,D,E。

这四个开关用于控制步长,每个开关代表着4位二进制数的一位。

设置好步长N后(通过设置控制开关B,C,D,E的闭合与断开实现),每闭合一次控制开关A,全加器将前一次的运算结果+N(二进制加法)后送到4个D触发器,因此4个D触发器的输出结果为前一次结果+N(二进制加法),从而实现了N步长加法计数器。

N步长减法计数器只需在设置步长N时取N的补码即可实现。

(2)使用1个全加器,1个二输入与门,1个二输入与非门,2个74LS47和2个七段数码管实现结果的十进制表示。

运算结果的量程为15,一个数码管用于显示结果的十位数,另一个数码管用于显示结果的个位数。

上述4个D触发器的结果Q输出到全加器的一个4位二进制数输入端,全加器的另一个4位二进制数输入端则或者输入0000,或者输入0110,具体输入哪一个要看与门输出的结果。

全加器的4个输出端接到74LS47上,该74LS47再接到显示个位数的数码管。

卡西欧991计算机功能(考前必看)

卡西欧991计算机功能(考前必看)

上海高考数学计算器991使用解读根据《上海市高考数学考试说明》要求,目前市场上最好用的计算器为卡西欧991fxESPLUS、991fxES。

他们独特实用的功能整理如下:一、函数(描点)功能进入MODE,7:TABLE,出现()fx,输入函数解析式(未知数x的输入法:按ALPHA+));再按“=”,显示Start?1,意思是从x=1开始描点;按“=”,显示End?5,意思是到x=5结束;按“=”,显示Step?1,意思是每隔1个步长计算(可以通过描点个数反求步长,一次最多可求30个对应点坐标。

).最后按“=”,显示函数()fx,当1,2,3,4,5x时,每一个函数值.而1或5都可以自由更改.若需重新修改函数或参数:直接按“AC”。

函数功能可以研究函数的零点(正负值分界点)、通过图像的描点可判断函数值的变化趋势、奇偶性、单调性、周期性、对称性、最值等.二、解方程和方程组(一)常规方程(组)进入MODE,5:EQN,显示四种类型的方程(组).1:nnnaxbyc(二元一次方程组,同矩阵增广矩阵);2:nnnnaxbyczd(三元一次方程组);3:2 0axbxc(一元二次方程);4:320axbxcxd(一元三次方程).选择相应方程,然后逐一输入对应未知数的系数,按=确认输入,再按=即可求解方程(组)。

如一元二次方程解法步骤:MODE+5→输入方程(组)类型3→输入2 x的系数a后按=→输入x的系数b后按=→输入常数项c后按=,出现第一个解X1→再按=出现第二个解x2,;再按=重新修改方程系数。

(二)牛顿法解非常规方程(亦可以使用函数零点功能),部分方程需要先变形。

对于非上述四种类型方程不能用上述方法求解.这时可采用:进入MODE,1:COMP,输入求解的方程后(方程“=”是按ALPHA+CALC)再按SHIFT,CALC,显示Solveforx,和一个数值;这个数值不是方程的一个解.不同的计算器可能显示不同的数值。

加减 计数器详解

加减 计数器详解

实例:以下是一个0~9999 加/减计数器的设计:设计使用key0 为复位信号: 按下后实现计数清0。

key1为暂停按钮:按下后计数暂停。

key2为加、减控制按钮:不按时加计数,按下后减计数。

使用27M时钟信号。

计数时每秒钟10次。

主模块为counter ,从模块为display。

module counter(clk,res,stp,sub,seg,com);input clk,res,stp,sub;//clk为27M时钟res(接按键0)复位信号stp(接按键1)暂停信号sub (接按键2)加/减控制端(1:加、0:减)output [7:0] seg; // 8段码显示output [3:0] com; // 4个数码管选通信号(0 选通表示有效)reg [31:0] number; // 要输出的数字0~9999reg [31:0] clk_count; // 时钟计数(记录经过了多少时钟周期)always @ (posedge clk) beginif(res==0) begin // 复位clk_count = 0;number = 0;endelseif(clk_count==27_000_00) begin // 每当计数到2700000时(即:每过27_000_00 / 27M 秒时执行、、、)clk_count = 0; // 重新计数case ({number,sub}) // 组合判断number与sub 信号‘b0 : number = 9999; // 在number为0 ,并且继续减时number=9999‘b1001_1100_0011_111 : number = 0; //在number=9999,并且继续加时number=0default :number = !stp? number:!sub? number-1 : number+1 ;//否则,在!stp为真时计数停止,!stp为假时判定“!sub? number-1 : number+1 ”;此时!sub为真number-1 ,!sub为假number+1 ,endcaseendelseclk_count = clk_count+1; // 每个clk周期时钟计数始终加1enddisplay D_0(.res(res),.clk(clk),.number(number),.seg(seg),.com(com)); // 调用模块display 并将它起名为D_0endmodulemodule display(res,clk,number,seg,com); //模块用于在数码管上显示number值input res,clk;input [31:0] number;output reg [7:0] seg;output reg [3:0] com;reg [7:0] number_temp;reg [31:0] clk_count; //时钟计数always @(posedge clk) beginclk_count = clk_count+1; //首先先让时钟计数加1if(res==0) begin // 复位com = 4'b0111; // 选通第一个数码管seg = 8'b0111_1111; // 显示数码管中间的一条短横clk_count = 0; // 计数清零endelse if(clk_count == 27_000) begin // 每计数至27_000时(即:每过27000 / 27M 秒时)执行以下语句clk_count = 0; // 计数清零if(com==4'b1110) // 判定如果当前已是最右边数码管亮时让它重新回到最左边的数码管进行显示com = 4'b0111;elsecom = (com = com>>1) | 4'b1000; // 数码管从左边开始依次向右边显示(即0111→1011→1101→1110→0111、、、、)endelsecase(com) // 判定是哪一个数码管在显示,并调用函数dis 将那位上应该显示的数的段码送至seg 端4'b0111: seg = dis((number%1_0000)/1000); // 显示千位4'b1011: seg = dis((number%1_000)/100); // 显示百位4'b1101: seg = dis((number%1_00)/10); // 显示十位4'b1110: seg = dis(number%1_0); // 显示个位default: seg = 8'b01111111; // 否则显示横杠endcaseendfunction [7:0] dis; // 函数dis 用以输出0~9 对应的段码input [7:0] nu; //接受一个输入case(nu)'d0: dis=8'b10010000;'d1: dis=8'b10011111;'d2: dis=8'b01011000;'d3: dis=8'b00011001;'d4: dis=8'b00010111;'d5: dis=8'b00110001;'d6: dis=8'b00110000;'d7: dis=8'b10011101;'d8: dis=8'b00010000;'d9: dis=8'b00010001;default: dis=8'b01111111;endcaseendfunctionendmodule。

自动循环计数器

自动循环计数器

自动循环计数器一、设计目的1、熟练掌握计数器的应用。

2、加深对加减循环计数和显示电路的理解。

二、设计任务1、用集成计数器实行3~9自动循环计数。

2、电路能实现3~9加法和3~9减法循环计数。

3、输出用数码显示。

三、设计思想1、译码驱动显示部分:计数输出结果送至译码输出显示部分。

2、控制部分:实现加或减循环计数功能由控制部分完成。

3、计数部分:完成BCD码3~9的可逆加或减循环计数。

系统方框图如下:四、单元电路的设计、参数计算、器件介绍:(一)译码驱动显示部分1、采用74LS48 TTL BCD—7 段译码器/内部输出驱动。

2、译码驱动、显示电路的设计DBCA为8421BCD码输入端,a—g为7段译码器输出端。

LT灯测试输入使能端。

(二)控制部分及循环加减计数部分1、采用74LS191 TTL 4为同步加/减计数器。

2、控制部分及循环加减计数部分的设计74LS191功能管脚如图所示3、主要逻辑功能(1)同步指数功能当LD’=0时,CP来时,并行输入数据d3~d0被置入。

(2)计数功能取CT’=0 LD’=1当U’/D=0时,对应CP脉冲上升沿,十六进制加法计数。

当U’/D=1时,对应CP脉冲上升沿,十六进制减法计数。

(3)保持功能当CT’=LD’=1时,计数器保持原来的状态不变。

74ls21:就是双4输入与门,全0出1,有0出074ls32:4输入端或门,有1出1,全0出074ls74,:双上升沿D触发器引出端符号1CP、2CP 时钟输入端1D、2D 数据输入端1Q、2Q、输出端CLR1、CLR2 直接复位端(低电平有效) PR1、PR2 直接置位端(低电平有效)状态图如下五、总体电路设计图、工作原理及器件清单1、3~9可逆自动循环加或减计数器总体电路如图所示。

设计原理:信号发生器产生的单脉冲产生的计数脉冲送至74LS191的CLK端,首先开始计数时按开关键使PL端直接接地,制数直接输出一个3,然后断开开关此时Q信号为低电平,所以74LS191开始加法计数,止到输出为1010,即输出为9时,图中下边的74LS21输出为高电平,而74LS32为或门,此时给D触发器一个脉冲,输入Q由原来的低电平经过反转变为高电平,所以从此开始74LS191开始做减法,止到减为3时图中上边的74LS21输出为1,D触发器被触发产生翻转,开始做加法。

74ls193十进制加减减法计数器电路

74ls193十进制加减减法计数器电路

74ls193十进制加减减法计数器电路74LS193是一种十进制加减计数器电路,它具有广泛的应用。

本文将详细介绍74LS193的工作原理和功能特点。

1.74LS193的工作原理74LS193是一种四位二进制计数器,它可以实现十进制的加减减法操作。

通过在输入端接入由控制信号和时钟信号控制的二进制数据输入,74LS193可以根据输入信号的变化实现不同的计数操作。

2.74LS193的功能特点(1)四位计数器:74LS193是一种四位计数器,可以用来计算0到9之间的数字。

(2)加减减法功能:74LS193不仅可以进行加法运算,还可以实现减法运算。

通过控制端的输入信号,可以选择进行加法或减法操作。

(3)同步计数:74LS193采用同步计数方式,即在时钟信号的控制下,所有计数位同时进行计数,确保了计数的准确性。

(4)输出显示:74LS193的输出端有四个计数位和进位输出位,可以实时显示计数结果。

3.74LS193的应用领域(1)计数器:由于其计数功能,74LS193广泛应用于各类计数器电路中,如频率计数器、电子表、工业自动化等。

(2)加减器:由于其加减减法功能,74LS193也可以应用于数字加减运算器中,如数字计算机、计算器等。

(3)时序控制:74LS193也可以用于时序控制电路中,通过对计数信号的控制,实现时序操作,如时钟分频、频率分析等。

本文介绍了74LS193十进制加减减法计数器电路的工作原理和功能特点。

74LS193是一种四位二进制计数器,具有加减减法功能,采用同步计数方式,输出结果准确可靠。

它在计数器、加减器和时序控制电路等领域有着广泛的应用。

通过深入理解和熟练运用74LS193,我们可以设计出高效、稳定的数字电路系统,满足不同应用的需求。

可编程逻辑器件实验EDA-步长可变的加减计数器

可编程逻辑器件实验EDA-步长可变的加减计数器

实验六步长可变的加减计数器
一、实验目的
1、掌握加减法计数器以及特殊功能计数器的设计原理;
2、用HDL语言设计多功能计数器。

二、硬件需求
EDA/SOPC实验箱一台。

三、实验原理
计数器的步长是指计数器每次的改变量。

在很多应用场合,都希望计数器的步长可变。

所谓步长可变,也就是计数器的步长是一个不定值,具体是多少是要靠外部干预的,比如外部给定其步长为5,那么该计数器每次要么增加5,要么减少5,也就是说计数器每次的改变量是5。

这种步长可变的计数器才具有一定的实际意义,比如在直接数字频率合成DDFS 中的地址累加器就是一个步长可变的递增计数器。

四、实验内容
本实验要完成的任务就是设计一个8位的计数器,步长的改变量要求从0~15,实验中用拨挡开关模块的SW1A~SW4A来作为步长改变量的输入,用按键F1来控制计数器的增减,具体要求为:当F1输入为高时,计数器为步长可变的加计数器;当F1输入为低时,计数器为步长可变的减计数器。

计数器输出的Q值用七段数码管模块来表示。

实验中计数器的时钟频率为了便于眼睛观察,同上个实验一样用1Hz的时钟。

五、实验步骤
(1)实现程序
本实验采用顶层设计
元件例化
(2)仿真波形图
从仿真波形图可以看出,LED输出波形持续变化,以设定的步长,增减计数,产生相应的七位译码值。

(3)实际结果。

基于Verilog的任意模长可加减计数器设计

基于Verilog的任意模长可加减计数器设计

基于Verilog 的任意模长可加减计数器设计一、设计要求计数器是一种在时钟的触发下,完成计数功能的时序逻辑电路,输出结果由输入时钟和计数器上一状态的计数共同决定。

本设计要求实现的计数器,具有以下功能:(1)要求实现计数器工作状态的控制;(2)要求实现计数器的异步清零功能;(3)要求实现计数器递增和递减的功能;(4)要求实现计数器的计数范围(模长)任意改变;二、设计思路计数器工作状态的控制,可以设计一个使能端,在外部时钟的触发下,只有当使能端信号有效(高电平),才启动计数器的计数功能(递增或递减),否则计数器输出结果不变。

计数器的异步清零功能,可以设计一个外部输入的清零端,在外部输入信号有效(低电平)的情况下,直接清零计数器,不用等待下一个外部时钟的触发,即计数器的清零是异步的。

计数器计数方向的控制,设计一个加减可控的信号端口,在时钟的触发、异步清零无效以及计数器使能端有效的情况下,该输入端为高电平则计数器完成递增功能,低电平则完成递减功能。

实现计数器的任意模长,即进入下一个计数周期,其计数的最大值可以发生变化。

设计一个4位(最大模长为16)的输入端口,可以在当前计数周期结束,即计数器产生一个溢出信号的同时,判断该端口输入的信号是否发生变化,通过相邻两个计数周期的端口数据作异或运算,结果为高电平则代表模长发生变化,即进入的下一个计数周期,其计数最大值要发生变化。

三、程序设计本次设计使用的是Quartus 11.0开发环境,该软件没有自带仿真功能(9.0版本以后都没自带),需要使用第三方的Modelsim软件,故本设计的程序包括计数器的Verilog设计以及仿真测试需要的testbench激励文件两部分。

计数器的Verilog设计:module Prj(clk,rst_input,en,add_sub,data_input,full,data_output);input clk; // 外部时钟input rst_input; // 外部清零(异步)input en; // 计数使能input add_sub; // 计数方向input [3:0] data_input; // 计数器模长输入output reg full; // 计完当前模长output [3:0] data_output; // 计数器输出reg [3:0] current_counter;// 当前计数值(输出)reg update_length_en; // 改变模长的使能信号// 当前计数周期与上个计数周期的模长输入reg [3:0] current_clk_data_input,last_clk_data_in put;reg [3:0] counter_length; // 下个计数周期的模长reg [1:0] k;always @(posedge clk,negedge rst_input) beginif(!rst_input) // 异步清零beginfull=0;current_counter=0;endelse if(en) // 计数使能beginif(add_sub) // 加法器beginif(current_counter<(counter_length-1))begincurrent_counter=current_counter+1;full=0;endelse// 加法器计数完产生full脉冲以触发// 判断下个计数周期的模长是否变化begincurrent_counter=0;full=1; //full输出endendelse // 减法器beginif(current_counter>0)begincurrent_counter=current_counter-1;full=0;endelse // 减法器计数完begincurrent_counter=counter_length-1;full=1;endendendend//驱动当前计数输出assign data_output=current_counter;initialbegink=1; // k=1 表示启动计数器的第一个计数周期endalways @(posedge full) // 加法器/减法器完成当前周期计数// 计完当前周期(即full有效)才更新beginlast_clk_data_input<=data_input; // 上个周期的模长current_clk_data_input=data_input;//当前周期的模长update_length_en<=last_clk_data_input^current_clk_data_input;// update_length_en为更新计数器模长的使能端,// 异或运算使能端为0代表模长变化 1不变k=k+1; // k的初值为1,k变化说明计数模长更改过了if(k==2'd3)k=2;endalways @(posedge clk)beginif(update_length_en) // 使能有效计数模长变化counter_length=current_clk_data_input;elsebeginif(k>=2)// 下个周期计数器模长不变(保持上次更改的)counter_length=last_clk_data_input;if(k==1)// 整个计数器系统,最初的模长(一次没更改过)counter_length=data_input;endendendmodule测试激励文件testbench:`timescale 1 ps/ 1 psmodule Prj_vlg_tst();reg add_sub;reg clk;reg [3:0] data_input;reg en;reg rst_input;wire [3:0] data_output;wire full;Prj i1 (.add_sub(add_sub),.clk(clk),.data_input(data_input),.data_output(data_output),.en(en),.full(full),.rst_input(rst_input));parameter clk_period=10; // 时钟周期initial // 初始化使能端、清零端和时钟信号beginen=1;rst_input=1;clk=1;#(46*clk_period) en=0;#(3*clk_period) en=1;#(4*clk_period) rst_input=0;#(2*clk_period) rst_input=1;endalways #(clk_period/2) clk=~clk;initialbegin// 计数器模长分别为6 4 5 3// 左边为上一模长持续的时钟个数data_input=4'b0110;#(22*clk_period) data_input=4'b0100;#(12*clk_period) data_input=4'b0101;#(12*clk_period) data_input=4'b0011;#(5*clk_period);endinitialbegin// 计数器计数方向的改变// 左边为递增递减持续的时钟个数add_sub=1;#(9*clk_period) add_sub=0;#(10*clk_period) add_sub=1;#(13*clk_period) add_sub=0;#(4*clk_period) add_sub=1;endendmodule四、仿真结果如图1所示,最开始计数器输入的模长data_input为6,在计数方向控制端add_sub为高电平的情况下,可以从0计数到5,在add_sub为低电平的情况下,可以实现计数器的递减;当计数器模长data_input变为4的时候,先计完当前周期的模长(0到5),才开始模长为4的计数(0到3)。

异步三位二进制减法计数器

异步三位二进制减法计数器

异步三位二进制减法计数器
若计数脉冲只加到部分触发器的时钟输入端上,而部分触发器的触发信号由其他触发器的输出用作时钟脉冲,各触发器的翻转有先有后的二进制计数器称为异步二进制计数器。

每输入一个脉冲,就进行减1运算的计数器称为减法计数器,也称为递减计数器。

异步二进制计数器结构简单,但速度较慢(只能逐级翻转)。

异步三位二进制减法计数器的电路组成,见图示
逻辑关系表
时序图
工作过程
(1)计数器工作前应先清零,初始状态为000。

(2)当第1个CP脉冲到来后,FF0的状态由0变1。

FF2 、FF1的状态翻转,由0变1。

计数器状态为111。

(3)当第2个CP脉冲到来后,只有FF0的状态由1变0。

FF2、FF1保持原态不变。

计数器状态为110。

(4)当第3个CP脉冲到来后,FF0的状态由0变1。

FF1状态由1翻转为0,FF2保持原态不变。

计数器状态为101。

(5)当第4个CP脉冲到来后,则FF0的状态由1变0。

FF1、FF2保持原态不变。

计数器状态为100。

(6)当第5个CP脉冲到来后,三个触发器均翻转,计数器状态为011。

(7)当第6个CP脉冲到来后,则FF0的状态由1变0。

FF2、FF1保持原态不变。

计数器状态为010。

(8)当第7个CP脉冲到来后,FF0的状态由0变1。

FF1状态由1翻转为0,FF2保持原态不变。

计数器状态为001。

如再送入一个CP脉冲,计数恢复为000。

状态表。

实验九_步长可变的加减计数器

实验九_步长可变的加减计数器

实验九步长可变的加减计数器一、实验目的1.掌握加减法计数器以及特殊功能计数器的的设计原理。

2用VHDL语言设计多功能计数器。

二、实验原理计数分同步计数器和异步计数器,如果按工作原理和使用情况来分那就更多了。

1.加减工作原理加减计数也称为可逆计数,就是根据计数控制信号的不同,在时钟脉冲的作用下,计数器可以进行加1计数操作或者减1计数操作。

2.变步长工作原理如步长为3的加法计数器,计数状态变化为0、3、6、9、12……,步长值由输入端控制。

在加法计数时,当计数值达到或超过99时,在计数器下一个时钟脉冲过后,计数器清零;在减法计数时,当计数值达到或小于0时,在计数器下一个时钟脉冲过后,计数器也清零。

三、实验内容1 设计的计数步长可在0~79之间变化2 通过仿真或观察波形图验证设计的正确性。

3 编译下载验证结果。

四、设计提示1.注意IF语句的嵌套。

2.注意加减计数状态的变化,计数值由9变0(加法)及由0变9(减法)各位的变化。

由于计数器为十进制计数器,还应考虑进位或借位后进行加6及减6校正。

五、实验报告要求1.写出多模加减计数器的VHDL源程序。

2.叙述多模加减计数器的工作原理。

SF = ‘1’加标志,SF=’0’减标志3.画出计数器工作波形图.LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CHANGABLE ISPORT(CLK,RESET,SF:IN STD_LOGIC;SIZE:IN STD_LOGIC_VECTOR(6 DOWNTO 0);DO:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END ENTITY CHANGABLE;ARCHITECTURE C_SIZE OF CHANGABLE ISSIGNAL C_COUNT: STD_LOGIC_VECTOR(6 DOWNTO 0); BEGINPROCESS(CLK,RESET,SF,SIZE)V ARIABLE TP:STD_LOGIC_VECTOR(6 DOWNTO 0); BEGINIF(RESET = '1')THENC_COUNT<=(OTHERS=>'0');ELSIF(CLK'EVENT AND CLK = '1')THENIF(SF='1')THENTP:=C_COUNT+SIZE;IF(TP>79)THENC_COUNT<=(OTHERS=>'0');ELSEC_COUNT<=C_COUNT+SIZE;END IF;ELSEIF(TP < SIZE)THENC_COUNT<=(OTHERS=>'0');ELSEC_COUNT<=C_COUNT-SIZE;END IF;END IF;END IF;DO<=C_COUNT;END PROCESS;END ARCHITECTURE C_SIZE;。

vhdl 计数器的使用

vhdl 计数器的使用

实验四计数器的使用一、实验目的熟悉步长可变的加减计数器的工作原理、设计过程和实现方法。

二、实验内容与要求学习用VHDL设计步长可变的加减计数器电路,完成编译、综合、适配、仿真和实验箱上的硬件测试,通过LED数码管显示输入输出各部分数据。

三、实验原理通过输入一组4BIT二进制数据,控制计数方式,即步长,决定每个脉冲到来时计数器增加的数值,同时还有一个单BIT的控制位,选择加计数或者减计数,并通过电路显示各部分数据(输入及输出)。

拨码开关置为MODEL_SEL5-8,全部置为ON,通过USB下载;全部置为OFF,则通过LAB_JTAG_PS_AS接口下载。

DISP_SEL8,处于“ON”状态,这样可以使用静态共阳数码管DISP_SEL1,DISP_SEL2处于“OFF”状态,通过F1,F2的十六进制的输入,在静态共阳数码管DP1B,DP2B上显示输出。

F1,F2预置数据,通过计数器,总的计数值控制电平宽度,其中一组控制高电平,一组控制低电平。

在DP1B上显示的是0-F的步长可变的加减计数器。

四、实验平台(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2)软件:Quartus II软件五、六、仿真截图七、硬件实现八、程序代码1--10 位计数SCAN TOP_LEVEL程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;ENTITY ACOUNT100 ISPORT(clk,clr,en,en6:IN STD_LOGIC ;count1 : out std_logic ;ledseg : out std_logic_vector(6 downto 0);ledcom :out std_logic_vector(5 downto 0)); END;ARCHITECTURE ONE OF ACOUNT100 IS COMPONENT clkgen ISPORT(clkin:IN STD_LOGIC ;clkout: OUT STD_LOGIC);END COMPONENT;COMPONENT COUNT10a ISPORT(clk,clr,en:IN STD_LOGIC ;q:OUT STD_LOGIC_vector(3 downto 0);count1:OUT STD_LOGIC);end COMPONENT;COMPONENT bcd_7seg isport(bcd_led :in std_logic_vector(3 downto 0);--input bcdledseg : out std_logic_vector(6 downto 0));--output to 7 segmentend COMPONENT;COMPONENT mx isport(s:in std_logic;a,b:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0));end COMPONENT;COMPONENT comcoun isport(clk : in std_logic;--synchronouse clockenable : in std_logic;--scan clockcomclk : out std_logic_vector(2 downto 0));--output countend COMPONENT;COMPONENT com_encode isport(s :in std_logic;--input countledcom :out std_logic_vector(5 downto 0));--output encodeend COMPONENT ;signal clk1,c10: std_logic;signal q1,q2,bcd: std_logic_vector(3 downto 0);BEGINU1:clkgen PORT MAP(CLKIN=>CLK,CLKOUT=>CLK1);U2:COUNT10a PORT MAP(clk=>CLK1,clr=>clr,en=>en,q=>q1,count1=>c10);U3:COUNT10a PORT MAP(clk=>CLK1,clr=>clr,en=>c10,q=>q2,count1=>count1); U4:MX PORT MAP(S=>CLK1,A=>q1,b=>q2,q=>bcd);U5:bcd_7seg PORT MAP(bcd_led=>bcd,ledseg=>ledseg);U6:com_encode PORT MAP(s=>clk1,ledcom=>ledcom );end;2---clkgen.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;ENTITY clkgen ISPORT(clkin:IN STD_LOGIC ;clkout: OUT STD_LOGIC);END;ARCHITECTURE even OF clkgen ISconstant N:Integer:=50000000;--constant N:Integer:=10;SIGNAL coun:integer range 0 to N;SIGNAL clk1:STD_LOGIC;BEGINPROCESS(clkin)BEGINIF(clkin'EVENT AND clkin='1')THENIF(coun=N)THENcoun<=0;clk1<=Not clk1;elsecoun<=coun+1;END IF;END IF;END PROCESS;clkout<=clk1;END even;3--10 位计数器程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COUNT10a ISPORT(clk,clr,en:IN STD_LOGIC;count1:OUT STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COUNT10a ;ARCHITECTURE rtl OF COUNT10a ISSIGNAL qs:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ca:STD_LOGIC;BEGINPROCESS(clk)BEGINIF(clk'EVENT AND clk='1')THENIF(clr='1')THENqs<="0000";ELSIF(en='1')THENIF(qs="1001")THENqs<="0000";ca<='0';ELSIF(qs="1000")THEN --在计数到8时,即让进位赋值1,--由于信号会产生一个滞后,使得实际ca在9时出现qs<=qs+1;ca<='1';ELSEqs<=qs+1;ca<='0';END IF;END IF;END IF;END PROCESS;PROCESS(ca,en)BEGINq<=qs;count1<=ca AND en;END PROCESS;END rtl;4library ieee;use ieee.std_logic_1164.all;entity mx isport(s:in std_logic;a,b:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0));end mx;architecture rtl of mx isbeginq<= a WHEN s = '0' ELSE b ;end rtl;5--七段显示扫描电路--comcoun.vhd 7 segment com scan counterlibrary ieee ;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity comcoun isport(clk : in std_logic;--synchronouse clockenable : in std_logic;--scan clockcomclk : out std_logic_vector(2 downto 0));--output countend comcoun;architecture behavior of comcoun issignal q : std_logic_vector(2 downto 0);--internal counted signal beginfscan:process(clk)beginif (clk'event and clk='1') thenif (enable='1') thenif q>=1 thenq<="000";--initial counterelseq<=q+1;--countingend if;end if;end if;end process fscan;comclk<=q; --output internal countend behavior;6library ieee ;use ieee.std_logic_1164.all;entity bcd_7seg isport(bcd_led :in std_logic_vector(3 downto 0);--input bcdledseg : out std_logic_vector(6 downto 0));--output to 7 segment end bcd_7seg;architecture behavior of bcd_7seg isbeginwith bcd_led selectledseg<="0111111" when "0000",--0,3f"0000110" when "0001",--1,06"1011011" when "0010",--2,5b"1001111" when "0011",--3,4f"1100110" when "0100",--4,66"1101101" when "0101",--5,6d"1111101" when "0110",--6,7d"0100111" when "0111",--7,27"1111111" when "1000",--8,7f"1101111" when "1001",--9,6f"1110111" when "1010",--A"1111100"when "1011", --b"0111001"when "1100",--c"1011110" when "1101",--d"1111001"when "1110",--E"1110001" when "1111",--F"0000000" when others;end behavior;7--计数译码电路-- 6 共阴--com_encode.vhd 7 segment com encoderlibrary ieee ;use ieee.std_logic_1164.all;entity com_encode isport(s :in std_logic;--input countledcom :out std_logic_vector(5 downto 0));--output encode end com_encode;architecture behavior of com_encode isbeginledcom<="000001" when s='0' else"000010" ;end behavior;九、实验总结。

最新-基于CPLD/FPGA的出租车计费器 精品

最新-基于CPLD/FPGA的出租车计费器 精品

基于CPLD/FPGA的出租车计费器
摘要介绍了出租车计费器系统的组成及工作原理,简述了在平台上用单片器件构成该数字系统的设计思想和实现过程。

论述了车型调整模块、计程模块、计费模块、译码动态扫描模块等的设计方法与技巧。

关键词/硬件描述语言出租车计费器+软件数字系统
随着技术的高速发展,电子系统的设计技术和工具发生了深刻的变化,大规模可编程逻辑器件/的出现,给设计人员带来了诸多方便。

利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。

本文介绍了一个以公司可编程逻辑芯片712884-15为控制核心、附加一定外围电路组成的出租车计费器系统。

1系统组成
基于/的出租车计费器的组成如图1所示。

各部分主要功能如下1计数器对车轮传感器送来的脉冲信号进行计数每转一圈送一个脉冲。

不同车型的车轮直径可能不一样,通过设置1对车型做出选择,以实现对不同车轮直径的车进行调整。

2计数器对百米脉冲进行累加,并输出实际公里数的码给译码动态扫描模块。

每计满500送出一个脉冲给计数器。

设置2实现起步公里数预制。

3计数器实现步长可变即单价可调的累加计数,每500米计费一次。

设置3用来完成超价加费、起步价预制等。

4译码/动态扫描将路程与费用的数值译码后用动态扫描的方式驱动数码管。

5数码管显示将公里数和计费金额均用四位数码管显示三位整数,1位小数。

2功能模块设计
出租车计费器由车型调整模块、计程模块、计费模块、译码动态及扫描等模块组成,整个系统采用模块化设计,首先用编写功能模块,然后用顶层原理图将。

步长可变的加减计数器

步长可变的加减计数器

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity buchang isgeneric(N: integer:=4);port(clk,f1,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16:in std_logic;--k :std_logic;--cq :out std_logic_vector(7 downto 0);q :out std_logic_vector(7 downto 0);ledag,ledag1 :out std_logic_vector(6 downto 0));end buchang;Architecture a of buchang issignal cnt: integer range 0 to n-1;signal k: integer range 0 to 15;signal clkout: std_logic;signal cq: std_logic_vector(7 downto 0);--q1<=q(3 downto 0);--q2<=q(7 downto 4);signal q1,q2: std_logic_vector(3 downto 0);Beginprocess(clk)beginif(clk'event and clk='1') thenif(cnt<n-1) thencnt <= cnt+1;elsecnt <= 0;end if;end if;end process;--------------------------------process(cnt)beginif(cnt<n/2) thenclkout <= '1';elseclkout <= '0';end if;end process;--------------------------------------------------------process(clkout)beginif(clkout'event and clkout='1') thenif f1='1' thencq<=cq+1+k;if cq="11111111"then cq<="00000000";end if;end if;end if;if(clkout'event and clkout='1') thenif f1='0' thencq<=cq-1-k;if cq="00000000"then cq<="11111111";end if;end if;end if ;-- else--cq<=cq-1-k;--if cq="00000000"then cq<="11111111";-- end if;--end if;end process;q<= cq;q1<=cq(7 downto 4);q2<=cq(3 downto 0);process(k)beginif a1='1'then k<= 0;elsif a2='1' then k<= 1;elsif a3='1' then k<= 2;elsif a4='1' then k<= 3;elsif a5='1' then k<= 4;elsif a6='1' then k<= 5;elsif a7='1' then k<= 6;elsif a8='1' then k<= 7;elsif a9='1' then k<= 8;elsif a10='1' then k<= 9;elsif a11='1' then k<= 10;elsif a12='1' then k<= 11;elsif a13='1' then k<= 12;elsif a14='1' then k<= 13;elsif a15='1' then k<= 14;elsif a16='1' then k<= 15;end if;end process;process(q1)begincase q1 iswhen "0000" => ledag <="0111111"; when "0001" => ledag <="0000110"; when "0010" => ledag <="1011011"; when "0011" => ledag <="1001111"; when "0100" => ledag <="1100110"; when "0101" => ledag <="1101101"; when "0110" => ledag <="1111101"; when "0111" => ledag <="0000111"; when "1000" => ledag <="1111111"; when "1001" => ledag <="1101111"; when "1010" => ledag <="1110111"; when "1011" => ledag <="1111100"; when "1100" => ledag <="0111001"; when "1101" => ledag <="1011110"; when "1110" => ledag <="1111001"; when "1111" => ledag <="1110001"; when others => null;end case;end process;process(q2)begincase q2 iswhen "0000" => ledag1 <="0111111"; when "0001" => ledag1 <="0000110"; when "0010" => ledag1 <="1011011"; when "0011" => ledag1 <="1001111"; when "0100" => ledag1 <="1100110"; when "0101" => ledag1 <="1101101";when "0110" => ledag1 <="1111101"; when "0111" => ledag1 <="0000111"; when "1000" => ledag1 <="1111111"; when "1001" => ledag1 <="1101111"; when "1010" => ledag1 <="1110111"; when "1011" => ledag1 <="1111100"; when "1100" => ledag1 <="0111001"; when "1101" => ledag1 <="1011110"; when "1110" => ledag1 <="1111001"; when "1111" => ledag1 <="1110001"; when others => null;end case;end process;end a;。

出租车计费器的FPGA实现(含VHDL代码)

出租车计费器的FPGA实现(含VHDL代码)

可编程逻辑器件电路设计课程设计报告出租车计费器的FPGA实现华南农业大学工程学院摘要出租车计费系统利用VHDL语言,以MAX+PLUSⅡ软件作为开发平台而设计。

系统包括五大模块——主控模块、分频模块、里程模块、计费模块和显示模块;预置和模拟汽车启动、停止、计费、暂停等功能,并动态扫描显示车费与里程。

关键词: 出租车计费系统VHDL语言MAX+PLUSⅡFPGA 数字系统目录1 方案比较与选择(须详细阐述创新点或新见解) (1)2 底层文件仿真与分析 (4)2.1 底层文件仿真 (4)2.2 底层文件分析 (4)3 顶层文件仿真与分析 (7)3.1 顶层文件仿真 (7)3.2 顶层文件分析 (7)4硬件验证分析 (8)5课程设计心得 (9)Abstract (10)参考文献 (11)附录(源代码)1.方案比较与选择1.1方案一图1图2出租车计费器方案一原理框图1.1.1出租车计费器方案一原理基于CPLD/FPGA的出租车的组成如图1所示。

各部分主要的功能如下:(1)A计数器对车轮的传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。

不同车型的车轮可能不一样,通过“设置1”对车型做出选择,以实现对不同车型直径的车进行调整。

(2)B计数器对百米脉冲进行累加,并输出实际的公里数的BCD码给出译码动态扫描模块。

每计,满500送出一个脉冲给出C计数器。

“设置2”实现起步公里数预制。

(3)C计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。

“设置3”用来完成超价加费,起步价预制等。

(4)译码/动态扫描见路程与费用的数字译码后动态扫描的方式驱动数码管。

(5)数码管显示将公里数和计费金额平均用四位数码管显示(三位整数,1为小数)1.1.2出租车计费器方案一优点根据车型的车轮直径来进行脉冲调整,因为实际车轮大小并非完全一致,需要根据实际大小而重新设置;起步价调整。

起步价调整解决了由于地域的同步而导致起步价的不同,从而是出租车计费系统有更广和广阔的市场,同时也解决了由于起步价调整而更换计费系统的问题。

电工学

电工学
总目录 章目录 返回 上一页 下一页
CP
2.列写状态转换表,分析其状态转换过程 CP J2=Q0Q1 K2 =1 J1 = K1 =1 J0 =Q2 K0 =1 Q2 Q1 Q0
0 1 2 3 4 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1
1 1
0 0 0 0 1
0 0 1 1 0
2. 同步二进制加法计数器
同步计数器:计数脉冲同时接到各位触发器,各触 发器状态的变换与计数脉冲同步。 异步二进制加法计数器线路联接简单。 各触发器逐级翻转,因而工作速度较慢。
同步计数器各触发器同步翻转,因此工作速度快。 但接线较复杂。
用JK触发器设计同步计数器 根据翻转条件, 确定触发器级间连接方式—找 出J、K输入端的联接方式。
上一页 下一页
总目录 章目录 返回
用D触发器构成三位二进制异步加法器
Q2
Q Q
Q1
D
Q Q
Q0
D
Q Q RD 清零
D
F2
F1
F0
C
总目录 章目录 返回
上一页 下一页

3
4
5
6
7
8
Q0
Q1 Q1 Q2
总目录 章目录 返回 上一页 下一页
二进制减法计数器状态表 脉冲数 (C) 0 1 2 3 4 5 6 7 8
二 Q2 1 1 1 1 0 0 0 0 1 进 制 数 Q1 Q0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1
总目录 章目录 返回 上一页 下一页
用D触发器构成三位二进制异步减法器
Q2
Q Q
Q1
D
Q Q

jmeter 计数器用法

jmeter 计数器用法

jmeter 计数器用法摘要:一、jmeter简介二、jmeter计数器作用三、jmeter计数器用法1.线性计数器2.范围计数器3.步长计数器4.表达式计数器四、实战应用五、总结正文:一、jmeter简介JMeter是一款功能强大的测试工具,主要用于测试软件的性能、稳定性和负载能力。

它是由Apache基金会开发的,具有开源、易用、可扩展等特点。

JMeter的主要构成包括测试计划、线程组、测试元件等。

在这些元件中,计数器是一个非常重要的组件,它可以控制测试数据的输出次数和间隔。

二、jmeter计数器作用JMeter计数器的作用主要有以下几点:1.控制测试数据输出次数:通过设置计数器的值,可以控制测试数据在一段时间内输出的次数,从而达到预期的测试效果。

2.控制测试数据输出间隔:计数器可以设置输出数据的间隔,使得测试数据在时间上分布更加均匀,有利于观察软件性能的波动。

3.实现循环测试:通过计数器,可以实现对测试数据的循环播放,从而模拟实际场景中的用户行为。

4.结合正则表达式实现复杂场景测试:JMeter支持正则表达式计数器,可以实现更加复杂场景的测试,如按照特定规律生成数据等。

三、jmeter计数器用法JMeter计数器有多种类型,分别适用于不同的场景。

以下介绍几种常见的计数器类型:1.线性计数器:线性计数器按照设定的次数进行输出,适用于简单的循环测试。

设置方法如下:线性计数器-> 设置计数器属性-> 线性-> 次数:设置输出次数2.范围计数器:范围计数器可以设置起始和结束值,从而控制输出数据的范围。

设置方法如下:范围计数器-> 设置计数器属性-> 范围-> 起始值:设置起始次数-> 结束值:设置结束次数3.步长计数器:步长计数器可以设置步长和最大值,按照指定的步长输出数据。

设置方法如下:步长计数器-> 设置计数器属性-> 步长-> 最大值:设置最大次数4.表达式计数器:表达式计数器允许用户使用正则表达式来控制输出数据的规律。

正交信号发生器

正交信号发生器

湖南人文科技学院课程设计报告课程名称:EDA技术与VHDL设计题目:正交信号发生器系别:通信与控制工程系专业:电子信息组别:电信本二班22组学生姓名: 雷海军、杨辉学号: 08409203、08409239 起止日期: 2011 年 6月 13日~2011 年 6月27日指导教师:姚毅教研室主任:田汉平前言VHDL简介硬件描述语言是EDA技术的重要组成部分,VHDL是电子设计的主流硬件描述语言。

VHDL的英文全名是Very-High-Speed Integrated Circuit Hardware Description Language,诞生于1982年。

1987年底,VHDL被IEEE(The Institute of Electrical and Electronics Engineers)和美国国防部确认为标准硬件描述语言。

自IEEE公布了VHDL的标准版本(IEEE-1076)之后,各EDA公司相继推出了自己的VHDL 设计环境,或宣布自己的设计工具可以和VHDL接口。

此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言。

1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。

现在,VHDL 作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。

VHDL的优点VHDL主要用于描述数字系统的结构、行为、功能和接口。

除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法十分类似于一般的计算机高级语言。

VHDL的程序结构特点是将一项设计实体(可以是一个元件、一个电路模块或一个系统)分成外部和内部两个基本点部分,其中外部为可见部分,即系统的端口,而内部则是不可视部分,即设计实体的内部功能和算法完成部分。

基于CPLD/FPGA的出租车计费器

基于CPLD/FPGA的出租车计费器

基于CPLD/FPGA的出租车计费器摘要:介绍了出租车计费器系统的组成及工作原理,简述了在EDA平台上用单片CPLD器件构成该数字系统的设计思想和实现过程。

论述了车型调整模块、计程模块、计费模块、译码动态扫描模块等的设计方法与技巧。

关键词:CPLD/PPGA 硬件描述语言出租车计费器MAX+PLUS软件数字系统随着EDA技术的高速发展,电子系统的设计技术和工具发生了深刻的变化,大规模可编程逻辑器件CPLD /FPGA的出现,给设计人员带来了诸多方便。

利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。

本文介绍了一个以Altera公司可编程逻辑芯片EPM7128SLC84-15为控制核心、附加一定外围电路组成的出租车计费器系统。

1 系统组成基于CPLD/FPGA的出租车计费器的组成如图1所示。

各部分主要功能如下:(1)A计数器对车轮传感器送来的脉冲信号进行计数(每转一圈送一个脉冲)。

不同车型的车轮直径可能不一样,通过“设置1”对车型做出选择,以实现对不同车轮直径的车进行调整。

(2)B计数器对百米脉冲进行累加,并输出实际公里数的BCD码给译码动态扫描模块。

每计满500送出一个脉冲给C计数器。

“设置2”实现起步公里数预制。

(3)C 计数器实现步长可变(即单价可调)的累加计数,每500米计费一次。

“设置3”用来完成超价加费、起步价预制等。

(4)译码/动态扫描将路程与费用的数值译码后用动态扫描的方式驱动数码管。

(5)数码管显示将公里数和计费金额均用四位LED数码管显示(三位整数,1位小数)。

2 功能模块设计出租车计费器由车型调整模块、计程模块、计费模块、译码动态及扫描等模块组成,整个系统采用模块化设计,首先用VHDL编写功能模块,然后用顶层原理图将各功能模块连接起来。

图22.4.2 动态扫描显示动态扫描是利用人眼的视觉暂留原理,只要扫描频率不小于24Hz,人眼就感觉不到显示器的闪烁。

西门子S7-300-400PLC的计数器类型与使用

西门子S7-300-400PLC的计数器类型与使用

西门子S7-300/400 PLC的计数器类型与使用西门子S7-300/400的计数器数量决定于所选择的PLC CPU模块,计数的形式可以分为”加计数”、”减计数”与”加减计数”3类,计数原理与方法同S7-200 PLC。

计数输入信号为上升沿有效。

S7-300/400的计数器有单独的”置数”控制端S与复位控制端R。

只有当”置数”控制端S为”l”时(上升沿有效),设定值才能被写入计数器;当复位控制端R为”1”时,将计数值清除。

S7-300/400的计数器具有输出端Q、现行计数值输出端CV(二进制)、现行计数值的BCD码输出端CV—BCD三个输出端。

输出端Q可以作为计数器的状态指示信号使用,当计数器的现行计数值为”0”时,Q=“0”;当现行计数值大于0时,Q=“1”。

通过现行计数值输出端CV(或CV- BCD)可以获得计数器的当前计数值。

在程序中同一计数器编号既可以作为触点使用,也可以作为现行值数据使用,它决定于程序中使用的指令形式。

在逻辑运算指令中使用计数器编号,采用的是计数器的触点:在数据运算指令中使用计数器编号,为现行值计数值。

S7-300/400的计数指令S7-300/400的定时指令包括如下几种;(l)计数器控制指令FR:计数器启动信号;L:装载计数值,或将现行计数值以二进制的形式读入到累加器l中:LC:将现行计数值以BCD码的形式读入到累加器l中:R:计数器复位;S:设定计数器的预置值:(2)定时器类型选择指令CU:加计数;CD:减计数。

以上各指令的应用以及梯形图编程、指令表编程的方法如图所示。

指令表程序中的BLD用于编程器的图形显示,NOP为”空操作指令”,它在转换格式时由编程软件自动生成,无功能含义。

变步长计数器课程设计心得体会

变步长计数器课程设计心得体会

变步长计数器课程设计心得体会
作为一个变步长计数器的课程设计,我从中收获了很多经验和体会。

首先,设计课程的过程中需要充分了解变步长计数器的原理和应用场景,以确保课程内容的准确性和实用性。

其次,课程设计应注重培养学生的实际操作能力,通过设计实际的案例和实验来帮助学生理解和掌握变步长计数器的工作原理。

同时,也需要引导学生独立思考和解决问题的能力,培养他们的创新意识和团队合作能力。

课程设计还要考虑如何使学生充分参与进来,培养他们的自主学习能力和表达能力。

最后,为了能够更好地评估学生的学习效果,课程设计中应包括合适的考核方式和评价标准。

通过这些经验和体会,我相信能够设计出更富有挑战和实用性的变步长计数器课程,帮助学生更好地理解和应用这一知识点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity buchang isgeneric(N: integer:=4);port(clk,f1,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16:in std_logic;--k :std_logic;--cq :out std_logic_vector(7 downto 0);q :out std_logic_vector(7 downto 0);ledag,ledag1 :out std_logic_vector(6 downto 0));end buchang;Architecture a of buchang issignal cnt: integer range 0 to n-1;signal k: integer range 0 to 15;signal clkout: std_logic;signal cq: std_logic_vector(7 downto 0);--q1<=q(3 downto 0);--q2<=q(7 downto 4);signal q1,q2: std_logic_vector(3 downto 0);Beginprocess(clk)beginif(clk'event and clk='1') thenif(cnt<n-1) thencnt <= cnt+1;elsecnt <= 0;end if;end if;end process;--------------------------------process(cnt)beginif(cnt<n/2) thenclkout <= '1';elseclkout <= '0';end if;end process;--------------------------------------------------------process(clkout)beginif(clkout'event and clkout='1') thenif f1='1' thencq<=cq+1+k;if cq="11111111"then cq<="00000000";end if;end if;end if;if(clkout'event and clkout='1') thenif f1='0' thencq<=cq-1-k;if cq="00000000"then cq<="11111111";end if;end if;end if ;-- else--cq<=cq-1-k;--if cq="00000000"then cq<="11111111";-- end if;--end if;end process;q<= cq;q1<=cq(7 downto 4);q2<=cq(3 downto 0);process(k)beginif a1='1'then k<= 0;elsif a2='1' then k<= 1;elsif a3='1' then k<= 2;elsif a4='1' then k<= 3;elsif a5='1' then k<= 4;elsif a6='1' then k<= 5;elsif a7='1' then k<= 6;elsif a8='1' then k<= 7;elsif a9='1' then k<= 8;elsif a10='1' then k<= 9;elsif a11='1' then k<= 10;elsif a12='1' then k<= 11;elsif a13='1' then k<= 12;elsif a14='1' then k<= 13;elsif a15='1' then k<= 14;elsif a16='1' then k<= 15;end if;end process;process(q1)begincase q1 iswhen "0000" => ledag <="0111111"; when "0001" => ledag <="0000110"; when "0010" => ledag <="1011011"; when "0011" => ledag <="1001111"; when "0100" => ledag <="1100110"; when "0101" => ledag <="1101101"; when "0110" => ledag <="1111101"; when "0111" => ledag <="0000111"; when "1000" => ledag <="1111111"; when "1001" => ledag <="1101111"; when "1010" => ledag <="1110111"; when "1011" => ledag <="1111100"; when "1100" => ledag <="0111001"; when "1101" => ledag <="1011110"; when "1110" => ledag <="1111001"; when "1111" => ledag <="1110001"; when others => null;end case;end process;process(q2)begincase q2 iswhen "0000" => ledag1 <="0111111"; when "0001" => ledag1 <="0000110"; when "0010" => ledag1 <="1011011"; when "0011" => ledag1 <="1001111"; when "0100" => ledag1 <="1100110"; when "0101" => ledag1 <="1101101";when "0110" => ledag1 <="1111101"; when "0111" => ledag1 <="0000111"; when "1000" => ledag1 <="1111111"; when "1001" => ledag1 <="1101111"; when "1010" => ledag1 <="1110111"; when "1011" => ledag1 <="1111100"; when "1100" => ledag1 <="0111001"; when "1101" => ledag1 <="1011110"; when "1110" => ledag1 <="1111001"; when "1111" => ledag1 <="1110001"; when others => null;end case;end process;end a;。

相关文档
最新文档