【问题标题】:VHDL incrementer "add one"VHDL 增量器“加一”
【发布时间】:2015-10-17 08:02:12
【问题描述】:

我不会如何写这个问题的真值表所以我不能做这个问题,谁能帮我理解这个问题让我们做什么?非常感谢。

增量器是一种组合电路,可将输入无符号整数 (X) 加 1。输出无符号整数 (Y) 的位数与输入相同。没有输出进位,输入字符串全是 1 递增到全 0。

a) 使用输入 A0 、 B0 和 C0 编写全加器方程。 (又名辛)

b) 用 A0 = X0 , B0 = ‘0’ 和 C0 = ‘1 替换,然后化简。

c) 用输入 Ai、Bi 和 Ci 编写全加器方程。

d) 代入 Ai = Xi 和 Bi = ‘0’,然后化简。

e) 考虑一个 6 位纹波加法器,它的 A = X、B = 0 和 Cin = ‘1’。显然,这将是一个增量器。使用您在 (b) 和 (d) 中得出的简化电路画出 6 位增量器的结构图。 (标记所有实例和信号。)

VHDL 可用于模拟各个门的时间延迟。有关信号分配的 BNF 语法,请参阅您的讲义。延迟格式由模拟器使用,但被合成器忽略。使用以下语句对 2 输入门和反相器进行编码。

使用具有 4 ns 延迟的语句对 2 输入与门进行编码,Y

使用具有 4 ns 延迟的语句对 2 输入 XOR 门进行编码,Y

使用具有 1 ns 延迟的语句的代码反相器,Y 创建一个名为 PLA03 的新目录,然后启动一个名为 PLA03 的新 ModelSim 项目。始终将实体/架构放在自己的源文件中,并使用实体名称作为文件名。

f) 为 (b) 中的简化电路编写实体/架构。将实体命名为 IncStage0

g) 为 (d) 中的简化电路编写实体/架构。将实体命名为 IncStageI

h) 在 (e) 中为您的 6 位增量器编写一个名为 Inc6 的实体和一个结构体系结构。请记住将输入和输出声明为无符号。

library ieee;
use ieee.std_logic_1164.all;  
Use ieee.numeric_std.all;
Entity IncStage0 is
  port(
       X:in unsigned;
        S: out unsigned;
        Cout: out unsigned);
End Entity IncStage0;
Architecture behaviour of IncStage0 is
Begin
  S <= not X after 4 ns;
  Cout <= X;
End Architecture behaviour;

library ieee;
use ieee.std_logic_1164.all;  
Use ieee.numeric_std.all;
Entity IncStageI is
  port(
      X:in unsigned;
      Cin: in unsigned;
      S: out unsigned;
      Cout:out unsigned);
End Entity IncStageI;
Architecture stageI of IncStageI is
Begin
  S <= X xor Cin after 4 ns;
  Cout <= X and Cin after 4 ns;
End Architecture stageI;

library ieee;
use ieee.std_logic_1164.all;  
Use ieee.numeric_std.all;
Entity Inc6 is
  port( 
        X:in unsigned (5 downto 0);
        Y:out unsigned (5 downto 0));
End Entity Inc6;
Architecture behaviour of Inc6 is
  signal C:unsigned (5 downto 0);
  Component IncStage0
     port(
       X:in unsigned;
        S: out unsigned;
        Cout: out unsigned);
  End Component ;
 Component IncStageI
     port(
      X:in unsigned;
      Cin: in unsigned;
      S: out unsigned;
      Cout:out unsigned);
  End Component;
Begin
  I0: IncStage0
    port map(X=>X, S=>Y, Cout=>C);
  I1: IncStageI
    port map(X=>X, S=>Y, Cout=>C,Cin=>C);
  I2: IncStageI
    port map(X=>X, S=>Y, Cout=>C,Cin=>C);
  I3: IncStageI
    port map(X=>X, S=>Y, Cout=>C,Cin=>C);
  I4: IncStageI
    port map(X=>X, S=>Y, Cout=>C,Cin=>C);
  I5: IncStageI
    port map(X=>X, S=>Y, Cout=>C,Cin=>C);
