Vhdl 乘数使用率太低
Posted
技术标签:
【中文标题】Vhdl 乘数使用率太低【英文标题】:Vhdl Multiplier usage too low 【发布时间】:2014-10-19 18:55:16 【问题描述】:我的设计使用了 Spartan 3E XC35100E 设备。我一共可以使用4个MUX。然而,尽管使用了 3 个 * 符号和一个 FFT 块(也使用 3 个 MUX),但设计摘要指定我只使用 1 个 MUX。即使我在 FFT 块中使用 CLB 逻辑代替 MUX,设计摘要也是相同的。
可以毫无问题地进行实施和模拟。那么,为什么我使用的 MUX 数量这么少呢?任何帮助将不胜感激。
为简洁起见,相关库、端口映射和信号声明被排除在外。
process (clk)
variable fsm : integer range 0 to 3:= 0;
variable i : integer range 0 to 127:= 0;
begin
if rising_edge(clk) then
if fsm = 0 then
tasiyici <= STD_LOGIC_VECTOR(to_signed(sample_1(i)* sample_2(i) , 16));
--sample1 and sample 2 are arrays with constant values
fsm := fsm +1;
elsif fsm = 1 then
wea_select <= '0';
wea_ram<= "1";
ram_write <= '0';
dina <= STD_LOGIC_VECTOR(tasiyici(15 downto 8));
mult_out<= STD_LOGIC_VECTOR(tasiyici(15 downto 8));
fsm := fsm +1;
elsif fsm = 2 then
address_write <= std_logic_vector(unsigned(addra) + 1);
wea_ram<= "0";
i := i+1 ;
if i=128 then
fsm:=3;
ram_write <= '1';
wea_select <= '1';
else
fsm := 0;
end if;
end if;
end if;
end process;
----FFT process---
process(clk)
variable fsm : integer range 0 to 7:= 0;
variable i : integer range 0 to 128;
variable counter : integer range 0 to 2:= 0;
variable j : integer range 0 to 512;
begin
if rising_edge(clk) then
if fsm = 0 then -- ram_write is control
if ram_write = '1' then
wea_fft <= "0";
fsm:= 1;
end if;
elsif fsm = 1 then --process start (pulse)
start <= '1';
fwd_inv_we <= '1';
fsm := fsm +1;
elsif fsm = 2 then
start <= '0';
fwd_inv_we <= '0';
fsm := fsm +1;
elsif fsm =3 then --128 cycle send data from douta to xn_re
if i= 128 then
fsm := fsm +1;
else
xn_re <= douta;
address_read <= std_logic_vector(unsigned(addra) + 1);
i:=i+1;
fsm := 3;
end if;
elsif fsm =4 then --all data sent. process complete
if done = '1' then --wait for done finish 3 clk cycle, then unload
if counter= 2 then
fsm := fsm +1;
else
counter := counter +1;
fsm :=4;
end if;
end if;
elsif fsm =5 then
counter := 0;
unload <= '1';
fsm := fsm +1;
fft_data_ready <= "1";
wea_fft<= "1";
elsif fsm =6 then --wait 512 clk cycle to read all outputs
unload <= '0';
wea_fft<= "0";
if dv = '1' then
fft_output <= std_logic_vector(signed(xk_re(15 downto 4))*signed(xk_re(15 downto 4))
+signed(xk_im(15 downto 4))*signed(xk_im(15 downto 4)));
if j=512 then
fsm:=fsm+1;
else
j:=j+1;
fsm:=6;
end if;
else
fsm:=6;
end if;
end if;
end if;
end process;
【问题讨论】:
MUX 通常是用来描述一个 MUltipleXer 的术语。常数值将在综合过程中被优化掉(例如sample_1(i)
、sample_2(i)
)。未标记的 FFT 过程中存在的其余两个乘法运算符具有操作数(xk_imm
、xk_re
),其声明和赋值均不可见。如果连续提供操作数,则单个乘法器可能就足够了。这不是Minimal, Complete, and Verifiable example。
感谢您的及时回复。我尝试保留所有信号分配和声明以使代码更短。您所说的一切都是有道理的,但是尽管使用了声称使用 3 MUX 的 FFT IP 内核,但仍缺少乘法器。还有其他我没有注意到的问题吗?我会更加努力地调整格式!
这个问题似乎是题外话,因为它是关于解释模拟的 VHDL 规范的结果,以及谁的实现工作。这不是一个编程问题,最好在electronics.stack.exchange 上问。也无法复制,缺少 MVCe。
【参考方案1】:
您的设计似乎已经过优化。
您应该检查综合的 RTL,以检查您的设计是否已按照您想要的方式综合
【讨论】:
以上是关于Vhdl 乘数使用率太低的主要内容,如果未能解决你的问题,请参考以下文章