Vhdl virtex 6 FPGA中Dsp片的Preg复位

Vhdl virtex 6 FPGA中Dsp片的Preg复位,vhdl,signal-processing,xilinx-ise,Vhdl,Signal Processing,Xilinx Ise,这里是VHDL代码,我使用了DSP作为MACC单元(乘法累加),使用了语言模板中可用的原语。在每7个时钟周期中,我重置Preg,当我重置Preg时,该周期的倍增输出丢失。如何重置Preg而不丢失任何数据 我附上了输出波形的截图 ---------------------------------代码--------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; library UNISIM;

这里是VHDL代码,我使用了DSP作为MACC单元(乘法累加),使用了语言模板中可用的原语。在每7个时钟周期中,我重置Preg,当我重置Preg时,该周期的倍增输出丢失。如何重置Preg而不丢失任何数据

我附上了输出波形的截图

---------------------------------代码---------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


library UNISIM;
use UNISIM.VComponents.all;

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity dsp12 is
    Port ( clk1 : in  STD_LOGIC;
           a_in1 : in  STD_LOGIC_vector(29 downto 0);
           b_in1 : in  STD_LOGIC_vector(17 downto 0);
           p_out : out  STD_LOGIC_vector(47 downto 0);
              reset_p: inout  std_logic;
              count :inout std_logic_vector(3 downto 0):="0000"
);
end dsp12;

architecture Behavioral of dsp12 is
signal reset: std_logic:='0';

begin
dsp1: DSP48E1

generic map(

-- Feature Control Attributes: Data Path Selection
A_INPUT => "DIRECT", 
B_INPUT => "DIRECT", 
USE_DPORT => FALSE, 
USE_MULT => "MULTIPLY",


AUTORESET_PATDET => "NO_RESET", 
MASK => X"ffffffffffff" , 
PATTERN => X"000000000000", 
SEL_MASK => "MASK", 
SEL_PATTERN => "PATTERN", 
USE_PATTERN_DETECT => "NO_PATDET", 


ACASCREG => 1, 
ADREG => 0,
ALUMODEREG => 1, 
AREG => 1,
BCASCREG => 1,
BREG => 1,
CARRYINREG => 1, 
CARRYINSELREG => 1, 
CREG =>0, 
DREG => 0, 
INMODEREG => 1, 
MREG => 1,
OPMODEREG => 1, 
PREG => 1, 
USE_SIMD => "ONE48" 
)


port map (


ACOUT =>open ,--ACOUT(i) ,
BCOUT =>open,--1,--BCOUT(i) , 
CARRYCASCOUT => open, 
MULTSIGNOUT => open,
PCOUT => open , 


OVERFLOW => open, 
PATTERNBDETECT => open, 
PATTERNDETECT => open, 
UNDERFLOW => open, 

-- Data: 4-bit (each) Data Ports
CARRYOUT => open, 
P => P_out,--P(i) , 

-- Cascade: 30-bit (each) Cascade Ports
ACIN =>"000000000000000000000000000000",
BCIN =>"000000000000000000", 
CARRYCASCIN => '0', 
MULTSIGNIN => '0', 
PCIN => X"000000000000" ,

-- Control: 4-bit (each) Control Inputs/Status Bits
ALUMODE => "0000", 
CARRYINSEL => "000", 
CEINMODE => '0', 
CLK => clk1, 
INMODE => "00000", 
OPMODE => "0100101", 
RSTINMODE => '0', 

-- Data: 30-bit (each) Data Ports
A => A_in1,
B => B_in1,
C => X"000000000000", 
CARRYIN => '0',
D => "0000000000000000000000000", 

-- Reset/Clock Enable: 1-bit (each) Reset/Clock Enable Inputs
CEA1 => '1', 
CEA2 => '1',
CEAD =>'0',
CEALUMODE => '1',
CEB1 => '1', 
CEB2 => '1', 
CEC => '0', 
CECARRYIN => '1',
CECTRL => '1',
CED =>'0' ,
CEM => '1', 
CEP => '1', 
RSTA => Reset, 
RSTALLCARRYIN => Reset, 
RSTALUMODE => Reset, 
RSTB => Reset,
RSTC => Reset,
RSTCTRL => Reset, 
RSTD =>Reset, 
RSTM =>Reset,
RSTP =>Reset_p
);


