在较低有效位置VHDL中检测1位值的位置

时间:2015-11-16 18:53:11

标签: vhdl

我有一个32位字。我需要使用VHDL创建一个新的32位字,其中只包含值为1的第一位,其值较低。

示例:

INPUT:01000010 01001011 00000000 00100010
输出:00000000 00000000 00000000 00000010

1 个答案:

答案 0 :(得分:0)

该想法按顺序遍历从最高优先级到最低优先级的输入,并且当遇到'1'时,在输出上产生具有该对应位置a'1'和剩余位置'0'的值。找到第一个这样的比赛后,你就退出了。

我想到了五种方式。使用if语句,条件信号赋值(或-2008中的条件变量赋值),带有出口的循环语句,case语句和选定的信号赋值(或-2008中的选定变量赋值)。

其中一些依赖于VHDL标准修订级别,并且不保证对合成的支持。

最简单的表达过程中显示的for循环:

library ieee;
use ieee.std_logic_1164.all;

entity priority_mapper is
    port (
        input:  in  std_logic_vector (0 to 31);
        output: out std_logic_vector (0 to 31)
    );
end entity;

architecture foe of priority_mapper is

begin
MAPIT:
    process (input)
    begin
        output <= (others => '0');
        for i in input'reverse_range loop 
            if input(i) = '1' then
                output(i) <= '1';
                exit;     
            end if;
        end loop;
    end process;
end architecture;

对于您的样本刺激:

input <= B"01000010_01001011_00000000_00100010";

它产生输出:

  

priority_mapper.vhdl:136:13:@ 10ns :(报告单):output = 00000000 00000000 00000000 00000010

将空格放在testbench输出中要复杂得多:

library ieee;
use ieee.std_logic_1164.all;

entity priority_mapper_tb is
end entity;

architecture tb of priority_mapper_tb is
    signal input:  std_logic_vector (0 to 31) := (others => '0');
    signal output: std_logic_vector (0 to 31) := (others => '0');
begin
DUT:
    entity work.priority_mapper (foe)
        port map (input, output);
STIMULUS:
    input <= B"01000010_01001011_00000000_00100010" after 10 ns;
RESPONSE:
    process (output)
        variable  output_string: string (1 to 35);
        variable j: integer range output_string'range;
    begin
        if now > 0 ns then
            j := 1;
            for i in output'range loop
                if i = 8 or i = 16 or i = 24 then
                    output_string(j) := ' ';
                    j :=  j + 1;
                end if;
                output_string(j) :=         
                            character'VALUE(std_ulogic'IMAGE(output(i)));
                if j < output_string'right then
                    j := j + 1;
                end if;
            end loop;
            report "output = " & output_string;
        end if;
    end process;
end architecture;

接受字符串输入中的空格的代码大致相同,将表示值的字符转换为std_logic数组值。你没有显示类型声明所以它似乎有点工作。输出空间是奇思妙想。