首页 > 编程知识 正文

verilog流水线设计,用verilog设计ROM

时间:2023-05-03 09:47:35 阅读:120100 作者:3229

1管道和握手协定

流水线是电路设计过程中必不可少的实现方式,可以提高电路的性能。 如果我们需要设计高速电路,就需要使用流水线;

流水线的设计是把延迟大的组合逻辑插入寄存器,把大的组合逻辑分成几个时钟周期完成,提高系统的最大时钟频率。 但是,这样一来,导致数据输出的延迟,如果插入一个寄存器,则在数据输出中产生一个时钟周期的延迟,如果插入n个寄存器,则产生n个时钟周期的延迟;

握手协议可确保数据的上游和下游正确接收数据。 握手协议原则是,如果Valid和Ready信号同时高有效,则数据在时钟的上升沿传输。

双流水线握手协议的电路设计

介绍用Verilog设计简单的可变就绪握手电路的基本原理

本设计可以实现数据的流入和数据的流出,实现这种双端口握手的通道传输。 Valid信号和Ready信号的原理类似于FIFO的读写和空信号,就像FIFO的外面被涂层一样。

通过在FIFO的端口信号中添加如上图所示的变频器,还可以获得握手的效果。

可变就绪信号的生成有两种情况

1 .就绪性-基准值

就绪-校验-校验在就绪信号到达校验信号之前有效。

这样,通道就可以在数据到达之前准备接收数据,并保持通道的最大吞吐量。 此通道正在等待数据更新,因为Ready是先生成的。 信道作为接收数据端采用了这样的设计。

2 .验证就绪

Valid-before-Ready是Valid信号在Ready信号之前有效。 通道作为数据输出端采用了这样的设计。 下游接收端的接收准备就绪后,开始传输数据。

对于可变就绪协议Stalemate

Stalemate可以理解为“锁定”。 假设不遵守上面两个接收端和输出端的设计规则。

如果输出侧使用就绪型可变数据,接收侧使用可变数据,则输出侧会等待来自接收侧的就绪型数据,但接收侧也在等待输出侧发出可变数据信号接收数据两个都等着,但两个都不先给,所以这个通道此时无效,被“锁定”。

握手协议的几种连接情况

3 .握手管道的Verilog设计(其中一级) () ) ) ) ) ) ) ) )。

可以基于同步FIFO修改握手接口。 变更电路如下图所示。

assign valid_o=~fifo_empty; assign ready_o=~fifo_full; assign wr_en=ready_o valid_i; assign rd_en=ready_i valid_o;

verilog实现代码:

module handshake _ protocol (input clk,input rst_n,input valid_i,//from pre-stageinput data_i,//from pre-SSS //from post-stageoutput ready_o、//to pre-stageoutput valid_o、//topost-stage outputdata _ o///topost-stalid reg ready_o_r; reg data_r; reg dout; always @ (posedgeclkornegedgerst _ n ) beginif (! rst_n ) beginvalid_o_r=1'b0; data_r=0; endelseif(valid_Iready_o )激昂的毛皮虾valid_o_r=1'b1; data_r=data_i; end elsevalid_o_r=1'b0; end always @ (posedgeclkornegedgerst _ n ) if (! rst_n ) beginready_o_r=1'b0; dout=0; Endelseif(valid_o_rready_I ) begin ready_o_r=1'b1; dout=data_r; end else ready_o_r=1'b0; endassign ready_o=ready_o_r; assign valid_o=valid_o_r; assign data_o=dout; 如果endmodulevld_o为上拉,则表示此级别的数据已经准备好,下一级别的数据可以读取;

如果ready_o为上拉,则表示这些数据已经被读取,高级别数据可以写入新数据;

另外,如果要实现高速流水线作业,即读取该级别的数据时,高级别的数据同时进入,各级寄存器无缝连接。

但是,在上述RTL中,存在在数据未被读取之前不能写入的优先顺序的问题;

always @ (posedgeclkornegedgerst _ n ) beginif (! rst_n ) beginvalid_o_r=1'b0; data_r=0; 可以写入endelseif(valid_Iready_o )激昂的毛皮虾//数据,同时提高valid_o,使下一级读取数据valid_o_r=1'b1; data_r=data_i; endelseif(valid_o_rready_I ) /在数据被读出之后,降低valid_o; valid_o_r=1'b0; end always @ (posedgeclkornegedgerst _ n ) if (! rst_n ) beginready_o_r=1'b0; dout=0; Endelseif(valid_o_rready_I ) begin ready_o_r=1'b1; dout=data_r; endelseif(ready_o_rvalid_I ) ready_o_r=1'b0; end如果该电平ready_o与valid_i同时为high,则valid上升到high,指示已经写入数据,且可以读取下一电平;

有问题的话请指出来!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。