【问题标题】:why this program goes to infine loop, im trying to do an ring counter为什么这个程序进入无限循环,我正在尝试做一个环形计数器
【发布时间】:2015-05-23 07:15:01
【问题描述】:

 library ieee;
 use ieee.std_logic_1164.all;
 entity ccou is
  port(clk2 : in bit;
    qc: out bit_vector(3 downto 0);
    qnc: out bit_vector(3 downto 0));
  end entity;
 architecture a_ccou of ccou is
  component dfff
   port(d,clk1:in bit;
        qd,qnd:out bit);
  end component;
  signal tqc,tqnc: bit_vector(3 downto 0);
   begin
    g1 : dfff port map(tqnc(3),clk2,tqc(0),tqnc(0));
    g2 : dfff port map(tqc(0),clk2,tqc(1),tqnc(1));
    g3 : dfff port map(tqc(1),clk2,tqc(2),tqnc(2));
    g4 : dfff port map(tqc(2),clk2,tqc(3),tqnc(3));
    qc(3 downto 0) <= tqc(3 downto 0);
    qnc(3 downto 0) <= tqnc(3 downto 0);
 end architecture;

我使用结构建模设计了一个环形计数器,以d触发器为组件。问题是程序进入无限循环。我尝试将 tqnc(3) 替换为“1”或“0”,程序运行有限时间但输出错误。有什么问题,帮我解决一下。

sr 触发器的代码是

library ieee;
use ieee.std_logic_1164.all;
entity srfff is
 port(s,r,clk: in bit;
   q,qn:out bit);
end srfff;
architecture a_srff of srfff is
 component nnand
  port(a,b:in bit;
     c:inout bit);
 end component;
 signal ts,tr : bit;
 signal tq,tqn: bit;
 begin
  g1 : nnand port map(s,clk,ts);
  g2 : nnand port map(r,clk,tr);
  g3 : nnand port map(ts,tqn,tq);
  g4 : nnand port map(tr,tq,tqn);
  q <= tq;
  qn <=tqn;
end a_srff;

【问题讨论】:

  • 为什么你的 DFF 输出 qd、qnd inout 而不是只输出? CCOU 输出也一样...
  • 基本上我从一个带有门级设计的 sr ff 开发了 dff,其中 q 和 qn 用作第一个与非门的输入,因此它们被声明为 inout,我将发布电路构造了一个 sr ff,然后我将 d 的值取反为 r 输入。
  • 你真的不应该使用inout,这意味着合成并不总是支持三态缓冲区(顶层除外)。正确的做法是在你的架构中为端口使用一个信号,并添加分配qd &lt;= qd_i;
  • @Jonathan Drolet,我改变了模式,但模拟再次进入无限循环,输出波形为 1111,但是当我通过 '1' 而不是 cqnd 我得到输出,即 1111。

标签: vhdl counter


【解决方案1】:

这不一定是最终答案。您的问题没有提供足够的信息来确定您的振荡是由两种可能原因中的一种或两种引起的。

我对您最初提供的代码进行了更改:

entity dfff is
    port (
        d,clk1:    in    bit;
        qd,qnd:    inout bit
    );
end entity;

architecture foo of dfff is

begin
    process (clk1)
    begin
        if clk1'event and clk1 = '1' then
            qd  <= d;
            qnd <= not d;
        end if;
    end process;
end architecture;


-- library ieee;
-- use ieee.std_logic_1164.all;
entity ccou is
    port (
        clk2:           in  bit;
        qa,qb,qc:       out bit; -- inout
        cqd:            out bit;     -- inout
        qna,qnb,qnc:    out bit; --inout
        cqnd:           out bit  -- inout bit := '1' -- ); -- inout
    );
end entity;

architecture a_ccou of ccou is
    component dfff
        port (
            d,clk1: in    bit;
            qd,qnd: inout bit
        );
    end component;

--    signal ta: bit;

    signal iqa, iqb, iqc, icqd:  bit;
    signal iqna, iqnb, iqnc, icqnd: bit;
begin
    qa <= iqa;
    qb <= iqb;
    qc <= iqc;
    cqd <= icqd;
    qna <= iqna;
    qnb <= iqnb;
    qnc <= iqnc;
    cqnd <= icqnd;

g1: dfff port map (icqnd, clk2,  iqa,  iqna);
g2: dfff port map (iqa,   clk2,  iqb,  iqnb);
g3: dfff port map (iqb,   clk2,  iqc,  iqnc);
g4: dfff port map (iqc,   clk2, icqd, icqnd);
end architecture;

entity ccou_tb is
end entity;

architecture foo of ccou_tb is
    signal clk2: bit;
    signal qa, qb, qc, cqd, qna, qnb, qnc, cqnd: bit;
begin
CLOCK:
    process
    begin
        wait for 10 ns;
        clk2 <= not clk2;
    end process;

DUT:
    entity work.ccou
        port map (
            clk2 => clk2,
            qa => qa,
            qb => qb,
            qc => qc,
            cqd => cqd,
            qna => qna,
            qnb => qnb,
            qnc =>  qnc,
            cqnd => cqnd
        );

end architecture;

更改提供了ccou 上的模式、添加内部信号、dfff 触发器的行为模型和测试台。

生产出来的:

(可点击)

这几乎告诉我们您的dfff 触发器实体/架构存在问题。请注意行为 dfff 模型使用边缘时钟。

注意您添加的黑板绘图图像匹配

来自 流水线和超标量计算机的微体系结构,Amos R. Omandi 于 1999 年出版。并且代表 D Latch,而不是边缘敏感触发器。

S R 锁存反馈振荡
如果您的dfff 确实基于您的黑板表示,则可以通过不平衡 R S 锁存器上的 Q BAR 到 S 和 Q 到 R 延迟或在 Earle 锁存器中使用 consensus term 来纠正振荡源。

基本上当clk1 在您的dfff 实现中为假时,SR 锁存器可能会振荡,因为反馈输入同时具有事件。

厄尔闩锁:

使用一致术语(中间与门)来抑制 S R 锁存器振荡,在输入高时保持高输出,并代表恰好适合模拟的现实世界解决方案。

在设备物理方面,我们还可以通过微调走线电容或晶体管尺寸来平衡延迟。

这里,SR 锁存器反馈振荡是一个建模缺陷,对于教授实际设计问题很有用。

启用环延迟加反转
不幸的是,当clk1(启用)为真并且环形反馈(g4qnd 输出到g1d 输入)提供反转时,使用“透明”锁存器实现的环形计数器也容易受到振荡的影响。

我们过去称其为显着振荡器,即门控张弛振荡器。

修复环形反馈振荡需要使用边沿敏感触发器或连续触发器之间的非重叠时钟,以防止环形周围的时钟延迟少于 4 个。

参见维基百科Master–slave edge-triggered Dflip-flop

主从触发器由两个连续的 D 锁存器实现,一个在时钟的一个相位(作为使能)上运行,另一个在相反的相位上运行。

这些可能对 S R 锁存器中的不平衡反馈延迟有要求。所示的门级表示提供了这一点,此外还有其他表示可以最大限度地减少门延迟。

现在您可能会认为这是硬件设计问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多