Verilog实现任意分频和占空比

任意分频模板和技巧

(一)   偶数的分频技巧

(1)       任意偶数分频(占空比为50%)的模板

/******************** N  dividen clk   (1:1) duty  Template ***************/

module clk_div(

inputclk_100,

output clk_out

);

/********* 10 dividen clk 1:1 duty   success *********/

//  1--2--3--4--5-- ...--9--0--1  10分频就只需要10个状态

parameter N =4‘d8;  // here replace: 14, 12, 10, 8, 6, 4, 2

reg [3:0] cnt =4‘d0;

[email protected](posedge clk_100)

begin

if(cnt == (N-1) )

cnt <= 4‘d0;

else

cnt <= cnt + 1‘b1;

end

reg clkout =1‘b0;

[email protected](posedge clk_100)

begin

if(cnt == 4‘d0)

clkout <= 1‘b1;

else if(cnt == (N/2))

clkout <= 1‘b0;

else

clkout <= clkout;

end

assign clk_out =clkout;

/***********************************************************/

上面的仿真图:

(2)       任意偶数分频(占空比为任意)的模板

/********************偶数任意分频 占空比为 (N/2+X):(N/2-X)的 模板  success ***************/

module clk_div(

inputclk_100,

output clk_out

);

//  1--2--3--4--5-- ...--9--0--1  10分频就只需要10个状态

parameter N =4‘d8;  // 14, 12, 10, 8 ,6 ,4 ,2

parameter X =4‘d2;

reg [3:0] cnt =4‘d0;

[email protected](posedge clk_100)

begin

if(cnt == (N-1) )

cnt <= 4‘d0;

else

cnt <= cnt + 1‘b1;

end

reg clkout =1‘b0;

[email protected](posedge clk_100)

begin

if(cnt == 4‘d0)

clkout <= 1‘b1;

else if(cnt == (N/2 + X))

clkout <= 1‘b0;

else

clkout <= clkout;

end

assign clk_out =clkout;

/***********************************************************************************/

上面的仿真图:

(二)   奇数的分频技巧

(1)       任意奇数分频(占空比为50%)的模板

/*******************************  任意奇数分频 (占空比为50%)************************************/

module clk_div(

inputclk_100,

output clk_out

);

parameter N =9;   // Dividend

reg [3:0] cnt_p= 0;

[email protected](posedge clk_100)

begin

if(cnt_p == N-1)

cnt_p <= 4‘d0;

else

cnt_p<= cnt_p + 1‘b1;

end

reg clk_p = 0;

[email protected](posedge clk_100)

begin

if(cnt_p == (N-1)/2)

clk_p <= ~clk_p;

elseif(cnt_p == (N-1))

clk_p <= ~clk_p;

else

clk_p <= clk_p;

end

reg [3:0] cnt_n= 0;

[email protected](negedge clk_100)

begin

if(cnt_n == N-1)

cnt_n <= 4‘d0;

else

cnt_n <= cnt_n + 1‘b1;

end

reg clk_n = 0;

[email protected](negedge clk_100)

begin

if(cnt_n == (N-1)/2)

clk_n <= ~clk_n;

elseif(cnt_n == (N-1))

clk_n <= ~clk_n;

else

clk_n <= clk_n;

end

assign clk_out =clk_n | clk_p;

/*****************************************************************************/

仿真图如下:

(2)       任意奇数分频(占空比为任意)的模板

/********************************************任意分频要点和注意事项*******************************************************

1. 公式: fi*K = fo*2^32      fi -- 输入频率    fo -- 输出频率   k -- 计数步长

2. 占空比问题:  用这种方式求占空比问题时候,如果是是奇数分频,那么不能求到准确的1:1占空比。 (比如我们求5分频,那么我们只能求1/5的整数倍的占空  比) 在求准确的占空比时候,比如我们在5分频时候,那么可以跟2^32/5 的整数倍(1~4)进行比较,然后输出高低电平,进而输出一定的占空比

3. 弊端: 任意分频只能求一定的占空比,不能求1:1占空比. 这是它的弊端。

/***************************************************************************************************************************/

/*******************************  任意分频 ************************************/

