概述
时钟使能
1.时钟使能是用分频得到的信号作为模块的使能信号,模块原有的时钟不变。即用分频信号去控制模块的使能端口。这样做的好处是:避免过于复杂的时钟信号设计。
2.是出于对于时钟信号质量的高要求,尽量避免时钟产生毛刺,减少skew。所以推荐使用DCM,PLL之类的模块完成分频。
3.使用时钟使能也可以控制时钟作用的时间,就好像频率降低了一样。
时钟使能(CE)的原理其实很简单。逻辑实现是这样的,普通的D触发器(寄存器)的输出引回来和输入信号共同进入一个两路选择器,这个选择器的控制就是CE,选择器的输出进入普通的D触发器或者寄存器。这样,CE有效的时候,选择输入信号直接进入D触发器,CE无效的时候,上一个周期的信号输入D触发器,所以寄存器的值保持不变,就好像时钟被禁止了一样。
4.时钟使能就是使原始时钟信号的上升沿经过n次有效一次。是用来让寄存器低频采集某一路数据的,并不能完全代替一个真正的低频时钟。
还有用时钟使能时,会使采样推迟半个时钟周期,这是要注意的。
5.因为系统的全局时钟资源是有限的,所以说我们尽量在片内使用同步电路的设计方法,使用同一个时钟来触发,这样可以保证不同的LE(逻辑单元)其clock skew最小,对系统进行STA分析的结果是准确的。但是不同的模块其所要求的速率是不一样的,所以我们要用时钟使能的方式,对于低速应用,只在时钟使能信号有效的情况下才触发。
对于不同的FPGA芯片,采用同样的时钟信号使能方式但综合后的结果是不一样的,有的时钟使能信号直接加在片内DFF的使能端,而有的则是与输入信号,触发器输出进行一番逻辑运算后输入到DFF的输入端口,使得使能信号为0时输出不变,输入为1时随输入信号的变化而变化。
verilog带有使能端的处理方式
always @(posedge clk)
begin
if (en)
.......
else
.......
end
举例
在某系统中,前级数据输入位宽为8位,而后级的数据输出位宽为32,我们需要将8bit数据转换为32bit,由于后级的处理位宽为前级的4倍,因此后级处理的时钟频率也将下降为前级的1/4,若不使用时钟使能,则要将前级的时钟进行4分频来作后级处理的时钟。这种设计方法会引入新的时钟域,处理上需要采取多时钟域处理的方式,因而在设计复杂度提高的同时系统的可靠性也将降低。为了避免以上问题,我们采用了时钟使能以减少设计复杂度。
- 设计文件(分频方法)
module clk_en1(clk, rst_n, data_in, data_out);
input clk;
input rst_n;
input [7:0] data_in;
output [31:0] data_out;
reg [31:0] data_out;
reg [31:0] data_shift;
reg [1:0] cnt;
wire clken;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
cnt <= 0;
else
cnt <= cnt + 1;
end
assign clken = cnt[1];
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
data_shift <= 0;
else
data_shift <= {data_shift[23:0],data_in};
end
always @(posedge clken or negedge rst_n)
begin
if (!rst_n)
data_out <= 0;
else
data_out <= data_shift;
end
endmodule
- 设计文件(时钟使能)
`timescale 1ns / 1ps
module clk_en(clk, rst_n, data_in, data_out);
input clk;
input rst_n;
input [7:0] data_in;
output [31:0] data_out;
reg [31:0] data_out;
reg [31:0] data_shift;
reg [1:0] cnt;
reg clken;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
cnt <= 0;
else
cnt <= cnt + 1;
end
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
clken <= 0;
else if (cnt == 2'b01)
clken <= 1;
else
clken <= 0;
end
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
data_shift <= 0;
else
data_shift <= {data_shift[23:0],data_in};
end
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
data_out <= 0;
else if (clken == 1'b1)
data_out <= data_shift;
end
- 仿真文件
`timescale 1ns / 1ps
module test_sim();
reg clk;
reg rst_n;
reg [7:0] data_in=8'b1;
wire [31:0] data_out;
initial begin
clk=0;
rst_n=0;
#20 rst_n=1;
end
always
#10 clk=~clk;
clk_en clk_en_u(
.clk(clk),
.rst_n(rst_n),
.data_in(data_in),
.data_out(data_out)
);
endmodule
- 仿真结果
来源:代码参考来源
总结一句话:别把分频出来的时钟当时钟用
最后
以上就是拉长盼望为你收集整理的verilog时钟使能时钟使能verilog带有使能端的处理方式举例的全部内容,希望文章能够帮你解决verilog时钟使能时钟使能verilog带有使能端的处理方式举例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复