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