End Architecture behaviour;

Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Entity TBInc6 is
End Entity TBInc6;
Architecture rtl of TBInc6 is
  signal tbX,tbY: unsigned(5 downto 0);
Begin
DUT: Entity work.Inc6 port map(X => tbX, Y => tbY);
Main: Process
  Begin
    for i in 0 to 63 loop
      tbX <= to_unsigned(i,6);
      wait for 30 ns;
    end loop;
    Wait;
  End Process Main;
End Architecture rtl;

【问题讨论】:

  • 10/10 作业复制粘贴。 (话又说回来,我也在这样做是啊。)
  • 是的!那么你知道如何完成这项任务了吗?
  • 是的,与 Lior 我的兄弟兄弟团队合作
  • 但是我们的老师让我们将输入和输出声明为无符号
  • Unsigned 告诉工具 - 以及任何阅读代码的人 - 将一组位解释为无符号数,而不是有符号数或其他任何内容。 std_logic_vector 让您猜测并使算术更容易出现愚蠢的错误。我更喜欢为不总是数字但可能是指令、字符等的单词保留 std_logic_vector。

标签: vhdl


【解决方案1】:

在修正了 incStage0 中 NOT 的延迟(应该是 1 ns,而不是 4 ns),并将类型 unsigned 的无约束子类型指示更改为类型 std_logic(incStage0、incStageI 及其组件声明)后,如以及恢复您在问题第 5 次编辑中删除的 I0 到 I5 的索引,然后您得到:

与讲师提供的波形相比,这看起来是正确的。

请注意,很难击中移动的目标,每次您更改问题时,答案都会发生变化。一个很好的迹象表明您应该提出单独的问题。

您可以修改 inc6 以将信号 C 声明为:

architecture behaviour of Inc6 is
  signal C:unsigned (4 downto 0);
  component IncStage0
     port(
       X:in std_logic;
        S: out std_logic;
        Cout: out std_logic);
  end component ;

并更改 I5 实例化:

  I5: IncStageI
    port map(X=>X(5), S=>Y(5), Cout=> open, Cin=>C(4));

因为您在接口列表中使用名称关联,您可以简单地:

  I5: IncStageI
    port map(X=>X(5), S=>Y(5),Cin=>C(4));

不要提及执行。

附录

这是否意味着我应该将每个无符号类型更改为 std_logic 或 std_logic_vector?但是如果我尝试将所有内容都更改为 std_logic,它 说在部分 h 代码中的 to_unsigned 没有可行的条目,如何 解决这个问题?

没有。 unsigned 是一个数组类型。从包 numeric_std (-2008):

 type UNRESOLVED_UNSIGNED is array (NATURAL range <>) of STD_ULOGIC;

 subtype UNSIGNED is (resolved) UNRESOLVED_UNSIGNED;  

-1987,-1993,-2002:

  type UNSIGNED is array (NATURAL range <>) of STD_LOGIC;

在 std_logic_1164 (-2008) 包中:

  subtype STD_LOGIC is resolved STD_ULOGIC;

-1987,-1993,-2002:

 SUBTYPE std_logic IS resolved std_ulogic;

在 VHDL 标准的所有修订版中,std_logic 的基本类型是 std_ulogic,它也是数组类型 unsigned 的元素类型的基本类型。

这意味着您可以将无符号(表示位)的元素连接到 std_logic 信号,包括端口。两者的元素基类型都是 std_ulogic ,它是位的多值表示,提供弱和强逻辑电平强制和表示位值的元值:

TYPE std_ulogic IS ( 'U',  -- Uninitialized
                     'X',  -- Forcing  Unknown
                     '0',  -- Forcing  0
                     '1',  -- Forcing  1
                     'Z',  -- High Impedance
                     'W',  -- Weak     Unknown
                     'L',  -- Weak     0
                     'H',  -- Weak     1
                     '-'   -- Don't care
                   );

