PLA Modeling Tasks
Formal Definition
The PLA system tasks are used to model PLA devices.
Simplified Syntax
$array_type$logic$format (memory_name, input_terms, output_terms) ;
array_type ::= sync | async
logic ::= and | or | nand | nor
format ::= array | plane
memory_name ::= identifier
input_terms ::= {scalar_variable}
output_terms ::= {scalar_variable}
Description
These system tasks are used to model content addressed memories i.e.,
memories that are read at locations that an input address matches a
stored address. The PLA devices can be synchronous or asynchronous
(type is defined by array_type:
sync and async).
All patterns should be loaded into memory using the $readmemb
and $readmemh system tasks
or assigned by procedural assignments.
Both the input_terms and the output_terms
should be concatenations of scalar variables, but all variables from
the output_terms should be
declared as a reg data type.
The input_terms should have
the length equal to the memory word size. The output_terms
should have the length equal to the number of memory words (Example
1).
The input data is taken from the input_terms
and then compared with all patterns from memory. If any pattern from
the memory matches the input data then the corresponding bit of the output_terms
becomes '1'.
The format specifies the
logic type of an array. If an array
is used, then only the bits with '1' value from the pattern are
compared with the input data. If plane
is used, then both '0' and '1' values are significant. The don't care
values can also be specified by 'z' and '?' characters. (Example
3).
The logic identifier
specifies how the input data should be compared with patterns (it
also depends on the logic type of an array). If there is an and
identifier then all bits with '1' value (array type) or all bits with
'0' and '1' value (plane type) from the pattern should match the
corresponding bits from the input data (Example 2). If a or
identifier is used then at least one bit with '1' value (array type)
or at least one bit with '0' or '1' value (plane type) from the
pattern should match the corresponding bit from the input data.
The contents of a memory can be changed during the simulation.
Examples
Example 1
module pla(a0, a1, a2, a3,
a4, a5, a6, a7, b0, b1, b2);
input a0, a1, a2, a3, a4,
a5, a6, a7;
output b0, b1, b2;
reg b0, b1, b2;
reg [7:0] mem[0:2];
initial begin
mem[0] = 8'b11001100;
mem[1] = 8'b00110011;
mem[2] = 8'b00001111;
$async$and$array(mem,
{a0,a1,a2,a3,a4,a5,a6,a7}, {b0,b1,b2});
end
endmodule
The PLA device has an 8-bit input ([7:0]) bus and a 3-bit output
([0:2]) bus declared as reg
(b0, b1, b2). This PLA device is an asynchronous array declared with
logic and.
The simulation results for the PLA device from Example
1 are as follows:
A = {a0, a1, a2, a3, a4, a5, a6, a7}
B = {b0, b1, b2}
mem[0] = 8'b11001100;
mem[1] = 8'b00110011;
mem[2] = 8'b00001111;
A = 11001100 -> B = 100
A = 00110011 -> B = 010
A = 00001111 -> B = 001
A = 10101010 -> B = 000
A = 01010101 -> B = 000
A = 11000000 -> B = 000
A = 00111111 -> B = 011
All '1's from the pattern should match the '1's from the input data
(the input data can also have other '1's)
The simulation results for the PLA device from Example
1 declared with $async$and$plane
are as follows:
A = {a0, a1, a2, a3, a4, a5, a6, a7}
B = {b0, b1, b2}
mem[0] = 8'b11001100;
mem[1] = 8'b00110011;
mem[2] = 8'b00001111;
A = 11001100 -> B = 100
A = 00110011 -> B = 010
A = 00001111 -> B = 001
A = 10101010 -> B = 000
A = 01010101 -> B = 000
A = 11000000 -> B = 000
A = 00111111 -> B = 000
All '0's and '1's from the pattern should match the '0's and '1's
from the input data.
If a PLA is declared with $async$and$plane
then the pattern can be specified as 8'b0011????.
8'b0011???? -> ~a[0] & ~a[1] & a[2] & a[3]
The value of a[4], a[5], a[6], and a[7] bits are not important (the
don't care values specified by '?' character).
Important Notes
|