Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[SOLVED] Unknown operator in P.Ashenden book can someone explain

Status
Not open for further replies.

wtr

Full Member level 5
Full Member level 5
Joined
May 1, 2014
Messages
299
Helped
29
Reputation
58
Reaction score
25
Trophy points
1,308
Activity points
4,108
Hello,

Background - After 10 years in the business I was writing my own collaborations of VHDL rules/ best practices etc. I decided to review one of the books on my shelf, "The student Guide to VHDL" by Peter J. Ashenden.

Chapter 7.1 Package Declarations, Figure 7-1 and Figure 7.2


Code VHDL - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package cpu_types is
  constant word_size : positive := 16;
  constant address_size : positive := 24;
  subtype word is bit_vector(word_size-1 downto 0);
  subtype address is bit_vector(address_size-1 downto 0);
  type status_value is (halted, idle, fetch, mem_read, mem_write, io_read, io_write, int_ack);
end package cpu_types;
 
entity address_decoder is
  port(
    addr : in work.cpu_types.address; 
    status : in work.cpu_types.status_value; 
    mem_sel, int_sel, io_sel : out bit);
end entity address_decoder;
 
architecture functional of address_decoder is
    constant mem_low  : work.cpu_types.address := x"000000";
    constant mem_high : work.cpu_types.address := x"EFFFFF";
    constant io_low   : work.cpu_types.address := X"F00000";
    constant io_high  : work.cpu_types.address := x"FFFFFF";
begin
    mem_decoder :
        mem_sel <= '1' when (work.cpu_types."="(status, work.cpu_types.fetch) or
                       when (work.cpu_types."="(status, work.cpu_types.mem_read) or



What is this ."=" opreator? I see no infix function declared that overloads =.

If I was writing this myself using an expanded selected names (because the point of the lesson is why we use..."use") then I would have done

Code VHDL - [expand]
1
when status=work.cpu_types.fetch

 

"=" is the equals function. It is in double quotes because it is one of the VHDL default operators, and "=" is implicity defined for all types in the package the type is decalred in. The fact it has a . infront of it means it is being pull directly from the cpu_types package, and it is being called explitly like a normal function.

There is no actual requirement to do this here, your example would have worked fine, but there are circumstances where it may be needed.

Here is an example I have had. When you include packages, the most local takes precidence. So, consider the following library imports (from VHDL 2008):


Code VHDL - [expand]
1
2
3
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std_unsigned.all;



Std_logic_vector is defined in std_logic_1164 package, and hence an implicit "=" function is defined for std_logic_vector. But numeric_std_unsigned explicitly defines an "=" function to compare two std_logic_vectors numerically. This will override the default implementation because it is implicit. If std_logic_1164 had an explicit "=" function, you would get a clash when you did this:

Code:
if a = b then

and you would get and error explaining that because it doesnt know if you want the std_logic_1164 "=" , or the numeric_std_unsigned "=", you get neither and get an error. But this doesnt happen because the numeric_std_unsigned explicity overrides the implicit one by default.

So my issue arrose when I wanted to compare a std_logic_vector to a meta value:


Code VHDL - [expand]
1
2
3
4
5
6
7
8
9
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std_unsigned.all;
 
....
 
if some_slv = "UUUUUUUU" then
 
  -- this will never occur



Here, because its using the numeric_std_unsigned "=" function, the compare always returns false for meta values. You then need to be explicit about what function to call:


Code VHDL - [expand]
1
2
3
4
5
6
7
8
9
10
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std_unsigned.all;
 
....
 
if ieee.std_logic_1164."="(some_slv, "UUUUUUUU") then
 
-- Or you can do this:
if some_slv ieee.std_logic_1164."="  "UUUUUUUU" then



- - - Updated - - -

There are quite a few things that come for free in the same region when you declare a type:

All types get equality operators "=", "<", ">" etc
All File types get FILE_OPEN, FILE_CLOSE, ENDFILE procedures
Access Types get a DEALLOCATE procedure.
 

    ads-ee

    Points: 2
    Helpful Answer Positive Rating

    wtr

    Points: 2
    Helpful Answer Positive Rating

    dpaul

    Points: 2
    Helpful Answer Positive Rating
Holy smokes,

TrickeyDicky you should write a book.

I hadn't noticed that he was selectively directing a function, in addition to the types. I'm so used to seeing an infix function used as a (func) b, that I completely forgot the written implementation is "func" (a : type, b : type). However what really got me confused was that the package.path."func" didn't have an overloading of the equal sign....or at least one that I could explicitly see. I did not know about all those freebies when you declare a type.
 

Just scanning the 2008 LRM. All scalar types also get MINIMUM, MAXIMUM and to_string functions for free
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top