//  fout*2^32 = fin*K      k = fout*2^32/fin = 20*2^32/100 = 2^32/5

//   2^32 = 4294967296;

//   2^32/2 = 32‘d2147483648;

//   2^32/5 = 32‘d858993459

parameter K =32‘d858993459;   //  2^32/5 = 858993459         步长为 2^32/5  所以可以使用步长的整数倍来进行分频时候使用

parameter X =4‘d2;  // 1, 2 ,3 ,4

reg [31:0] cnt =32‘d0;

[email protected](posedge clk_100)

begin

cnt <= cnt + K;

end

reg clkout;

[email protected](posedge clk_100)

begin

if(cnt <= X*K)   //  cnt< 2*2^32/5 --- 占空比为  3:2

clkout<= 1‘b0;

else

clkout<= 1‘b1;

end

assign clk_out =clkout;

/*****************************************************************************/

下面是仿真图:

/***************************************************************  for example  *******************************************************************

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

//

// Create Date:    10:59:16 08/09/2015

// Design Name:

// Module Name:    clk_div

// Project Name:

// Target Devices:

// Tool versions:

// Description:

//

// Dependencies:

//

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//

//////////////////////////////////////////////////////////////////////////////////

module clk_div(

input clk_100,

// output [1:0]cnta,

// output [1:0]cntb,

output cnta,

output cntb,

output clk_out

);

/******************** 偶数任意分频 占空比为50%模板  1:1 duty   success ***************

//  1--2--3--4--5-- ...--9--0--1  10分频就只需要10个状态

parameter N = 4‘d8;  // 14, 12, 10, 8 ,6 ,4 ,2

reg [3:0] cnt = 4‘d0;

[email protected](posedge clk_100)

begin

if(cnt == (N-1) )

cnt <= 4‘d0;

else

cnt <= cnt + 1‘b1;

end

reg clkout = 1‘b0;

[email protected](posedge clk_100)

begin

if(cnt == 4‘d0)

clkout <= 1‘b1;

else if(cnt == (N/2))

clkout <= 1‘b0;

else

clkout <= clkout;

end

assign clk_out = clkout;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/***********************************************************************************/

/******************** 偶数任意分频 占空比为 (N/2+X):(N/2-X)的 模板   success ***************

//  1--2--3--4--5-- ...--9--0--1  10分频就只需要10个状态

parameter N = 4‘d8;  // 14, 12, 10, 8 ,6 ,4 ,2

parameter X = 4‘d2;

reg [3:0] cnt = 4‘d0;

[email protected](posedge clk_100)

begin

if(cnt == (N-1) )

cnt <= 4‘d0;

else

cnt <= cnt + 1‘b1;

end

reg clkout = 1‘b0;

[email protected](posedge clk_100)

begin

if(cnt == 4‘d0)

clkout <= 1‘b1;

else if(cnt == (N/2 + X))

clkout <= 1‘b0;

else

clkout <= clkout;

end

assign clk_out = clkout;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/***********************************************************************************/

/*************   2 dividen clk  right *******************

reg clk_R = 1‘b0;

[email protected](posedge clk_100)

begin

clk_R = ~ clk_R;

end

assign clk_out = clk_R;

/*******************************************************/

/******************** 4 dividen clk 3:1 duty   success ***************

//  1--2--3--0--1  4分频就只需要4个状态

reg [1:0] cnt = 2‘d0;

[email protected](posedge clk_100)

begin

if(cnt == 2‘d3)

cnt <= 2‘d0;

else

cnt <= cnt + 1‘b1;

end

reg clkout = 1‘b0;

[email protected](posedge clk_100)

begin

if(cnt == 2‘d1)

clkout <= 1‘b1;

else if(cnt == 2‘d0)

clkout <= 1‘b0;

else

clkout <= clkout;

end

assign clk_out = clkout;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/***********************************************************/

/******************** 6 dividen clk 4:2 duty   success ***************

//  1--2--3--4--5--0--1  6分频就只需要6个状态

reg [2:0] cnt = 3‘d0;

[email protected](posedge clk_100)

begin

if(cnt == 3‘d5)

cnt <= 3‘d0;

else

cnt <= cnt + 1‘b1;

end

reg clkout = 1‘b0;

[email protected](posedge clk_100)

begin

if(cnt == 3‘d1)

clkout <= 1‘b1;

else if(cnt == 3‘d5)

clkout <= 1‘b0;

else

clkout <= clkout;

end

assign clk_out = clkout;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/***********************************************************/

