蓄能器设计

时间:2019-09-26 09:52:13

标签: vhdl

谢谢大家,在这里我修改了帖子。我通过为每个任务使用不同的组件,为陷阱过滤器编写了一个简单的代码VHDL。以下是示例代码,其中使用了不同的组件,除累加器组件(acc1)之外,所有其他组件均工作正常,输出信号保持为零。在acc1一个组件中,我试图制造两个累加器,其中第一个acc1(第一个累加器的输出)是acc2的输入。由于其他组件正在工作,因此在这里,我仅在测试台架的代码中显示了acc1组件的端口映射。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.std_logic_unsigned.all;
use ieee.fixed_pkg.all;
ENTITY TRAPFILTER IS 
GENERIC (
K  : integer  :=80;
L  : integer  :=200
 --M  : signed(9 downto 0)  := to_signed(5)
);
PORT 
(
 CLK          : IN    STD_LOGIC;
 RST          : IN    STD_LOGIC; 
 DATAIN       : IN    STD_LOGIC_VECTOR(13 DOWNTO 0);
 DATAOUT      : OUT   STD_LOGIC_VECTOR(24 DOWNTO 0);
 DATAOUT1     : OUT   STD_LOGIC_VECTOR(25 DOWNTO 0); ---
 READY        : OUT   STD_LOGIC;

 Soutout      : out std_logic_vector(23 downto 0);
 Koutout      : out std_logic_vector(13 downto 0);
 Loutout      : out std_logic_vector(13 downto 0)
 ); 
 END ENTITY TRAPFILTER;
 ARCHITECTURE RTL OF TRAPFILTER IS
   constant M          : sfixed(1 downto -2) :=  to_sfixed(0.01,1,-2); 
   type  Sdelay_reg is array(0 to 2) OF signed(21 downto 0);
   signal S_reg        :  Sdelay_reg :=(others=>(others=>'0'));
   -------------------------------------------------------------
   signal y_reg0       : signed (27 downto 0)  :=(others=>'0'); 
   signal y_reg1       : signed (31 downto 0)  :=(others=>'0');        
   -----------------------------------------------------------
    signal in_reg      : signed(13 downto 0)  :=(others=>'0');
    signal out_reg     : signed(DATAOUT'length-1 downto 0)  := 
     (others=>'0');
     -- ----------------------------------------------------------
     signal fs          : std_logic :='0';
    --------------------kdelay component----------------------------------
    component kdelay is 
        GENERIC (
        K  : integer  :=80;
        L  : integer  :=200
        );
         port 
          (
              clk           : in  std_logic ;
              rst           : in  std_logic;
              din           : in  STD_LOGIC_VECTOR (13 downto 0);
              kout          : OUT STD_LOGIC_VECTOR (13 downto 0)

                   );
                end component;
                signal kout   : std_logic_vector (13 downto 0) :=(others=> 
                '0');
                --------------------Ldelay component---------------------- 
                ------------
              component Ldelay is 
               GENERIC (
                    K  : integer  :=80;
                    L  : integer  :=200

                    );
                 port 
                         (
                          clk          : in  std_logic ;
                         rst           : in  std_logic;
                         din           : in  STD_LOGIC_VECTOR (13 downto 
                                           0);
                         Lout          : OUT STD_LOGIC_VECTOR (13 downto 
                                             0)

                      );
                       end component;
                      signal Lout : std_logic_vector (13 downto 0) := 
                      (others=>'0');
                       ---------------------------------------------------
                      component sub_mult is 
                      port(
                            clk           : in  std_logic ;
                            rst           : in  std_logic;
                            din           : in STD_LOGIC_VECTOR (13 downto 
                                             0);
                            Sout          : out STD_LOGIC_VECTOR (23 
                                            downto 0)
                                       );
                              end component;
                               signal Sout    : std_logic_vector (23 
                                              downto 0) :=(others=>'0');     
                               -------------------------------------------
                                component accum1 is 
                                     port(
                                         clk           : in  std_logic ;
                                         rst           : in  std_logic;
                                         din           : in 
                                         STD_LOGIC_VECTOR  (23 downto 0);
                                         Acout          : out 
                                         STD_LOGIC_VECTOR (24 downto 0);
                                         Acout1         : out 
                                         STD_LOGIC_VECTOR (25 downto 0)
                                            );
                                            end component;
                                          signal acc_out1 : std_logic_vector (24 downto 0) :=(others=>'0');
                                         signal acc_out2 : std_logic_vector (25 downto 0) :=(others=>'0');
                                          ----------------------------------------------------------------
                     BEGIN
                       Koutout     <= Kout;
                       Loutout     <= Lout;
                       Soutout     <= Sout;
                       in_reg      <= signed (DATAIN);
                       DATAOUT     <= acc_out1;--std_logic_vector(out_reg);
                      DATAOUT1    <= acc_out2;
                      utacc1:component accum1  
                      port map(
                          clk           => clk,
                          rst           => rst,--: in  std_logic;
                         din           => Sout, --: OUT STD_LOGIC_VECTOR 
              (13 downto 0);
                       Acout         => acc_out1, -- : out STD_LOGIC_VECTOR (24 downto 0)
                      Acout1        => acc_out2
                      );
                     END RTL;
                  ------------------------Accum1 component----------------------------------
  library IEEEieee;`
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.std_logic_unsigned.all;
use ieee.fixed_pkg.all;

   entity accum1 is port(
clk           : in  std_logic ;
rst           : in  std_logic;
din           : in STD_LOGIC_VECTOR  (23 downto 0);
Acout          : out STD_LOGIC_VECTOR (24 downto 0);
Acout1         : out STD_LOGIC_VECTOR (25 downto 0)
 ); 
end entity;
architecture rtl of accum1 is
signal dout        :  signed(24 downto 0) :=(others=>'0');    
signal datain      : signed(23 downto 0) :=(others=>'0');
signal dout2       : signed(25 downto 0)  :=(others=>'0');
begin
datain        <= signed(din);
process(clk,rst,datain)
variable cm     : signed(24 downto 0);
begin
       if(rst='1' ) then
          dout    <= (others=>'0'); 
          dout2    <= (others=>'0');
          cm     := (others=>'0');
        elsif(rising_edge(clk) and clk'event) then    
            cm    := datain + cm;
            dout  <= cm ;
            dout2 <= dout2 + cm ;
        end if;
        end process;
    Acout        <= std_logic_vector(dout);
   Acout1      <= std_logic_vector(dout2) ; 
  end rtl;
  ------------------------test bench only trapfilter comppnent portmapping
              uttrap5:component TRAPFILTER  
              PORT MAP
              (
               CLK        => TestClk, --        : IN    STD_LOGIC;
               RST        => i_rstb, --  : IN    STD_LOGIC; 
               DATAIN     => odata, --odata, -- : IN    STD_LOGIC_VECTOR(13 DOWNTO 0);
              DATAOUT     => trap_out, --: OUT   STD_LOGIC_VECTOR(13 DOWNTO 0); ---
              DATAOUT1    => trap_out1,
              READY       => trap_ready,  --: OUT   STD_LOGIC
              Koutout     => Koutout, --out std_logic_vector(23 downto 0);
              Loutout      => loutout, --: out std_logic_vector(13 downto 0);
              Soutout     => Soutout

           );

enter image description here

1 个答案:

答案 0 :(得分:-1)

您的代码中有几个问题

  1. 您的敏感度列表中不需要datain
  2. 使用rising_edge时,您不需要event
  3. 重新进入过程时,变量cm不会保留其值。改用signal或仅使用dout的值。
  4. 我真的很了解您的dout2逻辑是什么?