微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么是增加延迟的正确方法? 74HCT151,verilog模型对数据表是否准确?

如何解决什么是增加延迟的正确方法? 74HCT151,verilog模型对数据表是否准确?

向此74hct151模型添加延迟的正确方法是什么-参见下文。 另请参阅我为解决问题所做的努力。

我希望看到一个7400时序的完全准确(尽可能)的Verilog模型,这样我才能理解这些问题并建立自己的模型。 74151之所以有趣,是因为Y和_Y路径的时间不同,而且这也是我自制“ TTL” cpu所需的最新路径。

我正在使用Icarus,因此我需要一个解决方案。我没有其他工具,而且我知道某些工具具有错误/怪癖/缺少功能,因此某些在商用工具上有效但在Icarus上无效的东西是一个问题。

我希望有人给我解决方案,以便我可以学习。

我在下面有一个解决方案,但我认为可能有点裤子。

我想要一个允许出现实际毛刺的设计,但是由于我做延迟的原因,我之前的尝试抑制了短毛刺。我相信这被称为“运输延迟”,而不是“惯性延迟”。

如以下文档中所述,使用传输延迟对于发现故障风险很有用。4.3节 https://www.google.co.uk/url?sa=t&source=web&rct=j&url=http://cs.baylor.edu/~maurer/aida/desauto/chapter4.pdf&ved=2ahUKEwjYtpS06pHsAhUEXRUIHVtJAos4FBAWMAB6BAgAEAE&usg=AOvVaw1CUNhobqxQe-pQIEZiBKm _

在正确的延迟下,由于S和I传播延迟的差异,我期望在某些过渡期间Y / _Y上出现过渡毛刺。

数据表说,这些芯片在过渡期间会出现毛刺,这是我在最佳时机拍摄的结果

These needed delays are taken from datasheet for HCT in ns
 I to  Y = 19
 I to _Y = 19
 S to  Y = 20
 S to _Y = 20
_E to  Y = 16
_E to _Y = 18
transition time Y,_Y = 7

另请参阅https://assets.nexperia.com/documents/data-sheet/74HC_HCT151_Q100.pdf

下面的基本代码没有延迟。

如何正确实施?

有关我的新手解决方案,请参见上面的edaplayground链接

我希望有一种更惯用的方式来获取这些时间。

这是没有延迟的基本逻辑。...


`timescale 1ns/1ns

module hct74151(_E,I,S,Y,_Y);
    output Y,_Y;
    input [2:0] S;
    input [7:0] I;
    input _E;

    wire o =
        (S==0 & I[0]) ||
        (S==1 & I[1]) ||
        (S==2 & I[2]) ||
        (S==3 & I[3]) ||
        (S==4 & I[4]) ||
        (S==5 & I[5]) ||
        (S==6 & I[6]) ||
        (S==7 & I[7]);

    assign Y = _E==0 ? o : 0;
    assign _Y = !Y;

    always @* begin
        $display("%9t %m ",$time,"_E=%1b  I=%8b  S=%1d   Y=%b _Y=%b ",_E,_Y);
    end

endmodule

解决方法

这是我的解决方法,但这是惯用的吗? 在 icarus 上有更好的方法吗?


module hct74151(_E,I,S,Y,_Y);
    parameter LOG=0;
    output Y,_Y;
    input [2:0] S;
    input [7:0] I;
    input _E;

    // setup timing be delaying the signals according to the data PD then combine them at last minute
    logic [7:0] Id;
    logic [2:0] Sd;

    always @*
        Id <= #(19) I;

    always @*
        Sd <= #(20) S;

    // according to nexperia _E->_Y is slower than _E->Y
    logic _Ed,Ed;
    always @*
        _Ed <= #(13) _E;
    always @*
        Ed <= #(18) ! _E;

    // combine
    wire O =
        (Sd==0 & Id[0]) ||
        (Sd==1 & Id[1]) ||
        (Sd==2 & Id[2]) ||
        (Sd==3 & Id[3]) ||
        (Sd==4 & Id[4]) ||
        (Sd==5 & Id[5]) ||
        (Sd==6 & Id[6]) ||
        (Sd==7 & Id[7]);

    assign Y = _Ed==0 ? O : 0;
    assign _Y = Ed==1 ? !O : 1;

    if (LOG) always @*
    begin
        $display("%9t %m ",$time,"_E=%1b  I=%8b  S=%1d   Y=%b _Y=%b (_Ed=%b,Ed=%b)",_E,_Y,_Ed,Ed);
    end

endmodule

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?