目录
锁存器与触发器
寄存器与移位寄存器
分频器及其应用
偶分频器
奇分频器
半整数分频器
分频器的应用
锁存器与触发器
锁存器与触发器是两种最基本的存储电路。 锁存器是电平敏感器件,而触发器是边沿触发器件。 为了使用灵活方便,商品化的锁存器/触发器都附加有复位端(和置位端),分为异步复位和同步复位两类。
描述具有异步复位功能的JK触发器的Verilog代码参考如下:
module JKFF_async_rst(clk,rst_n,j,k,q);input clk,rst_n;input j,k;output reg q;always @( posedge clk or negedge rst_n )if ( !rst_n ) // 低电平有效q <= 1'b0;else
描述具有异步复位功能的D触发器的Verilog代码参考如下:
module DFF_async_rst(clk,rst_n,d,q);input clk,rst_n,d;output reg q;always @( posedge clk or negedge rst_n )if ( !rst_n )q <= 1'b0; elseq <= d;
endmodule
描述具有同步复位功能的D触发器的Verilog代码参考如下:
module DFF_sync_rst(clk,rst_n,d,q);input clk,rst_n,d;output reg q;always @ ( posedge clk )if ( !rst_n )q <= 1'b0; elseq <= d;
endmodule
寄存器与移位寄存器
74HC573是8位三态寄存器,内部由D锁存器构成,在微处理器/控制器系统中用于数据或者地址信号的锁定。
module HC573(d,le,oe_n,q);input [7:0] d;input le,oe_n;output wire [7:0] q;// 定义内部变量reg [7:0] qtmp; // 三态输出assign q = (!oe_n)? qtmp : 8'bz; // 锁存过程always @( d, le ) if ( le ) qtmp <= d;
endmodule
74HC194是四位双向移位寄存器,具有异步复位,同步左移/右移、并行输入和保持功能。
module HC194(clk,rd_n,s,din,dil,dir,q);input clk,rd_n,dil,dir;input [0:3] din;input [1:0] s;output reg [0:3] q;// 功能描述always @(posedge clk or negedge rd_n) if (!rd_n) q <= 4'b0000;else case (s)2'b01: // 右移q[0:3] <= {dir,q[0:2]}; 2'b10: // 左移q[0:3] <= {q[1:3],dil}; 2'b11: // 并行输入q <= din; default: // 保持q <= q; endcaseendmodule
74HC160/162为常用的同步十进制计数器,74HC161/163为常用的同步十六进制计数器。74HC160/161/162/163的管脚排列完全相同,不同的是,74HC160/161具有异步复位功能,74HC162/163具有同步复位功能
module HC160(clk,rd_n,ld_n,ep,et,d,q,co);input clk,rd_n,ld_n,ep,et;input [3:0] d;output reg [3:0] q;output wire co;// 进位逻辑assign co = (( q == 4'b1001 ) & et ); // 计数过程always @( posedge clk or negedge rd_n ) if ( !rd_n ) q <= 4'b0000;else if ( !ld_n ) q <= d;else if ( ep & et )if ( q == 4'b1001 ) q <= 4'b0000; else q <= q + 1'b1; endmodule
74HC191是单时钟16进制加/减计数器,其中U'/D是计数方式控制端,当U'/D=0时实现加法计数,U'/D=1时实现减法计数。进/借位信号C/B在进行加法计数时,在状态“1111”输出进位信号,在进行减法计数时,在状态“0000”输出借位信号。
module HC191(clk,s_n,ld_n,und,d,q,ocb);input clk,s_n,ld_n,und;input [3:0] d;output reg [3:0] q;output wire ocb;// 进位和借位逻辑assign ocb = (~und &( q==4'b1111 )) | ( und &(q == 4'b0000));// 计数过程always @(posedge clk or negedge ld_n)if ( !ld_n ) q <= d;else if ( !s_n )if ( !und ) q <= q + 1'b1;else q <= q - 1'b1;endmodule
分频器及其应用
CD4060: 14级异步二进制 计数器/分频器, 带RC或者晶振电路。
分频器是一种时序逻辑电路,用于降低信号的频率。 设分频器时钟信号的频率用fclk表示,分频输出信号的频率用ffpout表示,则N分频器输出信号的频率与时钟信号频率之间的关系为:ffpout=fclk/N。 根据分频系数N的特点,可将分频器分为偶分频器,奇分频器和半小数分频器三种基本类型。 通用分频器的实现方法是:应用 N 进制计数器(状态:0~N-1),将待分频的信号作为计数器的时钟脉冲,分频信号作为输出。设 M 为 1~N-1 之间的任意整数,在计数器从 0 计到 M-1 期间, 分频信号输出为低(或高)电平,再从 M 计到 N-1 期间,分频信号输出为高(或低)电平。 其中 M 的具体数值可根据占空比的要求进行调整。
module fp_N ( clk,en,N,M,fp_out );input clk,en; // en为分频器控制(enable)信号,高电平有效input [11:0] N; // 分频系数N,定义为12位时最大分频系数为4095 input [11:0] M; // 高低电平分界设置,根据需要可在1~4095之间调整output wire fp_out; // 分频输出信号// 定义内部计数器reg [11:0] cnt; // 容量应满足2n≥Nassign fp_out = ( cnt < M ) ? 1'b0 : 1'b1; // 分频输出// 分频过程always @( posedge clk ) if ( !en ) cnt <= 12'b0; // 控制信号无效时 else if ( cnt < N-1 )cnt <= cnt + 1'b1; else cnt <= 12'b0; endmodule
偶分频器
偶分频器的分频系数N为偶数。 输出为方波的偶分频器除了通用分频器,取M=N/2的实现方法之外,还有另一种实现方法:应用N/2进制计数器,将待分频的信号作为计数器的时钟脉冲,分频信号作为输出。每当计数器计满N/2个脉冲时,控制分频输出信号翻转,同时将计数器清零,在下次时钟到来时重新开始计数。如此循环反复,可以实现任意偶数分频。
module fp_even( clk,en,N_even,fp_out );input clk,en; // en为分频器控制(enable)信号,高电平有效input [11:0] N_even; // 偶分频系数N,定义12位时最大分频系数为4094output reg fp_out; // 分频信号输出// 定义内部n位计数器reg [11:0] cnt; // 计数容量应满足2n≥(N/2)// 分频过程always @ ( posedge clk )if ( !en ) // 控制信号无效时 begin cnt <= 12'b0; fp_out<= 1'b0; endelseif ( cnt < ( N_even/2-1 ))cnt <= cnt + 1'b1; elsebegin cnt <= 12'b0; fp_out<= ~fp_out; end
endmodule
奇分频器
奇分频器的分频系数 N 为奇数。 如果不要求分频输出信号为方波,奇分频可以用通用分频器实现。 如果要求分频输出信号为方波,则具体的实现方法是:应用两个N进制计数器,将待分频的信号作为计数器的时钟脉冲,分别在时钟脉冲的上升沿和下降沿进行N进制计数。当计数器从0计到(N-1)/2时分频输出为低电平,再从(N+1)/2计到N-1时分频输出为高电平,分别得到两个占空比非50%的分频信号,然后将两个分频输出信号相或即可得到方波信号。
module fp_odd(clk,en,N_odd,fp_out);input clk,en; // en为分频器控制信号,高电平有效input [11:0] N_odd; // 奇分频系数N,定义为12位最大分频系数为4095output wire fp_out;reg [11:0] cnt1,cnt2; // 内部n位计数器,计数容量应满足2n>N(* synthesis,probe_port,keep *) wire fp1,fp2; // 内部线网assign fp1 = (cnt1 <= (N_odd-1)/2)? 0:1; // 输出逻辑assign fp2 = (cnt2 <= (N_odd-1)/2)? 0:1;assign fp_out = fp1 | fp2;always @( posedge clk ) // 上升沿计数if ( !en ) cnt1 <= 12'b0;else if ( cnt1 < N_odd-1 ) cnt1 <= cnt1 + 1'b1; else cnt1 <= 12'b0; always @ ( negedge clk ) // 下降沿计数if ( !en ) cnt2 <= 12'b0;else if ( cnt2 < N_odd-1 ) cnt2 <= cnt2 + 1'b1;else cnt2 <= 12'b0;endmodule
半整数分频器
半整数分频器是指分频系数为整数一半(如10.5)的分频器。 半整数分频器的实现电路,其中模块N_Counter为上升沿工作的N进制计数器,co为其进位信号。
module fp10p5(clk,fp_out);input clk;output wire fp_out;// 定义内部变量和信号reg [3:0] cnt; (* synthesis,probe_port,keep *) wire co;reg q;wire cnt_clk;// 描述异或门和输出assign cnt_clk = clk ^ q;// 描述输出assign fp_out = q;// 进位信号 assign co = ( cnt == 4'd10 ); // 描述11进制计数器 always @( posedge cnt_clk ) if ( cnt == 4'd10 ) cnt <= 4'd0;elsecnt <= cnt + 1'b1;// 描述T'触发器always @( posedge co )q <= ~q ;
endmodule
分频器的应用
分频器在电子系统中应用广泛。例如,要使用逻辑电路控制直流电机的速度,通常采用脉冲周期固定、占空比可调的PWM信号应用图所示的驱动电路控制直流电机的转速,其中SSR为固态继电器(Solid State Relay),而PWM信号则基于例的通用分频器实现。
应用PWM控制电机转速的原理是:PWM输出脉冲的平均直流量与占空比成正比。PWM信号的占空比越大,电机得到的平均电流量越大,电机的转速就越高。所以,只需要改变PWM信号的占空比,就可以调节电机的转速。