Vhdl 移位寄存器使用了太多的逻辑元件

Vhdl 移位寄存器使用了太多的逻辑元件,vhdl,shift-register,Vhdl,Shift Register,我用VHDL实现了一个移位寄存器。它使用“位”作为参数,以便能够将用户定义的数字向右移动。它按预期工作,但根据Quartus II中的编译报告,它占用了164个逻辑元素。有人能告诉我为什么我的代码如此糟糕,也许能给我一两个提示来优化它吗?:)先谢谢你 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity ssi_data_align is port ( DATA_

我用VHDL实现了一个移位寄存器。它使用“位”作为参数,以便能够将用户定义的数字向右移动。它按预期工作,但根据Quartus II中的编译报告,它占用了164个逻辑元素。有人能告诉我为什么我的代码如此糟糕,也许能给我一两个提示来优化它吗?:)先谢谢你

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity ssi_data_align is

    port
    (
        DATA_IN      : in   std_logic_vector(31 downto 0);
        BITS         : in   std_logic_vector(4 downto 0);
        DATA_OUT     : out std_logic_vector(31 downto 0));

end entity;

architecture Behavioral of ssi_data_align is

begin

DATA_OUT <= std_logic_vector(SHIFT_RIGHT(unsigned(not DATA_IN), natural(32-(to_integer(unsigned(BITS))))));

