gpt4 book ai didi

vhdl - 用 VHDL 设计组合移位运算符

转载 作者:行者123 更新时间:2023-12-02 18:08:09 24 4
gpt4 key购买 nike

这是我的问题:我需要从头开始使用组合逻辑设计一个16位左/右逻辑/算术移位组件(除了使用std_logic_vector和std_logic)。

这是我所拥有的:

library ieee;
use ieee.std_logic_1164.all;

entity Shift16 is
port
(
-- Input ports
I : in std_logic_vector(15 downto 0);
Shift : in std_logic_vector(3 downto 0);

-- Sel(1) == 0 -> Logical ; Sel(0) == Left
Sel : in std_logic_vector(1 downto 0);

-- Output ports
O : out std_logic_vector(15 downto 0)
);
end Shift16;

architecture Struct of Shift16 is
component Mux16to1 is
port (I : in std_logic_vector(15 downto 0);
S : in std_logic_vector(3 downto 0);
O : out std_logic);
end component;

component Mux2to1_16 is
port
( A, B : in std_logic_vector(15 downto 0); S : in std_logic;
Q : out std_logic_vector(15 downto 0) );
end component;

signal OLeft, ORight : std_logic_vector(15 downto 0);

signal PadVal : std_logic;

type gen_signal is array (15 downto 0) of std_logic_vector(15 downto 0);

signal leftPad, rightPad : gen_signal;

begin

process (I, Sel)
begin
if (Sel(0) = '0') then -- logical
PadVal <= '0';
else
PadVal <= I(15); -- aritmetic
end if;

for j in 15 downto 0 loop
for k in j downto 0 loop
leftPad(j, k) <= I(15-j);
rightPad(j, k) <= PadVal;
end loop;

for k in 15 downto j+1 loop
leftPad(j, k) <= PadVal;
rightPad(j, k) <= I(15-j);
end loop;
end loop;
end process;



muxarr_left_shift: for index in 15 downto 0 generate
begin
mux: Mux16to1 port map (leftPad(index), Shift, OLeft(index));
end generate;

muxarr_right_shift: for index in 15 downto 0 generate
begin
mux: Mux16to1 port map (rightPad(index), Shift, ORight(index));
end generate;

OutputMux: Mux2to1_16 port map (ORight, OLeft, Sel(1), O);

end Struct;

Mux 组件正是它们看起来的样子,只是我的自定义版本。

我最初的想法是使用 16 个 16 比 1 多路复用器并将它们连接起来,以便每个多路复用器的移位量都可以选择。这会非常快,但由于某种原因代码无法编译。

我想我也把这个问题复杂化了,我不知道我能做些什么来做得更好..

编译错误为:错误 (10382): Shl16.vhd(52) 处的 VHDL 错误:数组类型 gen_signal 的对象索引必须具有 1 维

最佳答案

我认为你应该改变:

    for j in 15 downto 0 loop
for k in j downto 0 loop
leftPad(j, k) <= I(15-j);
rightPad(j, k) <= PadVal;
end loop;

for k in 15 downto j+1 loop
leftPad(j, k) <= PadVal;
rightPad(j, k) <= I(15-j);
end loop;
end loop;

    for j in 15 downto 0 loop
for k in j downto 0 loop
leftPad(j)(k) <= I(15-j);
rightPad(j)(k) <= PadVal;
end loop;

for k in 15 downto j+1 loop
leftPad(j)(k) <= PadVal;
rightPad(j)(k) <= I(15-j);
end loop;
end loop;

因为你的类型声明。

type gen_signal is array (15 downto 0) of std_logic_vector(15 downto 0);

P/s:如果您想保持循环分配,请将类型更改为:

type gen_signal is array (15 downto 0, 15 downto 0) of std_logic;

但我认为它不适合您的端口映射。所以,你应该使用上面的方法。我用 Questasim 10.0b 检查了第一种方法。

P/S(再次):我仔细阅读了你的代码,发现:

process (I, Sel)

敏感列表可能不适合循环,除非您想要闩锁。我认为你应该分成 2 个进程。

关于vhdl - 用 VHDL 设计组合移位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12905874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com