首页 > 其他分享 >时钟双边沿触发问题

时钟双边沿触发问题

时间:2024-04-27 17:34:31浏览次数:21  
标签:触发 边沿 clk always module posedge input 时钟

问题

题目链接:Dualedge

题目让实现同时在时钟clk上升沿和下降沿都进行触发(triggered),但是提示说:我们无法通过(posedge clk or negedge clk)这种方式来实现,在FPGA中实际上是不存在这种双边沿触发的触发器的。

image

FPGA(以及其他任何地方)上的触发器是一个具有一个时钟且仅对该时钟的一个边缘敏感的器件。没有真正的硬件设备能够实现@(posedge clk or negedge clk)
有一个例外:IDDR和ODDR,至于具体怎么实现不是很清楚。

解决方法

有一种做法看似能够实现,但是综合的时候是不能通过的

assign clk_gen = ~clk;
always@(posedge clk) begin
    q <= d;

end
always@(posedge clk_gen) begin
    q <= d;
end

两种能够通过的解法:

  • 方法一:可能会产生毛刺
module top_module (
    input clk,
    input d,
    output q
);
    reg p,n;
    always@(posedge clk)
        p <= d;
    always@(negedge clk)
        n <= d;
    assign q = clk ? p : n;
endmodule

为什么会有毛刺产生?可以看下面电路
image
由于触发器输出会产生一个延迟,因此q和p的输出相对clk会有一个延迟,如果采用这种方法,则图中部分会产生毛刺

  • 方法二:官方给的解法
module top_module(
	input clk,
	input d,
	output q);
	
	reg p, n;
	
	// A positive-edge triggered flip-flop
    always @(posedge clk)
        p <= d ^ n;

    // A negative-edge triggered flip-flop
    always @(negedge clk)
        n <= d ^ p;

    // Why does this work? 
    // After posedge clk, p changes to d^n. Thus q = (p^n) = (d^n^n) = d.
    // After negedge clk, n changes to d^p. Thus q = (p^n) = (p^d^p) = d.
    // At each (positive or negative) clock edge, p and n FFs alternately
    // load a value that will cancel out the other and cause the new value of d to remain.
    assign q = p ^ n;

	// Can't synthesize this.
	/*always @(posedge clk, negedge clk) begin
		q <= d;
	end*/

endmodule

标签:触发,边沿,clk,always,module,posedge,input,时钟
From: https://www.cnblogs.com/ziany/p/18162245

相关文章

  • openGauss 触发器
    触发器触发器会在指定的数据库事件发生时自动执行函数。语法格式创建触发器CREATETRIGGERtrigger_name{BEFORE|AFTER|INSTEADOF}{event[OR...]}ONtable_name[FOR[EACH]{ROW|STATEMENT}][WHEN(condition)]EXECUTEPROC......
  • GPS网络时间服务器(子母钟系统)助力考场精准时钟建设
    GPS网络时间服务器(子母钟系统)助力考场精准时钟建设GPS网络时间服务器(子母钟系统)助力考场精准时钟建设京准电子科技官微——ahjzsz【摘要】时钟系统是校园网络中一个重要的精准计时系统,随着网络的普及,许多校园都建了自己的校园专网,使用的网络设备和服务器也日益增多,这些设备都有......
  • WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的
    本文记录WPF的一个已知问题,在RepeatButton上开启IsManipulationEnabled漫游支持之后,将会导致触摸长按到RepeatButton之上时,不会收到源源不断的Click事件这是有个伙伴在WPF官方仓库报告的问题,详细请看https://github.com/dotnet/wpf/issues/8223原始的问题是他发现......
  • 要把 10M 时钟域下的⼀个模 10 计数器的值,传递到异步的 100M 时钟域下。以下说法 正确
    选项:A、可以把计数值转换成格雷码,再⽤100M时钟采样B、可以通过异步fifo传递计数值C、可以⽤计数值+握⼿信号的⽅式传递D、可以先⽤100M时钟把计数值打2拍,再采样答案:BC解析:A、之所以不能使用格雷码做同步的原因是模10计数器的技术范围在0~9,如果是0-15就可以用了......
  • oracel触发器
    1.创建测试表 首先,创建一个名为SAMPLE_TABLE的简单测试表,包含两个字段:ID和DATA。CREATETABLESAMPLE_TABLE(IDNUMBERPRIMARYKEY,DATAVARCHAR2(50));2.创建触发器对应的审计日志表及辅助序列 创建一个名为AUDIT_LOG的表,用于记录触发器触发时的相关信息。 这......
  • 获取整分钟触发事件
    如果您想要确保某个操作在每个新的分钟开始时尽可能准确地执行,最好的方法是使用一个定时器,并在每分钟的开始时重新校准它。这样可以减少累积误差,并确保操作在长时间运行后仍然同步。以下是一个使用Qt的示例,它创建了一个QTimer,它会在每分钟的开始时调用一个函数,并在函数执行后重新......
  • Jenkins集成GitLab的正确姿势,实现Git代码提交触发CI/CD
    ❝jenkins和gitlab是目前DevOps工具链中最常见的,抛开gitlab-ci不谈,gitlab代码提交触发jenkins流水线是最经典的搭配。这里就介绍下如何配置实现jenkins和gitlab之间的集成。安装GitLabPlguinGitlabPlugin-这个插件允许GitLab在提交代码或打开/更新合并请求时触发Jenkins......
  • 对于小程序canvas在某些情况下touchmove 不能连续触发导致的签名不连续替代方案(企微)
    1.问题微信开放社区链接尝试过新版canvas,在企业微信中签名依然是依然断触,有问题的手机是iphoe15,系统版本以及企微版本微信版本均与签名正常的手机一致,但是那个手机就是无法正常签字,在微信中无论新旧canvas均能正常签字2.解决方案既然canvas的touchmove触发有问题,那......
  • GPS北斗卫星同步时钟(卫星授时服务器)的主要特点
    GPS北斗卫星同步时钟(卫星授时服务器)的主要特点 GPS北斗卫星同步时钟(卫星授时服务器)的主要特点 京准电子科技官微——ahjzsz卫星授时服务器是一种用于提供高精度时间信息的服务器,通常通过网络分发时间信息给其他设备和系统;以下是时间同步服务器的主要特点:高精度:卫星授时服务......
  • 常用directive,防止重复点击,点击盒子外部触发的事件,不换行省略号 ,移上去显示详情
    importVuefrom"vue";importstorefrom"../../store";import{debounce}from"throttle-debounce";Vue.directive("demo",{bind:function(el,binding,vnode){console.log("bind");vars=JSO......