首页 > 编程知识 正文

Verilog流水线,流水线时序图

时间:2023-05-06 13:27:42 阅读:120179 作者:1001

另一方面,流水线设计是指系统地划分组合逻辑,在各部分(层次)之间插入寄存器,暂时保存中间数据的方法。 目的是将一个大操作分解为几个小操作,由于每个步骤的小操作时间小,可以提高频率,由于各个小操作并行执行,可以提高数据吞吐量(提高处理速度)。

二、流水线设计中使用流水线一般是在时序严格、电路工作频率高的时候。 典型情况如下:

1 )功能模块之间的流水线通过乒乓缓冲进行数据交换。 虽然代价上增加了内存的数量,但是与得到的较大的性能提高相比可以忽略不计。 2 ) I/O瓶颈。 例如,某个运算需要输入8个数据,而memroy同时只能提供2个数据。 通过适当划分运算步骤,如果将大操作分解为小操作,则一次可能只需要两个数据,由于使用流水线,面积也减少。 3 )片上sram读取操作。 由于sram的读取操作本身是两级流水线,因此使用流水线是很自然的,除非下一个操作取决于读取结果。 4 )组合逻辑过长,例如(a-b ) c的情况下,在加法和乘法之间插入寄存器是安全的。 三、使用流水线的优缺点1 )优点:流水线可以缩短信号在一个时钟周期内必须经过的路径长度,增加数据吞吐量,从而提高时钟频率,但会导致数据延迟。 以下是示例。

例如,在等级2组合逻辑中,假设各等级的延迟为相同的Tpd,

流水线的总延迟为2Tpd,可以在一个时钟周期内完成,但时钟周期限制为2Tpd; 有流水线的情况下,各级放入寄存器(延迟为Tco )后,单级延迟为Tpd Tco,各级消耗一个时钟周期。 管线需要两个时钟周期来获得初始计算结果,且需要被称为初始延迟(2* ) ) Tpd Tco )。 但是,当进行重复操作时,在一个时钟周期内获得最后的计算结果被称为吞吐量延迟(Tpd Tco )。 只要Tco小于Tpd,管线就可以加快速度。 另外,管线并不减少一次操作时间,而是减少整个数据的操作时间,请充分理解。

2 )缺点:功耗增加,面积增加,硬件复杂度增加。 特别是在cpu这样复杂逻辑的管线中,流水越深,需要保持管线和复位管线时,时间损失就越大。 所以使用流水线是有利无害的,必须大家一起考虑。

四.例如,假设实现以下计算公式:

从RGB到Ycbcr的计算公式:

Y=0.183R 0.614G 0.062B 16;

cb=-0.101R - 0.338G 0.439B 128;

cr=0.439R - 0.399G - 0.040B 128;

从输入到输出有3个时钟延迟;

一级流水线计算所有乘法

二级管线计算所有加法,分为正的和负的相加;

三级管线计算最终和,负数时取0;

请注意,这里的程序只是演示如何使用流水线进行代码设计,而不需要考虑RGB到Ycbcr算法的详细信息。

` time scale1ns/1 psmodulergb _ to _ ycbcr (input clk,input [7 : 0] i_r_8b,input [7 : 0] i_g_8b,input output [7 : 0] o_cb_8b,output [7 : 0] o_cr_8b,output o_h_sync,sync/* * * * parameters * * * parameter para_0062_10b=10'd16; parameter para_0101_10b=10'd26; parameter para_0338_10b=10'd86; parameter para_0439_10b=10'd112; parameter para_0399_10b=10'd102; parameter para_0040_10b=10'd10; parameter para_16_18b=18'd4096; parameter para _ 128 _ 18b=18 ' d 32768;/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。 reg[17: 0] mult_r_for_y_18b; reg[17: 0] mult_r_for_cb_18b; reg[17: 0] mult_r_for_cr_18b; reg[17: 0] mult_g_for_y_18b; reg[17: 0] mult_g_for_cb_18b; reg[17: 0] mult_g_for_cr_18b; reg[17: 0]

mult_b_for_y_18b;reg[17: 0] mult_b_for_cb_18b;reg[17: 0] mult_b_for_cr_18b;reg[17: 0] add_y_0_18b;reg[17: 0] add_cb_0_18b;reg[17: 0] add_cr_0_18b;reg[17: 0] add_y_1_18b;reg[17: 0] add_cb_1_18b;reg[17: 0] add_cr_1_18b;reg[17: 0] result_y_18b;reg[17: 0] result_cb_18b;reg[17: 0] result_cr_18b;/**************************************************//******************initial*************************/initialbegin mult_r_for_y_18b <= 18'd0; mult_r_for_cb_18b <= 18'd0; mult_r_for_cr_18b <= 18'd0; mult_g_for_y_18b <= 18'd0; mult_g_for_cb_18b <= 18'd0; mult_g_for_cr_18b <= 18'd0; mult_b_for_y_18b <= 18'd0; mult_g_for_cb_18b <= 18'd0; mult_b_for_cr_18b <= 18'd0; add_y_0_18b <= 18'd0; add_cb_0_18b <= 18'd0; add_cr_0_18b <= 18'd0; add_y_1_18b <= 18'd0; add_cb_1_18b <= 18'd0; add_cr_1_18b <= 18'd0; result_y_18b <= 18'd0; result_cb_18b <= 18'd0; result_cr_18b <= 18'd0;end/********************************************************/ /**************arithmetic********************************///LV1 pipeline : multalways @ (posedge clk)begin mult_r_for_y_18b <= i_r_8b * para_0183_10b; mult_r_for_cb_18b <= i_r_8b * para_0101_10b; mult_r_for_cr_18b <= i_r_8b * para_0439_10b;endalways @ (posedge clk)begin mult_g_for_y_18b <= i_g_8b * para_0614_10b; mult_g_for_cb_18b <= i_g_8b * para_0338_10b; mult_g_for_cr_18b <= i_g_8b * para_0399_10b;endalways @ (posedge clk)begin mult_b_for_y_18b <= i_b_8b * para_0062_10b; mult_b_for_cb_18b <= i_b_8b * para_0439_10b; mult_b_for_cr_18b <= i_b_8b * para_0040_10b;end//LV2 pipeline : addalways @ (posedge clk)begin add_y_0_18b <= mult_r_for_y_18b + mult_g_for_y_18b; add_y_1_18b <= mult_b_for_y_18b + para_16_18b; add_cb_0_18b <= mult_b_for_cb_18b + para_128_18b; add_cb_1_18b <= mult_r_for_cb_18b + mult_g_for_cb_18b; add_cr_0_18b <= mult_r_for_cr_18b + para_128_18b; add_cr_1_18b <= mult_g_for_cr_18b + mult_b_for_cr_18b;end//LV3 pipeline : y + cb + crassign sign_cb = (add_cb_0_18b >= add_cb_1_18b);assign sign_cr = (add_cr_0_18b >= add_cr_1_18b);always @ (posedge clk)begin result_y_18b <= add_y_0_18b + add_y_1_18b; result_cb_18b <= sign_cb ? (add_cb_0_18b - add_cb_1_18b) : 18'd0; result_cr_18b <= sign_cr ? (add_cr_0_18b - add_cr_1_18b) : 18'd0;end/***********************************************************/endmodule

参考:http://www.360doc.com/content/17/1112/10/26654031_703080396.shtml

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