首页 > 其他分享 >关于多信号量打拍的方法讨论

关于多信号量打拍的方法讨论

时间:2024-04-03 19:00:40浏览次数:19  
标签:讨论 pkt 信号量 WIDTH sig 关于 FF DATA out

在实际工作中,由于时序的原因必须对相关信号打拍(用D触发器实现)以满足设计要求。

通常思路写法,如下示例代码:

always @ (posedge clk or negedge rst_n) begin : FF_PRO
    if(!rst_n) begin
        pkt_vld_ff1 <= 1'b0;
        pkt_vld_ff2 <= 1'b0;
        pkt_sop_ff1 <= 1'b0;
        pkt_sop_ff2 <= 1'b0;
        pkt_eop_ff1 <= 1'b0;
        pkt_eop_ff2 <= 1'b0;
        pkt_data_ff1 <= 8'b0;
        pkt_data_ff2 <= 8'b0;
    end
    else begin
        pkt_vld_ff1 <= pkt_vld;
        pkt_vld_ff2 <= pkt_vld_ff1;
        pkt_sop_ff1 <= pkt_sop;
        pkt_sop_ff2 <= pkt_sop_ff1;
        pkt_eop_ff1 <= pkt_eop;
        pkt_eop_ff2 <= pkt_eop_ff1;
        pkt_data_ff1 <= pkt_data;
        pkt_data_ff2 <= pkt_data_ff1;
    end
end

当打拍数增加或者需要打拍的信号量增加,代码长度明显会增加,并且不易扩展。

虽然以上代码看起来很直观,但是这样么有规律的事情什么不做一个CBB呢?

分析以上代码,pkt_vld、pkt_sop、pkt_eop都是控制信号量,信号量打拍需要复位。pkt_data是数据信号量,信号量打拍不需要复位,这样也节省功耗。

带复位的D触发器级联实现:

module SIG_FF_WITH_RST_CBB #(
    parameter DATA_WIDTH    =   10  ,
    parameter FF_NUM        =   5   // D触发器级数
)
(
    input                               clk     ,
    input                               rst_n   ,
    input           [DATA_WIDTH-1:0]    sig_in  ,
    output  reg     [DATA_WIDTH-1:0]    sig_out
);

reg     [DATA_WIDTH-1:0]    sig_ff  [FF_NUM-2:0]    ;

