我有一个32位字。我需要使用VHDL创建一个新的32位字,其中只包含值为1的第一位,其值较低。
示例:
INPUT:01000010 01001011 00000000 00100010
输出:00000000 00000000 00000000 00000010
答案 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数组值。你没有显示类型声明所以它似乎有点工作。输出空间是奇思妙想。