(另见 IEEE Std 1076-2008, 16.8.2.2 STD_LOGIC_1164 值 - “STD_ULOGIC 类型的逻辑值 '1'、'H'、'0' 和 'L' 被解释为表示两个逻辑之一电平,其中每个逻辑电平代表要合成的电路中两个不同的电压范围之一。”,两个逻辑值之一,位)。

正如您无疑发现的那样,您无法将数组类型连接到标量类型。 incStage0 (I0) 和 inStageI (I1, I2, I3, I4 and I5) 代表bits

h) 在 (e) 中为您的 6 位增量器编写一个名为 Inc6 的实体和一个结构体系结构。请记住将输入和输出声明为无符号。

在代码 sn-ps 中显示了对 I5 上的实际使用 open 的情况,C 的声明显示为无符号,而 I5 使用索引名称(数组对象上的元素)显示。除了将inc6的位片元素声明为std_logic:

entity IncStage0 is
  port(
       X:in std_logic;
        S: out std_logic;
        Cout: out std_logic);

Entity IncStageI is
  port(
      X:in std_logic;
      Cin: in std_logic;
      S: out std_logic;
      Cout:out std_logic);

  component IncStage0
     port(
       X:in std_logic;
        S: out std_logic;
        Cout: out std_logic);
  end component ;
 component IncStageI
     port(
      X:in std_logic;
      Cin: in std_logic;
      S: out std_logic;
      Cout:out std_logic);
  end component;

您想要 inc6 中的无符号数组值:

entity Inc6 is
  port( 
        X:in unsigned (5 downto 0);
        Y:out unsigned (5 downto 0));

architecture behaviour of Inc6 is
  signal C: unsigned (4 downto 0);

并将索引数组元素作为连接到标量形式的实际值:

begin
  I0: IncStage0
    port map(X=>X(0), S=>Y(0), Cout=>C(0));
  I1: IncStageI
    port map(X=>X(1), S=>Y(1), Cout=>C(1),Cin=>C(0));
  I2: IncStageI
    port map(X=>X(2), S=>Y(2), Cout=>C(2),Cin=>C(1));
  I3: IncStageI
    port map(X=>X(3), S=>Y(3), Cout=>C(3),Cin=>C(2));
  I4: IncStageI
    port map(X=>X(4), S=>Y(4), Cout=>C(4),Cin=>C(3));
  I5: IncStageI
    port map(X=>X(5), S=>Y(5), Cout=> open,Cin=>C(4));

这使 TBinc6 与您最初使用 unsigned 和 to_unsigned 显示时一样,没有错误。

不要忘记更改incStage0中延迟的时间规范:

architecture behaviour of IncStage0 is
begin
  S <= not X after 1 ns;

之后,您可以生成与练习讲义显示相同的波形。

在遇到数组类型和标量类型及其值之间的差异之前,您已经获得了超过 99% 的答案。给你 sn-ps 的迂回说法让参加课程的学生声称他们的工作是他们自己的。学习和理解,而不是简单地复制。

【讨论】:

  • 你能帮我修复一下 h 部分吗?
  • 你模拟过 IncStage0 和 IncStageI 吗?把你的错误信息放在你的问题中。
  • 我已经修复了错误,但是我觉得代码可能是错误的,因为我运行模拟它并没有给我同样的老师给我们。你能告诉我我的代码有什么问题吗?
  • 这是否意味着我应该将每个 unsigned 类型更改为 std_logic 或 std_logic_vector?但是如果我尝试将所有内容更改为 std_logic,它表示在部分 h 代码中没有可行的 to_unsigned 条目,如何解决这个问题?
【解决方案2】:

问题似乎在于,虽然您可以使用通用加法器(A + B + carry) 来执行增量,但如果您只需要(A + 1)(A + carry),则可以进行某些简化。

似乎假设您已经学习过基本的数字逻辑、门、半加器和全加器。如果没有,很容易找到此信息。

因此,首先为每个位绘制“全加器”电路。在步骤 (e) 中,显示当您将 6 位加法器从 (A + B + carry) 简化到 (A + carry) 时(在门级)的简化是什么。

剩下的步骤将让您了解简化的电路实际上是否更快。使用这些工具做一些非常基本的事情看起来是一个很好的练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多