end Behavioral;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体ssi_数据_对齐为
港口
(
数据输入:标准逻辑向量(31到0);
位:标准逻辑向量(4到0);
数据输出:输出标准逻辑向量(31到0);
终端实体;
ssi_data_align的行为体系结构
开始

事实上你的设计还不错。如果你有一个桶式移位器的典型成本,那么你就在一个定义的领域(有一个桶式移位器的典型成本列表)

如何改进取决于您的应用程序

  • 如果您有足够的时间,您可以在多个时钟周期内进行移位。这将逻辑减少到一个固定大小的1位移位器,并减少计算移位数的开销,这需要更少的逻辑元素(按常量移位相当便宜)
  • 如果移位大小是静态的,则可以将其替换为常规大小

如果你有很多时间,试着总是将数据移位32次。然后简单地使用这些位作为选择器,点击合适的时钟周期。你应该尝试使用时钟逻辑来解决这个问题,因为它会合成更小的数据

也许是这样的

process (clk)
begin
  if rising_edge(clk) then

    SHIFT_DATA <= '0' & DATA_IN(30 downto 0);

    if BITS = count then
      DATA_OUT <= SHIFT_DATA;
      count <= 0;
    else
      count <= count + 1;
    end if;
  end if;
end process;
过程(clk)
开始
如果上升沿(clk),则

SHIFT_DATA带有符合您设计规范的测试台:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity data_align_tb is
end entity;

architecture foo of data_align_tb is

    function image(inp: std_logic_vector) return string is
        variable image_str: string (1 to inp'length);
        alias input_str:  std_logic_vector (1 to inp'length) is inp;
    begin
        for i in input_str'range loop
            image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
        end loop;
        return image_str;
    end;

    signal DATA_IN:     std_logic_vector (31 downto 0) := (others => '0');
    signal BITS:        std_logic_vector (4 downto 0);
    signal DATA_OUT:    std_logic_vector (31 downto 0);
begin

DUT:
    entity work.ssi_data_align 
        port map (
            DATA_IN => DATA_IN,
            BITS => BITS,
            DATA_OUT => DATA_OUT
        );

STIMULUS:
    process
    begin
        for i in 0 to 31 loop
            BITS <= std_logic_vector(
                        TO_UNSIGNED(natural(i),5)
                    );
            wait for 1 ns;           
        end loop;
        wait;
    end process;

MONITOR:
    process (DATA_OUT)
    begin
        report "BITS = " & image(BITS) & "    DATA_OUT = " & image(DATA_OUT);
    end process;

end architecture;
位的反转和数据的预移位

正如Jim Lewis所指出的,不需要将类型转换为
natural
,并且根据Brian缩进,添加了新行字符以增强维护和理解的方便性

它给出了同样的答案:


../../../src/ieee/numeric_std-body.v93:2098:7:@0ms:(断言警告):numeric_std.TO_INTEGER:检测到元值,返回0
ssi_data_align.vhdl:84:13:@1ns:(报告注释):BITS=00000数据_OUT=00000000000000000000
ssi_data_align.vhdl:84:13:@2ns:(报告注释):BITS=00001 data_OUT=00000000000000000000000001
ssi_data_align.vhdl:84:13:@3ns:(报告注释):BITS=00010 data_OUT=00000000000000000011
ssi_data_align.vhdl:84:13:@4ns:(报告注释):BITS=00011 data_OUT=000000000000000000000000111
ssi_data_align.vhdl:84:13:@5ns:(报告注释):BITS=00100 data_OUT=0000000000000000000000 1111
ssi_data_align.vhdl:84:13:@6ns:(报告注释):BITS=00101 data_OUT=00000000000000000000011111
ssi_data_align.vhdl:84:13:@7ns:(报告注释):BITS=00110 data_OUT=00000000000000000000 111111
ssi_data_align.vhdl:84:13:@8ns:(报告注释):BITS=00111 data_OUT=0000000000000000000011111
ssi_data_align.vhdl:84:13:@9ns:(报告注释):BITS=01000 data_OUT=00000000000000000011111
ssi_data_align.vhdl:84:13:@10ns:(报告注释):BITS=01001 data_OUT=000000000000000000011111111
ssi_data_align.vhdl:84:13:@11ns:(报告注释):BITS=01010 data_OUT=0000000000000000000000 1111111
ssi_data_align.vhdl:84:13:@12ns:(报告注释):BITS=01011 data_OUT=000000000000000 11111111
ssi_data_align.vhdl:84:13:@13ns:(报告注释):BITS=01100 data_OUT=00000000000000000000 111111111
ssi_data_align.vhdl:84:13:@14ns:(报告注释):BITS=01101 data_OUT=000000000000000000011111
ssi_data_align.vhdl:84:13:@15ns:(报告注释):BITS=01110 data_OUT=00000000000000000011111111
ssi_data_align.vhdl:84:13:@16ns:(报告注释):BITS=01111 data_OUT=00000000000000000111111
ssi_data_align.vhdl:84:13:@17ns:(报告注释):BITS=10000 data_OUT=0000000000000000 1111111
ssi_data_align.vhdl:84:13:@18ns:(报告注释):BITS=10001 data_OUT=000000000000000 11111111
ssi_data_align.vhdl:84:13:@19ns:(报告注释):BITS=10010 data_OUT=00000000000000 111111111
ssi_data_align.vhdl:84:13:@20ns:(报告注释):BITS=10011 data_OUT=0000000000000 1111111111
ssi_data_align.vhdl:84:13:@21ns:(报告注释):BITS=10100 data_OUT=00000000000011111111
ssi_data_align.vhdl:84:13:@22ns:(报告注释):BITS=10101 data_OUT=00000000000111111111111
ssi_data_align.vhdl:84:13:@23ns:(报告注释):BITS=10110 data_OUT=0000000000 1111111111
ssi_data_align.vhdl:84:13:@24ns:(报告注释):BITS=10111 data_OUT=000000000 11111111
ssi_data_align.vhdl:84:13:@25ns:(报告注释):BITS=11000 data_OUT=00000000 111111111111
ssi_data_align.vhdl:84:13:@26ns:(报告注释):BITS=11001 data_OUT=0000000 1111111111
ssi_data_align.vhdl:84:13:@27ns:(报告注释):BITS=11010 data_OUT=000000 11111111
ssi_data_align.vhdl:84:13:@28ns:(报告注释):BITS=11011 data_OUT=00000111111111111
ssi_data_align.vhdl:84:13:@29ns:(报告注释):BITS=11100 data_OUT=0000111111111111
ssi_data_align.vhdl:84:13:@30ns:(报告注释):BITS=11101 data_OUT=0001111111111111
ssi_data_align.vhdl:84:13:@31ns:(报告注释):BITS=11110 data_OUT=00111111111111
ssi_data_align.vhdl:84:13:@32ns:(报告注释):BITS=11111 data_OUT=011111111111111111

仍然保留(0)中的
数据\u
未使用,但保存该减法操作会产生6位距离


数据的预移位不需要任何逻辑元素。

一行代码中的五次类型转换和转换提示您使用了错误的数据类型。@BrianDrummond减少类型转换并不会减少逻辑元素的数量
architecture foo of ssi_data_align is

begin 

SHIFTER:
    DATA_OUT <= std_logic_vector(
                    SHIFT_RIGHT(
                        unsigned('0' & not DATA_IN(31 downto 1)),
                        to_integer(unsigned(not BITS))
                    )
                );

end architecture;