如何在VHDL中将16位数据分成2个8位数据?

时间:2014-04-29 11:28:24

标签: vhdl

如何将16位数据分成2个8位数据?

 signal part : std_logic_vector (16 downto 0);
 signal part_1    : std_logic_vector (8 downto 0);
 signal part_2   : std_logic_vector (8 downto 0);

4 个答案:

答案 0 :(得分:5)

part实际上是17位,因为16 downto 0是17位范围,part_*同样是9位。

如果范围是15 downto 07 downto 0,那么您可以执行拆分:

part_1 <= part( 7 downto 0);
part_2 <= part(15 downto 8);
译文:Martin Fowler / Phil Karlton引用:

  

计算机科学有两个难点:   缓存失效,命名事物和逐个错误。

答案 1 :(得分:2)

为什么您的信号长17位和9位?我认为他们应该是16岁和8岁......

signal part   : std_logic_vector (15 downto 0);
signal part_1 : std_logic_vector (7 downto 0);
signal part_2 : std_logic_vector (7 downto 0);

begin -- architecture begin  

part_1 <= part(15 downto 8);
part_2 <= part(7 downto 0);

非常简单的东西......我很惊讶你没看到VHDL的例子。

答案 2 :(得分:0)

还有聚合目标分配:

library ieee;
use ieee.std_logic_1164.all;

entity foo is
end entity;

architecture fum of foo is
    type fie is array (natural range 0 to 1) of std_logic_vector (7 downto 0);
    signal part:   std_logic_vector (15 downto 0);
    signal part_1: std_logic_vector (7 downto 0);
    signal part_2: std_logic_vector (7 downto 0);
begin
     (part_1, part_2) <= fie'(part(15 downto 8), part(7 downto 0));
end architecture;

对于一举提取记录元素而言,这无疑是更有用的。这里有什么好处,那里没有任何类型fie的命名信号。

右侧聚合的原因是因为元素大小必须在赋值运算符的两边匹配,所以聚合都被视为类型fie

使用记录执行此操作可以提取不同大小的元素。我想到从CPU机器指令格式中提取字段。它允许您使用简单的名称,而不需要元素选择名称的别名。 (没有命名记录)。

当双方的元素大小相同时,您只需使用目标聚合:

library ieee;
use ieee.std_logic_1164.all;

entity fie is
end entity;

architecture fum of fie is
    signal part:   std_logic_vector (2 downto 0);
    signal part_1: std_logic;
    signal part_2: std_logic;
    signal part_3: std_logic;
begin
     (part_1, part_2, part_3) <= part;
end architecture;

这些聚合都使用位置关联。您还可以使用命名关联。记录聚合要求others选项代表至少一个元素,并且所有元素必须具有相同的类型(例如std_logic_vector)。

答案 3 :(得分:0)

为了完整性:您还可以使用使信号分配过时的别名:

    signal part  : std_logic_vector (15 downto 0);
    alias part_1 : std_logic_vector(7 downto 0) is part(15 downto 8);
    alias part_2 : std_logic_vector(7 downto 0) is part(7 downto 0);