process(clk1)
begin

if clk1' event and clk1='1' then
count<=count+"0001";


if count(2 downto 0)="111" then
reset_p<='1';
else reset_p<='0';
end if;
end if;
end process;

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
UNISIM图书馆;
使用UNISIM.VComponents.all;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体dsp12是
端口(clk1:标准_逻辑中;
a_in1:in标准逻辑向量(29到0);
b_in1:in标准逻辑向量(17到0);
p_out:out标准逻辑向量(47到0);
复位p:inout标准逻辑;
计数:输入标准逻辑向量(3到0):=“0000”
);
结束dsp12;
dsp12的体系结构是
信号复位:标准逻辑:='0';
开始
dsp1:DSP48E1
通用地图(
--要素控制属性:数据路径选择
A_INPUT=>“DIRECT”,
B_输入=>“直接”,
使用_DPORT=>FALSE,
使用_MULT=>“乘法”,
AUTORESET_PATDET=>“无重置”,
掩码=>X“ffffffffffff”,
模式=>X“000000000000”,
选择屏蔽=>“屏蔽”,
选择模式=>“模式”,
使用_PATTERN_DETECT=>“NO_PATDET”,
ACASCREG=>1,
ADREG=>0,
ALUMODEREG=>1,
AREG=>1,
BCASCREG=>1,
BREG=>1,
CARRYINREG=>1,
CARRYINSELREG=>1,
CREG=>0,
DREG=>0,
INMODEREG=>1,
MREG=>1,
OPMODEREG=>1,
PREG=>1,
使用_SIMD=>“ONE48”
)
港口地图(
ACOUT=>打开,--ACOUT(i),
BCOUT=>打开,--1,--BCOUT(i),
CARRYCASCOUT=>打开,
MULTSIGNOUT=>打开,
PCOUT=>打开,
溢出=>打开,
PATTERNBDETECT=>打开,
PATTERNDETECT=>打开,
底流=>打开,
--数据:4位(每个)数据端口
执行=>打开,
P=>P_out,--P(i),
--级联:30位(每个)级联端口
ACI=>“000000000000000000000000000000000000”,
BCIN=>“000000000000000000000000”,
CarryCasin=>“0”,
MULTSIGNIN=>“0”,
PCIN=>X“000000000000”,
--控制:4位(每个)控制输入/状态位
ALUMODE=>“0000”,
CARRYINSEL=>“000”,
CEINMODE=>“0”,
CLK=>clk1,
INMODE=>“00000”,
OPMODE=>“0100101”,
RSTINMODE=>“0”,
--数据:30位(每个)数据端口
A=>A_in1,
B=>B_in1,
C=>X“000000000000”,
CARRYIN=>“0”,
D=>“0000000000000000000”,
--复位/时钟启用:1位(每个)复位/时钟启用输入
CEA1=>“1”,
CEA2=>“1”,
CEAD=>“0”,
CEALUMODE=>“1”,
CEB1=>“1”,
CEB2=>1,
CEC=>“0”,
CECARRYIN=>“1”,
CECTRL=>“1”,
CED=>“0”,
CEM=>“1”,
CEP=>“1”,
RSTA=>重置,
RSTALLCARRYIN=>重置,
RSTALUMODE=>Reset,
RSTB=>重置,
RSTC=>重置,
RSTCTRL=>重置,
RSTD=>重置,
RSTM=>重置,
RSTP=>Reset\u p
);
过程(clk1)
开始
如果clk1'事件和clk1='1',则

计数让我们把我的评论写进一个答案

根据您的描述,您似乎不想重置寄存器p。相反,您似乎想每8个值累加一次

如果您重置寄存器,您的应用程序将始终获得您看到的效果。相反,您希望动态地将DSP的操作模式更改为:

  • 乘法模式的1个周期
    P_out=A*B(+0)
  • 7个MAC模式循环
    P_out=A*B+P_in
