我是靠谱客的博主 拉长盼望,最近开发中收集的这篇文章主要介绍verilog时钟使能时钟使能verilog带有使能端的处理方式举例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

时钟使能

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带有使能端的处理方式举例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部