/******************** 偶数任意分频 占空比为50%模板  1:1 duty   success ***************

//  1--2--3--4--5-- ...--9--0--1  10分频就只需要10个状态

parameter N = 4‘d8;  // 14, 12, 10, 8 ,6 ,4 ,2

reg [3:0] cnt = 4‘d0;

[email protected](posedge clk_100)

begin

if(cnt == (N-1) )

cnt <= 4‘d0;

else

cnt <= cnt + 1‘b1;

end

reg clkout = 1‘b0;

[email protected](posedge clk_100)

begin

if(cnt == 4‘d0)

clkout <= 1‘b1;

else if(cnt == (N/2))

clkout <= 1‘b0;

else

clkout <= clkout;

end

assign clk_out = clkout;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/***********************************************************************************/

/***************** 3 dividen clk  error *****************

//This code looks like right,and simulation shows right

// But it is wrong.

reg [2:0] cnt = 3‘d0;

reg clk_R = 1‘b0;

[email protected](clk_100)

begin

if(cnt < 3‘d3)

cnt = cnt + 1‘b1;

if(cnt == 3‘d3)

begin

clk_R = ~ clk_R;

cnt = 3‘d0;

end

end

assign clk_out = clk_R;

/*********************************************************/

/***************** 3 dividen clk  success *****************

reg [1:0] cnt_a = 0;

[email protected](posedge clk_100)

begin

if(cnt_a == 2‘b10)

cnt_a <= 2‘d0;

else

cnt_a <= cnt_a + 1‘b1;

end

reg [1:0] cnt_b = 0;

[email protected](negedge clk_100)

begin

if(cnt_b == 2‘b10)

cnt_b <= 2‘d0;

else

cnt_b <= cnt_b + 1‘b1;

end

reg clk_R = 1‘b0;

[email protected](cnt_a or cnt_b)

begin

if((cnt_a + cnt_b == 3‘d4) || (cnt_a + cnt_b == 3‘d1))

clk_R <= ~ clk_R;

else

clk_R <= clk_R;

end

assign clk_out = clk_R;

assign cnta = cnt_a;

assign cntb = cnt_b;

/*********************************************************/

/******************   3 dividen clk  success  **********************

reg q1,q2,d,throut;

initial

begin

d  = 0;

q1 = 0;

q2 = 0;

throut = 0;

end

always @(posedge clk_100)

if(!d)

q1=1‘b1;

else

q1=~q1;

always @(negedge clk_100)

if(!d)

q2=1‘b1;

else

q2=~q2;

always @(q1 or q2)

d=q1&q2;

always @(posedge d)

throut=~throut;

assign clk_out = throut;

/*******************************************************************/

/********************* 3 dividen clk  success duty50%  **********************

reg [1:0] step1, step;

always @(posedge clk_100)

begin

case (step)   //这个状态机就是一个计数器

2‘b00: step<=2‘b01;

2‘b01: step<=2‘b10;

2‘b10: step<=2‘b00;

default :step<=2‘b00;

endcase

end

always @(negedge clk_100)  //step1与step相差半个clk

begin

case (step1)

2‘b00: step1<=2‘b01;

2‘b01: step1<=2‘b10;

2‘b10: step1<=2‘b00;

default :step1<=2‘b00;

endcase

end

assign clk_out = step[1] | step1[1]; //利用step和step1高位的或运算,实现在1.5个clk时翻转。

/***********************************************************************************/

