对于单比特数据,在慢时钟域到快时钟域的数据传输中,可以使用两级触发器进行同步,以此来解决跨时钟域问题。
但在快时钟域到慢时钟域的数据传输中,只有当in 在很长一段时间内为1或0时,才能确保一定可以被clkb采样到,从而才能用两级触发器同步的方式来处理;
如果快时钟域的输入脉冲信号in的宽度小于慢时钟的周期,那么慢时钟很可能无法采样到(如下图),为了防止漏采样情况的出现,采用展宽信号的方式进行处理。

方法:
1、在clka快时钟域中,对其中的脉冲信号 pulse_ina 进行展宽 signal_a —— 通过握手来确定展宽信号时候什么拉低
注:在握手协议中,展宽信号相当于req,signal_a_r2相当于应答ack信号,来回应展宽信号req可以拉低了。
2、有了展宽信号signal_a 后,将其同步到clkb慢时钟域中(打两拍以防止亚稳态),最终得到signal_b_r1。(通过上升沿检测,取一个周期的pulse_outb,此时则完成了数据从快时钟到慢时钟的传递)
到此还没结束,因为握手任务还没完成,展宽信号的拉低(下降沿)还没确定
3、将clkb慢时钟域中的signal_b_r1信号,同步到clka快时钟域中,以此作为快时钟域的反馈回应,也就是步骤1展宽信号拉低的使能。
4、将clkb慢时钟域采样到的脉冲展宽信号 pulse_outb 输出。
5、将clkb慢时钟域采样到的展宽信号 signal_outb 输出,等于signal_b_r1。

verilog代码:
module Sync_Pulse
(
input clka,//快时钟
input clkb,//慢时钟
input Rst_n,
input Pulse_a, //快时钟域中的脉冲信号
output pulse_outb, //脉冲信号
output signal_outb //电平信号
);
reg signal_a;
reg signal_b;
reg signal_b_r1;
reg signal_a_r1;
reg signal_a_r2;
//展宽信号
always @ (posedge clka or negedge Rst_n)
if(!Rst_n)
signal_a <= 1'b0;
else if(Pulse_a)
signal_a <= 1'b1;
else if(signal_a_r2)
signal_a <= 1'b0;
else
signal_a <= signal_a;
//将展宽信号同步到慢时钟域,两拍
always @ (posedge clkb or negedge Rst_n)
if(!Rst_n) begin
signal_b <= 1'b0;
signal_b_r1 <= 1'b0;
end
else begin
signal_b <= signal_a;
signal_b_r1 <= signal_b;
end
//将慢时钟域采集到的展宽信号,同步到快时钟域中
//作为展宽信号结束的一个反馈
always @ (posedge clka or negedge Rst_n)
if(!Rst_n) begin
signal_a_r1 <= 1'b0;
signal_a_r2 <= 1'b0;
end
else begin
signal_a_r1 <= signal_b_r1;
signal_a_r2 <= signal_a_r1;
end
//检测上升沿,得到慢时钟域的输出脉冲信号
assign pulse_outb = signal_b & ~signal_b_r1;
//输出电平信号,慢时钟域的展宽信号
assign signal_outb = signal_b_r1;
endmodule
tb测试代码:
tb中快时钟域为100Mhz,慢时钟域为50Mhz的展宽信号测试与波形分析,以此和上面手画波形图进行分析
`timescale 1ns/1ns
`define clock_period 20
module Sync_Pulse_tb;
reg clka = 1;//快时钟
reg clkb = 1;//慢时钟
reg Rst_n;
reg Pulse_a; //快时钟域中的脉冲信号
wire pulse_outb; //脉冲信号
wire signal_outb; //电平信号
Sync_Pulse u1(
.clka(clka),//快时钟
.clkb(clkb),//慢时钟
.Rst_n(Rst_n),
.Pulse_a(Pulse_a), //快时钟域中的脉冲信号
.pulse_outb(pulse_outb), //脉冲信号
.signal_outb(signal_outb) //电平信号
);
always #(`clock_period/4) clka = ~clka; //时钟周期是10ns,100MHZ
always #(`clock_period/2) clkb = ~clkb; //时钟周期是20ns,50MHZ
initial begin
Rst_n=0;
Pulse_a=0;
#(`clock_period*20)
Rst_n=1;
#(`clock_period*5)
Pulse_a = 1 ;
#(`clock_period/2)
Pulse_a = 0 ;
#(`clock_period*30)
$stop;
end
endmodule
波形仿真:

给出如下题目:300Mhz到100Mhz,考察快时钟域到慢时钟域的单时钟脉冲信号传输。

不同在于clka和clkb,仅需要修改tb中生成的时钟,其余都相同,为保证精度,选用ps单位。
`timescale 1ps/1ps
always #1666 clka = ~clka; //时钟周期是3ns,300MHZ
always #5000 clkb = ~clkb; //时钟周期是10ns,100MHZ
波形如下,和之前同样分析即可。

总结:
展宽的目的?
防止漏采样。快时钟域中脉冲信号宽度可能小于慢时钟域的周期,因为慢时钟域可能采不到该脉冲信号。
展宽到什么时候?
首先在快时钟域进行展宽,将输入脉冲信号拉高,下降沿需要重点分析,下降沿需要根据 应答信号signal_a_r2 来确定。
由于快时钟域的展宽信号到了慢时钟域中,防止亚稳态打两拍,此时即采样到了慢时钟域中的展宽信号 signal_b_r1,然后即可告知快时钟域,我已经采样到了脉冲信号,于是将 signal_b_r1,同步到快时钟域中(打两拍以防止亚稳态),来作为一个反馈应答signal_a_r2,用该信号告知请求展宽可以拉低了,得到展宽信号下降沿。
最终得到的信号?
慢时钟域的脉冲信号:对在慢时钟域打拍的两个展宽信号进行上升沿检测,即可得到慢时钟域的脉冲信号。
慢时钟域的电平信号:也就是signal_b_r1。
如有错误请指正!
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)
当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/
尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法 实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电