如中所示,您现在使用的OPMODE是
“0100101”
,其中位6-4对您的用途很重要(表2-9)<代码>“010”
表示寄存器P的输出是后加法器的输入。如果要将其设置为
“000”
,则将输入设置为“零”(0)

因此,一个简单的解决方案是修改代码:

OPMODE => "0100101", 
RSTP =>Reset_p
致:

但是你可以把它清理干净


不同的解决方案 与其将DSP实例化为组件,还不如进行RTL描述。合成工具将理解这一点并生成您的MAC。示例:这是VHDL-2008描述。它将合成

library ieee;
use ieee.std_logic_1164.all;

entity Accumulate8 is
    port(
        clk : in std_logic;
        rst : in std_logic;
        A : in std_logic_vector(29 downto 0);
        B : in std_logic_vector(17 downto 0);
        P : out std_logic_vector(47 downto 0)
    );
end entity;

architecture rtl of Accumulate8 is
    signal count : integer range 0 to 7 := 7;
    use ieee.numeric_std.all;
begin
    mac: process(clk)
    begin
        if rising_edge(clk) then
            if count = 0 then
                count <= 7;
                P <= std_logic_vector(unsigned(A)*unsigned(B));
            else
                count <= count - 1;
                P <= std_logic_vector(unsigned(A)*unsigned(B)+unsigned(P));
            end if;
            if rst = '1' then
                count <= 7;
                P <= (others => '0');
            end if;
        end if;
    end process;
end architecture;
ieee库;
使用ieee.std_logic_1164.all;
实体累计8为
港口(
clk:标准逻辑中;
rst:标准逻辑中;
A:在标准逻辑向量中(29到0);
B:标准逻辑向量(17到0);
P:out标准逻辑向量(47到0)
);
终端实体;
Accumerate8的体系结构rtl为
信号计数:从0到7的整数范围:=7;
使用ieee.numeric_std.all;
开始
mac:进程(clk)
开始
如果上升沿(clk),则
如果计数=0,则

计数让我们把我的评论写进一个答案

根据您的描述,您似乎不想重置寄存器p。相反,您似乎想每8个值累加一次

如果您重置寄存器,您的应用程序将始终获得您看到的效果。相反,您希望动态地将DSP的操作模式更改为:

  • 乘法模式的1个周期
    P_out=A*B(+0)
  • 7个MAC模式循环
    P_out=A*B+P_in
如中所示,您现在使用的OPMODE是
“0100101”
,其中位6-4对您的用途很重要(表2-9)<代码>“010”
表示寄存器P的输出是后加法器的输入。如果要将其设置为
“000”
,则将输入设置为“零”(0)

因此,一个简单的解决方案是修改代码:

OPMODE => "0100101", 
RSTP =>Reset_p
致:

但是你可以把它清理干净


不同的解决方案 与其将DSP实例化为组件,还不如进行RTL描述。合成工具将理解这一点并生成您的MAC。示例:这是VHDL-2008描述。它将合成

library ieee;
use ieee.std_logic_1164.all;

entity Accumulate8 is
    port(
        clk : in std_logic;
        rst : in std_logic;
        A : in std_logic_vector(29 downto 0);
        B : in std_logic_vector(17 downto 0);
        P : out std_logic_vector(47 downto 0)
    );
end entity;

architecture rtl of Accumulate8 is
    signal count : integer range 0 to 7 := 7;
    use ieee.numeric_std.all;
begin
    mac: process(clk)
    begin
        if rising_edge(clk) then
            if count = 0 then
                count <= 7;
                P <= std_logic_vector(unsigned(A)*unsigned(B));
            else
                count <= count - 1;
                P <= std_logic_vector(unsigned(A)*unsigned(B)+unsigned(P));
            end if;
            if rst = '1' then
                count <= 7;
                P <= (others => '0');
            end if;
        end if;
    end process;
end architecture;
ieee库;
使用ieee.std_logic_1164.all;
实体累计8为
港口(
clk:标准逻辑中;
rst:标准逻辑中;
A:在标准逻辑向量中(29到0);
B:标准逻辑向量(17到0);
P:out标准逻辑向量(47到0)
);
终端实体;
Accumerate8的体系结构rtl为