/********************* 5 dividen clk success duty50% **********************

reg [2:0] step1, step2;

[email protected](posedge clk_100)

begin

case (step1)

3‘b000: step1<=3‘b001;

3‘b001: step1<=3‘b011;

3‘b011: step1<=3‘b100;

3‘b100: step1<=3‘b010;

3‘b010: step1<=3‘b000;

default:step1<=3‘b000;

endcase

end

[email protected](negedge clk_100)

begin

case (step2)

3‘b000: step2<=3‘b001;

3‘b001: step2<=3‘b011; //注意调换了顺序,目的为了使最低位为1的情况互邻

3‘b011: step2<=3‘b100;

3‘b100: step2<=3‘b010;

3‘b010: step2<=3‘b000;

default:step2<=3‘b000;

endcase

end

assign clk_out = (step1[0]|step2[0]); //step1与step2 最低位相或

assign cnta = 2‘b11;

assign cntb = 2‘b11;

/********************* 5 dividen clk success  50%duty **********************

reg [2:0] cnt_p = 0;

reg [2:0] cnt_n = 0;

reg clk_p = 0;

reg clk_n = 0;

parameter N = 5;

//  posedge clk   0-1-2-3-4-0

[email protected](posedge clk_100)

begin

if(cnt_p==N-1)

cnt_p <=0;

else

cnt_p <= cnt_p + 1;

end

[email protected](posedge clk_100)

begin

if(cnt_p==(N-1)/2)   //2

clk_p <= !clk_p;

else if(cnt_p==N-1)

clk_p <= !clk_p; //4

end

// negedge clk   0-1-2-3-4-0

[email protected](negedge clk_100 )

begin

if(cnt_n==N-1)

cnt_n <=0;

else

cnt_n <= cnt_n + 1;

end

[email protected](negedge clk_100)

begin

if(cnt_n==(N-1)/2)

clk_n <= !clk_n;

else if(cnt_n==N-1)

clk_n <= !clk_n;

end

assign clk_out = clk_p | clk_n;

//***********  for simulation  **************

//assign cnta = clk_p;

//assign cntb = clk_n;

//*******************************************

assign cnta = 2‘b11;

assign cntb = 2‘b11;

/*********************************************************/

/*******************************  5 分频  ************************************

//  fout*2^32 = fin*K      k = fout*2^32/fin = 20*2^32/100 = 2^32/5

//   2^32 = 4294967296;

//   2^32/2  = 32‘d2147483648;

//   2^32/5  = 32‘d858993459

parameter K = 32‘d858993459;   //  2^32/5 = 858993459

reg [31:0] cnt = 32‘d0;

[email protected](posedge clk_100)

begin

cnt <= cnt + K;

end

reg clkout;

[email protected](posedge clk_100)

begin

if(cnt < 32‘d2147483648)   //  cnt < 2^32/5---占空比为  4:1     cnt < 2^32/2---占空比为  1:1

clkout <= 1‘b0;

else

clkout <= 1‘b1;

end

assign clk_out = clkout;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/*****************************************************************************/

/********************* 7 dividen clk duty = 50%  success **********************

reg [2:0] cnt_p = 0;

reg [2:0] cnt_n = 0;

reg clk_p = 0;

reg clk_n = 0;

parameter N = 7;

[email protected](posedge clk_100)

begin

if(cnt_p == N-1)

cnt_p <= 3‘d0;

else

cnt_p <= cnt_p + 1‘b1;

end

[email protected](posedge clk_100)

begin

if(cnt_p == (N-1)/2)

clk_p <= ~ clk_p;

else if(cnt_p == (N-1))

clk_p <= ~ clk_p;

else

clk_p <= clk_p;

end

[email protected](negedge clk_100)

begin

if(cnt_n == N-1)

cnt_n <= 3‘d0;

else

cnt_n <= cnt_n+ 1‘b1;

end

[email protected](negedge clk_100)

begin

if(cnt_n == (N-1)/2)

clk_n <= ~ clk_n;

else if(cnt_n == (N-1))

clk_n <= ~ clk_n;

else

clk_n <= clk_n;

end

assign cnta = clk_p;

assign cntb = clk_n;

assign clk_out = clk_p | clk_n;

/********************************************************/

/******************************************** 任意分频要点和注意事项 *******************************************************

1. 公式:  fi*K = fo*2^32      fi -- 输入频率    fo -- 输出频率   k -- 计数步长

2. 占空比问题:  用这种方式求占空比问题时候,如果是是奇数分频,那么不能求到准确的1:1占空比。 (比如我们求5分频,那么我们只能求1/5的整数倍的占空比)

在求准确的占空比时候,比如我们在5分频时候,那么可以跟 2^32/5 的整数倍(1~4)进行比较,然后输出高低电平,进而输出一定的占空比

3. 弊端:  任意分频只能求一定的占空比,这是它的弊端。

/**********************************************************************************************************************/