always @ (posedge clk or negedge rst_n) begin : FF_PRO
    integer i;
    integer j;
    if(!rst_n) begin
        for(i = 0; i < (FF_NUM-1); i = i + 1) begin
            sig_ff[i] <= {DATA_WIDTH{1'b0}};
        end
    end
    else begin
        for(j = 0; j < FF_NUM-1; j = j + 1) begin
            if (j == 0)
                sig_ff[0] <= sig_in;
            else
                sig_ff[j] <= sig_ff[j-1];
        end
    end
end

always @ (posedge clk or negedge rst_n) begin
    if(!rst_n)
        sig_out <= {DATA_WIDTH{1'b0}};
    else
        sig_out <= sig_ff[FF_NUM-2];
end

endmodule

不带复位的D触发器级联实现:

module SIG_FF_CBB #(
    parameter DATA_WIDTH    =   10  ,
    parameter FF_NUM        =   5   // D触发器级数
)
(
    input                               clk     ,
    input           [DATA_WIDTH-1:0]    sig_in  ,
    output  wire    [DATA_WIDTH-1:0]    sig_out
);

reg     [DATA_WIDTH-1:0]    sig_ff  [FF_NUM-1:0]    ;

always @ (posedge clk) begin : FF_PRO
    integer i;
    for(i = 0; i < FF_NUM; i = i + 1) begin
        if (i == 0)
            sig_ff[0] <= sig_in;
        else
            sig_ff[i] <= sig_ff[i-1];
    end
end

assign sig_out = sig_ff[FF_NUM-1];

endmodule

根据信号量的情况选择,控制信号量代码打拍优化如下:

wire    [2:0]   sig_ctrl_in;
wire    [2:0]   sig_ctrl_out;
assgin sig_ctrl_in = {pkt_vld, pkt_sop, pkt_eop};

SIG_FF_WITH_RST_CBB #(
    .DATA_WIDTH     ( 3                 ),
    .FF_NUM         ( 2                 ) 
)
U_CTRL_SIG_FF_WITH_RST_CBB (
    .clk            ( clk               ), // i
    .rst_n          ( rst_n             ), // i
    .sig_in         ( sig_ctrl_in       ), // i
    .sig_out        ( sig_ctrl_out      )  //o
);

always ( * ) begin
    {pkt_vld_ff2, pkt_sop_ff2, pkt_eop_ff2} = sig_ctrl_out;
end

数据信号量代码打拍优化如下:

wire    [7:0]       sig_data_in;
wire    [7:0]       sig_data_out;

assgin sig_data_in = {pkt_data};

SIG_FF_CBB #(
    .DATA_WIDTH     ( 8                 ),
    .FF_NUM         ( 2                 ) 
)
U_DATA_SIG_FF_CBB (
    .clk            ( clk               ), // i
    .sig_in         ( sig_data_in       ), // i
    .sig_out        ( sig_data_out      )  //o
);

always ( * ) begin
    {pkt_data_ff2} = sig_data_out;
end

当信号量增加或者打拍数改变,只需要修改输入、输出信号量和参数,容易扩展。

若有不正确的地方,欢迎大家指正。

标签:讨论,pkt,信号量,WIDTH,sig,关于,FF,DATA,out
From: https://blog.csdn.net/HR20180108/article/details/137296999

相关文章

  • 面试常问问题——关于常用sql查询语句
    1、select--第一种select*from表名称--第二种select列名称from表名称2、select DISTINCT 去重SELECTDISTINCT列名称FROM表名称3、where子句1--第一种2SELECT列名称FROM表名称WHERE列运算符值34--第二种5SELECT*FROM表名称WHER......
  • 关于“LINQ to Entities does not recognize the Method '...' ”问题原因浅析
    LINQtoEntities中,有些断言能对内存实体使用,但是发到数据库端可能因无法解析而抛出异常,需要特别注意。示例如下:[TestMethod]publicvoidDataSourceGetOneTest(){stringhost="localHost";IList<string>IpAddress=En......
  • 关于 ulimit 的两个天坑
    稍微有点Linux经验的人一定会遇到过“Toomanyopenfiles”错误,这个错误本质是ulimit设置不合理导致的。关于ulimit设置,有哪些需要注意的点呢?本文给大家做一个介绍,希望对大家有所帮助。如何确认ulimit设置生效了?很多人设置了ulimit最后发现还是报错“Toomanyope......
  • 关于CSRF跨站请求伪造的理解(只写了一点点,未写完)
    之前做一道题时遇到了这样一句CSRF(Cross—SiteRequestForgery)跨站请求伪造的预防措施:1、使用token2、加验证码3、http请求头设置referer字段有点不太理解什么时候请求头设置了referer字段发现是这种浏览器开发者页面看到的请求头里的ReferrerPolicy。这个的含义,用AI生成......
  • 关于Win11系统 Ixchariot打流出现上行流无法打通的情况
    电脑有线接入,手机无线连接测试设备Wi-Fi,IxChariot链路从电脑IP到手机IP,可以打通。但是反过来无法进行。Win11电脑安装IxChariot(版本为6.70版本)时,安装的IXCHARIOTENDPOINTARCHIVE报错,无法安装:Error1920.SericeIxiaPerformanceEndpoint(IxiaEndpoint)failedtostart. 需......
  • 关于Unity Asset Store搜不到画线插件Vectrosity的问题(附带最新版本下载)
    Vectrosity是一个很好用的画线的插件,可以画出2D,3D,贝塞尔,圆,椭圆等各种线条图案,还可以给线段添加纹理,进行碰撞检查等,如果有多段线段的话,还能够检测到当前点击的是那段线段,我在项目中一直用的它,感觉还是挺稳定挺好用的。最近要开发另一个项目了,也要画线,就想着还用Vectrosity,去Asset......
  • 关于“共享程序员”,你们怎么看?
    前言最近出现了一个很火的词,叫做“共享员工”,眼下正是“金三银四”的春招旺季,记者了解到,今年,不少企业都在实行“共享员工”。“共享程序员”“共享设计师”等能为企业节省人力成本。这些“共享员工”一般不和企业签订固定合同,而是与企业就某一项目进行短期合作。对待“......
  • 信号量
    二值信号量SemaphoreHandle_tsem_handle;sem_handle=xSemaphoreCreateBinary();staticvoidsend_Task(void*pvParameters){while(1){xSemaphoreGive(sem_handle);vTaskDelay(1000);}}staticvoidreceive_Task(void*pvPara......
  • Android12.0 系统关于安兔兔显示信息的修改
    1.前言在12.0的系统rom定制化开发中,在一些产品开发中,对于安兔兔等第三方检测工具,检测不出某些版本的内核信息等,显示0GB等问题的相关修改,由于不知道安兔兔的检测方式,所以就需要来修改关于文本上的一些信息了2.系统关于安兔兔显示信息的修改的核心类frameworks/base/core/jav......
  • 关于Stata工具变量固定效应回归ivreghdfe包报错last estimates not found一步解决问题
            其实lastestimatesnotfound这个问题,不用这么麻烦。我也是研究了半天,最后发现可以根据ivreghdfe命令的作者在github上写的统一安装需要的那些命令来很方便快捷地解决。        这是ivreghdfe命令作者的Github主页:https://github.com/sergiocorreia/......