属性事件需要vhdl中8位乘法器中的静态信号前缀

时间:2014-02-12 17:37:45

标签: vhdl

我正在实现一个乘法器,其中i乘以A(8位)和B(8位),并将结果存储在S中。输出S所需的位数是16位。 S具有较高的SH部分和较低的部分SL。每次移动时,都执行添加操作 我在控制器部分出现以下错误: - 属性事件需要静态信号前缀  没有宣布。  “**”需要2个参数

我的代码是: -

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity  PIPO is
port (reset: in  std_logic ;
        B:IN STD_LOGIC_VECTOR (7 downto 0 );
        LOAD:in  std_logic ;
        SHIFT:in  std_logic ;
        ADD:in  std_logic ;
        Sum:IN STD_LOGIC_VECTOR (7 downto 0 );
        C_out:in  std_logic ;
        CLK:in  std_logic ;
        result: out  STD_LOGIC_VECTOR (15 downto 0) ;
        LSB:out std_logic ;
        TB:out std_logic_vector (7 downto 0) );
    end ;

architecture rtl OF PIPO is
    signal temp1 : std_logic_vector(15 downto 0);
    ----temp2 -add 
    signal temp2 : std_logic ;
begin
process (CLK, reset)
  begin
    if reset='0' then
        temp1<= (others =>'0');
        temp2<= '0';
     elsif (CLK'event and CLK='1') then
        if LOAD ='1'  then
        temp1(7 downto 0) <= B; 
        temp1(15 downto 8) <= (others => '0');
    end if ;

    if ADD= '1' then
    temp2 <='1';
    end if;
    if SHIFT= '1' then
        if ADD= '1' then
        ------adder result ko add n shift

        temp2<= '0';
        temp1<=C_out & Sum & temp1( 7 downto 1 );

        else 
        ----only shift
        temp1<= '0' &  temp1( 15 downto 1 );
       end if;
    end if;

end if;
  end process;

  LSB <=temp1(0);
  result<=temp1( 15 downto 0 );
  TB <=temp1(15 downto 8);
    end architecture rtl;
-------------------------------------------
-------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

    entity Controller is
Port ( ADD :OUT STD_LOGIC;
            SHIFT:OUT STD_LOGIC;
            LOAD:OUT STD_LOGIC;
            STOP:OUT STD_LOGIC;
            STRT:IN STD_LOGIC;
            LSB:IN STD_LOGIC;
            CLK:IN STD_LOGIC;
            reset:IN STD_LOGIC ); 
    end ;   
architecture rtl OF Contoller is
---RTL level code is inherently synchronous 
signal count : unsigned (2 downto 0);

----differnt states 
type state_typ is ( IDLE, INIT, TEST, ADDs, SHIFTs );
signal state : state_typ;


begin
--controller : process (ADD,SHIFT,LOAD,STOP,STRT,LSB,CLK,reset)
process (state)--(CLK, reset,ADD,SHIFT,LOAD,STOP,STRT,LSB)
  begin
    if reset='0' then
      state <= IDLE;
      count <= "000";
    elsif (CLK'event and CLK='1') then

            case state is
        when IDLE =>
          if STRT = '1' then
         --- if STRT = '1' then
            state <= INIT;
          else
            state <= IDLE;
          end if;
        when INIT =>
          state <= TEST;
        when TEST =>
          if LSB = '0' then
            state <= SHIFTs;
          else
            state <= ADDs;
          end if;
        when ADDs =>
          state <= SHIFTs;

        when SHIFTs =>
          if count = "111" then  
            count <= "000";      
            state <= IDLE;          
          else
            count<= std_logic_vector(unsigned(count) + 1);
            state <= TEST;
          end if;
      end case;
    end if;
  end process ;
  STOP <= '1' when state = IDLE else '0';
  ADD <= '1' when state = ADDs else '0';
  SHIFT <= '1' when state = SHIFTs else '0';
  LOAD <= '1' when state = INIT else '0';
end architecture rtl;




----------------------------------------------
--------------------------------------------


---multiplicand
library ieee;
use ieee.std_logic_1164.all;    
entity multiplicand is 
port (A : in std_logic(7 downto 0);
        reset :in std_logic;
        LOAD : in std_logic;
        TA : OUT STD_LOGIC(7 downto 0);
        CLK : in std_logic );
    end entity;     
architecture rtl OF multiplicand is
begin 
process (CLK, reset)
  begin
    if reset='0' then
      TA <= (others =>'0');  -- initialize 

    elsif (CLK'event and CLK='1') then
      if LOAD_cmd = '1' then
     TA(7 downto 0) <= A_in;  -- load B_in into register
      end if;
end if ;

end process;
end architecture rtl;   



------------------------------------------------------
------------------------------------------------------
---Full Adder
library ieee;
use ieee.std_logic_1164.all;
entity  Full_Adder  is
port (A     : in  std_logic;
      B     : in  std_logic;
      C_in  : in  std_logic;
      Sum   : out std_logic ;
      C_out : out std_logic);
end;
architecture  struc  of  Full_Adder  is
begin
Sum <= A xor B xor C_in;
C_out <= (A and B) or (A and C_in) or (B and C_in);
end struc;
------------------------------------------------------------
-------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Adder is
    Port ( TA : in  STD_LOGIC_VECTOR (7 downto 0);
           TB : in  STD_LOGIC_VECTOR (7 downto 0);
           Sum : out  STD_LOGIC_VECTOR (7 downto 0);
           C_in : in STD_LOGIC;
              C_out : out  STD_LOGIC);
end Adder;


architecture struc of Adder is
component Full_Adder is  
      port(A     : in  std_logic;
            B     : in  std_logic;
            C_in  : in  std_logic;
            Sum   : out std_logic ;
            C_out : out std_logic);
   end component;

    signal C: std_logic_vector (7 downto 0); 

begin
    FA0:Full_Adder port map(TA(0), TB(0), C_in,   Sum(0), C(0));
    FA1: Full_Adder port map(TA(1), TB(1), C(0),  Sum(1), C(1));
   FA3: Full_Adder port map(TA(2),TB(2), C(1),  Sum(2), C(2));
    FA4: Full_Adder port map(TA(3), TB(3), C(2),   Sum(3), C(3));
    FA5: Full_Adder port map(TA(4), TB(4), C(3),  Sum(4), C(4));
    FA6: Full_Adder port map(TA(5), TB(5), C(4),   Sum(5), C(5));
    FA7: Full_Adder port map(TA(6), TB(6), C(5),   Sum(6), C(6));
    FA8: Full_Adder port map(TA(7), TB(7), C(6),   Sum(7), C(7));

    C_out <= C(7);

end struc;
------------------------------------------------------------
------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity multiplier is
    Port ( num1 : in  STD_LOGIC_VECTOR (7 downto 0);
           num2 : in  STD_LOGIC_VECTOR (7 downto 0);
           result : out  STD_LOGIC_VECTOR (15 downto 0); 
              CLK:in  std_logic ;
              reset:IN STD_LOGIC;
              STRT:IN STD_LOGIC;
              STOP:OUT STD_LOGIC );

end multiplier;

architecture rtl of Multiplier is
    signal ADD :STD_LOGIC;
    signal SHIFT :STD_LOGIC;
    signal LOAD :STD_LOGIC;
    signal LSB :STD_LOGIC;
    signal A : STD_LOGIC_VECTOR (7 downto 0);
    signal B :STD_LOGIC_VECTOR (7 downto 0);
    signal Sum:STD_LOGIC_VECTOR (7 downto 0);
    signal C_out:STD_LOGIC;

component Controller
      port (
            ADD :OUT STD_LOGIC;
            SHIFT:OUT STD_LOGIC;
            LOAD:OUT STD_LOGIC;
            STOP:OUT STD_LOGIC;
            STRT:IN STD_LOGIC;
            LSB:IN STD_LOGIC;
            CLK:IN STD_LOGIC;
            reset:IN STD_LOGIC );

         end component;     
component Adder 
        port ( 
                TA : in  STD_LOGIC_VECTOR (7 downto 0);
           TB : in  STD_LOGIC_VECTOR (7 downto 0);
           Sum : out  STD_LOGIC_VECTOR (7 downto 0);
           C_in : in STD_LOGIC;
              C_out : out  STD_LOGIC);

         end component;
component PIPO
    port (reset: in  std_logic ;
        B:IN STD_LOGIC_VECTOR (7 downto 0 );
        LOAD:in  std_logic ;
        SHIFT:in  std_logic ;
        ADD:in  std_logic ;
        Sum:IN STD_LOGIC_VECTOR (7 downto 0 );
        C_out:in  std_logic ;
        CLK:in  std_logic ;
        result: out  STD_LOGIC_VECTOR (15 downto 0) ;
        LSB:out std_logic ;
        TB:out std_logic );

end component;
    component multiplicand 
    port (A : in std_logic (7 downto 0);
        reset :in std_logic;
        LOAD : in std_logic;
        TA : OUT STD_LOGIC(7 downto 0);
        CLK : in std_logic );
end component ;
begin

inst_Controller: Controller
port map (ADD => ADD,
            SHIFT =>SHIFT,
            LOAD =>LOAD ,
            STOP =>STOP,
            STRT =>STRT,
            LSB =>LSB ,
            CLK =>CLK ,
            reset =>reset
            );
inst_multiplicand :multiplicand     
port map (A =>A,
        reset=>reset,
        LOAD =>LOAD,
        TA => TA(7 downto 0),
        CLK => CLK
            );      


inst_PIPO :PIPO
port map ( reset => reset,
        B => B ,
        LOAD =>LOAD,
        SHIFT=>SHIFT,
        ADD=>ADD,
        Sum=>Sum,
        C_out=>C_out,
        CLK=>CLK,
        result=>result,
        LSB=>LSB,
        TB=>TB
            );

inst_Full_Adder : Full_Adder
        port map ( TA => TA,
           TB =>TB,
           Sum=>Sum ,
           C_in=>C_in,
              C_out=>C_out 
              );


end rtl;

3 个答案:

答案 0 :(得分:1)

实际上CLK与撇号/嘀嗒之间的空间并不重要

david_koontz@Macbook: token_test
elsif (CLK 'event and CLK ='1') then
KEYWD_ELSIF             (151)   elsif
DELIM_LEFT_PAREN        (  9)   (
IDENTIFIER_TOKEN        (128)   CLK
DELIM_APOSTROPHE        (  8)   '
IDENTIFIER_TOKEN        (128)   event
KEYWD_AND               (134)   and
IDENTIFIER_TOKEN        (128)   CLK
DELIM_EQUAL             ( 25)   =
CHAR_LIT_TOKEN          (  2)   '1'
DELIM_RIGHT_PAREN       ( 10)   )
KEYWD_THEN              (211)   then

给出了相同的答案:

david_koontz@Macbook: token_test
elsif (CLK'event and CLK ='1') then
KEYWD_ELSIF             (151)   elsif
DELIM_LEFT_PAREN        (  9)   (
IDENTIFIER_TOKEN        (128)   CLK
DELIM_APOSTROPHE        (  8)   '
IDENTIFIER_TOKEN        (128)   event
KEYWD_AND               (134)   and
IDENTIFIER_TOKEN        (128)   CLK
DELIM_EQUAL             ( 25)   =
CHAR_LIT_TOKEN          (  2)   '1'
DELIM_RIGHT_PAREN       ( 10)   )
KEYWD_THEN              (211)   then

在vhdl中,没有词法元素解析需要缺少空格。 (对不起拉塞尔)。

纠正代码的其他语法歧义(参见下文,缺少上下文子句,在架构声明中拼写错误,count同时用作标量和数组子类型),导致两个不同的VHDL分析器吞噬空间在CLK和'就好了。

之间

问题在于您使用的工具实际上并不符合标准,或者您提出的具有问题的代码实际上并不代表生成错误的代码。如果一个不合规的工具,它可能是你可以忍受的缺点,虽然可能有更多的东西更令人讨厌。

  

david_koontz @ Macbook:ghdl -a controller.vhdl
  david_koontz @ Macbook:nvc -a controller.vhdl
  david_koontz @的MacBook:

(没有错误,它也没有在ghdl的测试平台上详细阐述,nvc不允许顶级端口 - 允许按标准执行)

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

entity Controller is
    Port ( 
        ADD:    OUT STD_LOGIC;
        SHIFT:  OUT STD_LOGIC;
        LOAD:   OUT STD_LOGIC;
        STOP:   OUT STD_LOGIC;
        STRT:   IN  STD_LOGIC;
        LSB:    IN  STD_LOGIC;
        CLK:    IN  STD_LOGIC;
        reset:  IN  STD_LOGIC 
    ); 
end entity;   

architecture rtl OF Controller is
    ---RTL level code is inherently synchronous 
    signal count : std_logic_vector (2 downto 0);

    ----differnt states 
    type state_typ is ( IDLE, INIT, TEST, ADDs, SHIFTs );
    signal state : state_typ;

begin
NOLABEL:
    process (CLK, reset)
    begin
        if reset='0' then
          state <= IDLE;
          count <= "000";
        elsif (CLK 'event and CLK ='1') then

                case state is
            when IDLE =>
              if STRT = '1' then
                state <= INIT;
              else
                state <= IDLE;
              end if;
            when INIT =>
              state <= TEST;
            when TEST =>
              if LSB = '0' then
                state <= SHIFTs;
              else
                state <= ADDs;
              end if;
            when ADDs =>
              state <= SHIFTs;

            when SHIFTs =>
              if count = "111" then  -- verify if finished
                count <= "000";      -- re-initialize counter
                state <= IDLE;            -- ready for next multiply
              else
                count <=             -- increment counter
                    std_logic_vector(unsigned(count) + 1); 
                state <= TEST;
              end if;
          end case;
        end if;
    end process;
  ---end generate; ???

    STOP <= '1' when state = IDLE else '0';
    ADD <= '1' when state = ADDs else '0';
    SHIFT <= '1' when state = SHIFTs else '0';
    LOAD <= '1' when state = INIT else '0';
end architecture rtl;

错误消息似乎源于信号CLK(事件属性的前缀)。在提出问题的代码中没有其他使用事件属性的方法。信号是entity_class的元素之一,可以使用属性进行修饰。

在VHDL LRM中,关于预定义属性'EVENT的部分只能装饰信号,而CLK是一个信号(在端口中声明)。在该部分中,前缀需要用静态信号名称表示。

CLK是静态信号名吗?是的。它是在实体声明中声明的标量子类型,并且是局部静态的(在分析时可用 - 它是标量,简单名称,不涉及泛型)。

现在你可能会明白为什么有人会怀疑问题中的代码是否代表产生错误的代码,或者使用的VHDL工具是否合规。

您报告的错误消息通常与尝试使用带有索引信号名称的'EVENT相关联,例如w(i)'event。 (见Signal attributes on a signal vector)。

答案 1 :(得分:0)

你要为这一个踢自己:

elsif (CLK 'event and CLK ='1') then

应该是:

elsif (CLK'event and CLK ='1') then

看到区别?

更好:

elsif rising_edge(CLK) then

答案 2 :(得分:0)

您似乎在过程中错过了一个clk条目

更改行读数:

process (clk, reset)

阅读:

c = (a**2)+(b**2)-(2*a*b*(math.cos(math.radians(C))))
print(math.sqrt(c))
#5.29866662196