vue网站开发教程设计师用什么软件设计效果图
news/
2025/10/2 15:16:07/
文章来源:
vue网站开发教程,设计师用什么软件设计效果图,上海市教育网官网,移动商城网站建设本文使用 Zhihu On VSCode 创作并发布跨时钟域同步#xff08;异步FIFO#xff09;之前学习了跨时钟域下的单bit信号同步的方法#xff0c;这些单bit信号多是作为控制信号或者标志信号来使用#xff0c;再实际的项目中#xff0c;处理多bit数据也是十分常见的#xff0c;…本文使用 Zhihu On VSCode 创作并发布跨时钟域同步异步FIFO之前学习了跨时钟域下的单bit信号同步的方法这些单bit信号多是作为控制信号或者标志信号来使用再实际的项目中处理多bit数据也是十分常见的即数据的同步。异步FIFO的实现其实本质上和双口RAM是一样的其实现思路就是将数据在src_clk的时钟下写入自己设定大小的ram中然后通过读时钟des_clk从ram中将数据读出来即可。本次还是以一个具体的例子来说明其实现现在我们从一个较低的时钟域进入到一个较高的时钟域中低时钟域的数据信号为8bit数据现在需要将其缓存并转换成32bit的信号送入32位宽的总线上进行传输。具体实现代码如下module nsync_fifo(input src_clk,input rst_n,input des_clk,input [8-1:0] fifo_data_in,input fifo_data_in_vaild,output reg fifo_data_out_vaild,output [32-1:0] fifo_data_out);// write fifo
reg [1:0] buffer_wr_addr;
reg [32-1:0] temp_buffer;
always (posedge src_clk or negedge rst_n)
beginif (!rst_n)beginbuffer_wr_addr 2b00;endelsebeginbuffer_wr_addr (fifo_data_in_vaild) ? buffer_wr_addr 1b1 : buffer_wr_addr;end
endalways (posedge src_clk)
beginif (fifo_data_in_vaild)begincase(buffer_wr_addr)2d0:temp_buffer[0:8] fifo_data_in;2d1:temp_buffer[8:8] fifo_data_in;2d2:temp_buffer[16:8] fifo_data_in;2d3:temp_buffer[24:8] fifo_data_in;endcaseend
end//gen wr_fifo signal sync
reg fifo_wr;
reg fifo_wr_sync;
wire fifo_wr_clr;
reg fifo_wr_dfb;
always (posedge src_clk)
beginfifo_wr (buffer_wr_addr fifo_data_in_vaild);
endassign fifo_wr_clr !rst_n | fifo_wr_sync; // feed backalways (posedge fifo_wr or posedge fifo_wr_clr)
beginif (fifo_wr_clr)beginfifo_wr_dfb 1b0;endelse beginfifo_wr_dfb 1b1;end
endalways (posedge des_clk) // under des_clk sampled
beginfifo_wr_sync fifo_wr_dfb;
end// recv fifo
wire recv_fifo_wr;
reg [1:0] recv_fifo_wr_addr;assign recv_fifo_wr fifo_wr_sync;
always (posedge des_clk or rst_n)
beginif (!rst_n)beginrecv_fifo_wr_addr 2b00;endelsebeginrecv_fifo_wr_addr (recv_fifo_wr) ? recv_fifo_wr_addr 1b1 : recv_fifo_wr_addr;end
end// sync fifo data
reg [32-1:0] fifo_0;
reg [32-1:0] fifo_1;
always (posedge des_clk)
beginif (recv_fifo_wr) // only buffer_wr_addr 3 genbegincase (recv_fifo_wr_addr[0])1b0 : fifo_0 temp_buffer;1b1 : fifo_1 temp_buffer; endcaseend
end// read data from recv fifo
wire [1:0] recv_fifo_cnt;
wire recv_fifo_full;
wire recv_fifo_ready;
reg [1:0] recv_fifo_rd_addr;
assign recv_fifo_ready | recv_fifo_cnt;
assign recv_fifo_full recv_fifo_cnt[1]; // 2b11 3
assign recv_fifo_cnt recv_fifo_wr_addr - recv_fifo_rd_addr;always (posedge des_clk or negedge rst_n)
beginif (!rst_n)beginrecv_fifo_rd_addr 2b00;endelsebeginrecv_fifo_rd_addr (recv_fifo_ready) ? recv_fifo_rd_addr 1b1 : recv_fifo_rd_addr;end
endreg [32-1:0] recv_fifo_data;
always (*)
begincase(recv_fifo_rd_addr[0])1b0 : recv_fifo_data fifo_0;1b1 : recv_fifo_data fifo_1;endcase
end// out
assign fifo_data_out recv_fifo_data;
always (posedge des_clk or negedge rst_n)
beginif(!rst_n)beginfifo_data_out_vaild 1b0;endelsebeginfifo_data_out_vaild recv_fifo_ready;end
endendmodule
从上面的代码可以发现我这里将src_clk中的写信号fifo_wr通过上章讲解的单bit反馈同步方法同步到了des_clk的时钟域下fifo_wr_sync这样后续的信号处理造作就可以在我们的目标时钟des_clk下进行操作了。因为这里需要缓存的数据很少地址线就显得比较简单了通过一个简单的乒乓操作不断将数据从buffer中写入fifo_0和fifo_1中只要fifo不空就开始读数据。时序如下Image
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925031.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!