Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是适当的方式来增加延迟,例如74HCT151,verilog模型,使其精确到数据表?_Verilog_Delay_System Verilog - Fatal编程技术网

什么是适当的方式来增加延迟,例如74HCT151,verilog模型,使其精确到数据表?

什么是适当的方式来增加延迟,例如74HCT151,verilog模型,使其精确到数据表?,verilog,delay,system-verilog,Verilog,Delay,System Verilog,为74hct151型号添加延迟的正确方法是什么?见下文。 另请参见我在解决方案方面的努力 我希望看到一个7400计时的完全准确(尽可能)的verilog模型,这样我就可以理解这些问题并构建自己的模型。74151很有趣,因为Y和_Y路径有不同的时间,也因为它是我自制的“TTL”cpu所需要的最新路径 我正在使用Icarus,所以我需要一个解决方案。我没有其他工具,而且我知道有些工具有bug/怪癖/缺少功能,所以在商业工具上工作但在Icarus上不工作是一个问题 我希望有人能给我一个解决方案,这样我

为74hct151型号添加延迟的正确方法是什么?见下文。 另请参见我在解决方案方面的努力

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

我正在使用Icarus,所以我需要一个解决方案。我没有其他工具,而且我知道有些工具有bug/怪癖/缺少功能,所以在商业工具上工作但在Icarus上不工作是一个问题

我希望有人能给我一个解决方案,这样我就可以学习了

下面我确实有一个解决方案,但我认为它可能有点不对劲

我想要一个设计,允许通过现实的小故障。但我以前的尝试抑制短期小故障,因为我是如何做延迟。我认为这被称为“传输延迟”,而不是“惯性延迟”

如以下文件所述,使用传输延迟有助于发现故障风险。。第4.3节 _

在正确延迟的情况下,由于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
另见

下面的基本代码没有延迟

如何正确实施

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

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

这是基本逻辑,没有延迟


`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, I, S, Y, _Y);
    end

endmodule

这是我的解决方案,但它是惯用的吗? 有没有更好的方法可以应用于伊卡洛斯


模块hct74151(_E,I,S,Y,_Y);
参数LOG=0;
输出Y,_Y;
输入[2:0]S;
输入[7:0]I;
输入;;
//设置定时是根据数据PD延迟信号,然后在最后一分钟将其合并
逻辑[7:0]Id;
逻辑[2:0]Sd;
总是@*
Id Y
逻辑教育,教育;
总是@*

_Ed你在找
specify
block吗?顺便说一句,我用的是Icarus verilog。我不相信至少用Icarus用specify block可以做到这一点。我希望所有的小故障都能解决,而不是被抑制。但是,左手边的延迟方法看起来像一个低通滤波器,因此输入端上比传播延迟短的波动被抑制。然而,我想要一个像真正的芯片一样工作的模型,最坏的情况是出现大量的小故障。Icarus位不相关-它只是另一个V2K5模拟器。话虽如此,我自己使用
specify
的经验是,不同的模拟器对它的处理方式略有不同,因此我不使用它,我同意您应该手动编写模型代码。请看一个我自己的手动编码,带有惯性延迟的例子,以及其他你应该考虑的东西。你不希望“所有的故障都通过”——这不是真正的硅是如何工作的。真正的设备可能会出故障,也可能不会出故障,这取决于技术和时间,但数据表只是涵盖了它本身:你应该假设出了故障,但如果它没有发生,你不会感到惊讶。但让所有故障通过是最坏的情况吗?如果一个小故障能帮助我在构建之前理解设计的风险,我宁愿让它消失。顺便说一下,这是一个家庭自制的“TTL CPU”(实际上是CMOS)的模拟,所以我认为考虑最坏的情况是有帮助的。HCT或HC将通过的短路电流是多少?它肯定不会是皮秒(笑话),但它是1秒还是2秒还是5秒?我想,少于上升时间可能接近极限,但有什么想法吗?我真的在试图理解如何构建真实的模型。顺便说一句,我对Icarus的评论是基于这样一个事实,即各种工具都有一些怪癖、bug和未实现的特性。不幸的是,我只有免费的伊卡洛斯。顺便说一句,我在伊卡洛斯报道了一些关于计时的问题,他们似乎反应很快,所以这就是问题所在。我正在尝试为我的TTL芯片的测试套件添加计时

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, I, S, Y, _Y, _Ed, Ed);
    end

endmodule