/*******************************  任意分频  ************************************

//  fout*2^32 = fin*K      k = fout*2^32/fin = 20*2^32/100 = 2^32/5

//   2^32 = 4294967296;

//   2^32/2  = 32‘d2147483648;

//   2^32/5  = 32‘d858993459

parameter K = 32‘d858993459;   //  2^32/5 = 858993459         步长为 2^32/5  所以可以使用步长的整数倍来进行分频时候使用

parameter X = 4‘d2;  //  1, 2 ,3 ,4

reg [31:0] cnt = 32‘d0;

[email protected](posedge clk_100)

begin

cnt <= cnt + K;

end

reg clkout;

[email protected](posedge clk_100)

begin

if(cnt < X*K)   //  cnt < 2*2^32/5---占空比为  3:2      if(cnt <= X*K)

clkout <= 1‘b0;

else

clkout <= 1‘b1;

end

assign clk_out = clkout;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/*****************************************************************************/

/*******************************  任意奇数分频 (占空比为50%)  ************************************/

parameter N = 9;   //  Dividend

reg [3:0] cnt_p = 0;

[email protected](posedge clk_100)

begin

if(cnt_p == N-1)

cnt_p <= 4‘d0;

else

cnt_p <= cnt_p + 1‘b1;

end

reg clk_p = 0;

[email protected](posedge clk_100)

begin

if(cnt_p == (N-1)/2)

clk_p <= ~clk_p;

else if(cnt_p == (N-1))

clk_p <= ~clk_p;

else

clk_p <= clk_p;

end

reg [3:0] cnt_n = 0;

[email protected](negedge clk_100)

begin

if(cnt_n == N-1)

cnt_n <= 4‘d0;

else

cnt_n <= cnt_n + 1‘b1;

end

reg clk_n = 0;

[email protected](negedge clk_100)

begin

if(cnt_n == (N-1)/2)

clk_n <= ~clk_n;

else if(cnt_n == (N-1))

clk_n <= ~clk_n;

else

clk_n <= clk_n;

end

assign clk_out = clk_n | clk_p;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/*****************************************************************************/

/***********************************  7分频  占空比为 4:3  success *********************************

//  2^32*fout = K*fin;    fin=100  fout=100/7= 14.285714285714285714285714285714

parameter K = 32‘d613566756;  //  2^32*fout/fin = k = 2^32/7 = 613566756      4*k = 2454267026

reg [31:0] cnt = 32‘d0;

[email protected](posedge clk_100)

begin

cnt <= cnt + K;

end

reg clkout = 1‘b0;

[email protected](posedge clk_100)

begin

if(cnt <= 32‘d2454267026)   //  4*k

clkout <= 1‘b1;

else

clkout <= 1‘b0;

end

assign clk_out = clkout;

assign cnta = 1‘b1;

assign cntb = 1‘b1;

/****************************************************************************************/

endmodule

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 10:44:11

Verilog实现任意分频和占空比的相关文章

基于Verilog的偶数、奇数、半整数分频以及任意分频器设计

在FPGA的学习过程中,最简单最基本的实验应该就是分频器了.由于FPGA的晶振频率都是固定值,只能产生固定频率的时序信号,但是实际工程中我们需要各种各样不同频率的信号,这时候就需要对晶振产生的频率进行分频.比如如果FPGA芯片晶振的频率为50MHz,而我们希望得到1MHz的方波信号,那么就需要对晶振产生的信号进行50分频. 分频器的设计虽然是FPGA学习过程中最简单的实验,但是真正想要把分频器的来龙去脉弄清楚,还是需要花费一番功夫的.下面先介绍一下最常见的几种分频器写法: 1.偶数分频器 相信大

Verilog学习笔记简单功能实现(六)...............计数分频电路

在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 1 module half_clk(clr,clk_in,clk_out,out2); 2 input clr,clk_in; 3 output clk_out,out2; 4 reg clk_out,out2; 5 6 always @(posedge clk_in) 7 begin 8 if (clr==0) begin clk_out=0; out2=

基础项目(5)任意时钟分频程序设计讲解

写在前面的话 在数字逻辑电路设计中,分频器是一种基本的电路单元.通常用来对某个给定频率进行分频,以得到所需的频率.分频在FPGA的设计中一直都担任着很重要的角色,而说到分频,我相信很多人都已经想到了利用计数器计数来得到想要的时钟频率,但问题是仅仅利用计数器来分频,只可以实现偶数分频,而如果需要三分频.五分频.七分频等等奇数类分频,那应该怎么办呢?在这里,梦翼师兄为大家介绍一种可以实现任意整数分频的方法. 实现原理 这种方法同样也是利用了计数器来实现,当然我们是使用状态机来实现的.我们首先定义分频

基于Verilog的奇数偶数小数分频器设计

今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然连上我只有两个人,但丝毫不影响我们的工作热情和创业野心.合抱之木,生于毫末:九层之台,起于垒土:千里之行,始于足下! 首先小编在这里分享一个基于Verilog语言的分频器设计,该分频器实现了奇数.偶数.小数(0.5)分频,可综合,能跑700M左右的时钟,基本能够满足大部分应用需求. 一:背景 前天,

FPGA小白学习之路(1) System Verilog的概念以及与verilog的对比

转自CSDN:http://blog.csdn.net/gtatcs/article/details/8970489 SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型.结构.压缩和非压缩数组. 接口.断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力.SystemVerilog由Acceller

时钟分频

占空比为50%分频: 偶数分频,一个计数器就可以搞定: 奇数分频: 1.用两个计数器分别按照上升下降沿计数,最后如果高电平的比低电平多一个周期则用与门,少一个周期则用或门: 2.另一种使用异或门的形式组合如下图: 先根据上升沿计数(只用到一个计数器)从0计到(N-1) 再产生两个使能信号tff_1en.tff_2en,其中tff_1en为计数0时使能,tff_2en为计数到(N+1)/2时使能 然后根据tff_1en和上升沿产生分频时钟div1,根据tff_2en和下降沿产生分频时钟div2:

《FPGA全程进阶---实战演练》第五章 基于74HC595的LED操作

1基础理论部分 1.1分频 分频,是的,这个概念也很重要.分频是指将一单一频率信号的频率降低为原来的1/N,就叫N分频.实现分频的电路或装置称为“分频器”,如把33MHZ的信号2分频得到16.5MHZ的信号,3分频得到11MHZ的信号,10分频得到3.3MHZ的信号. 分频主要是相对于主晶振来说,用不到那么高的频率,开发板一般根据具体需要会加入晶振,一般若是功耗较高可选用50MHz,其他情况可以相对调整,如24MHz等等.那么分频的典型应用,二分频,四分频,八分频,还有任意分频. 对于分频,我们

FPGA整理资料

1.寄存器与锁存器 锁存器:电平触发的存储单元,在有效电平时间里可以多次改变数据. 优点:    占触发器资源少,缺点是容易产生毛刺.(附上去毛刺的方法:格雷码计数器(*https://blog.csdn.net/qp314/article/details/5147695*)代替二进制码计数器,或者用D触发器同步.) 在FPGA中用的很少,因为FPGA中触发器的资源非常丰富. 寄存器:边沿触发的存储单元,在上升或下降沿数据变化,一个周期里只能变化一次.(寄存器是有DFF(D触发器)构成的,它起的

深入理解7816(1)---- 关于F/D和etu

深入理解7816(1)---- 关于F/D和etu 对于刚接触智能卡的工程师来说,在阅读7816-3规范的时候,常常被其中的一些术语迷惑,读起来会觉得有些别扭.尤其是在看到复位应答中的F和D设置以及对应的etu的时候,会觉得有些复杂和难以理解. 其实从本质上说7816-3定义了智能卡(这里指的是接触式CPU卡,对于逻辑加密卡以及非接触IC卡不在此列)和读写设备之间的通讯协议,说白了就是数据位传输的格式. 如果学习或者接触过单片机,那么对于RS232一定不会陌生,它属于异步串行通讯接口(UART)