Line | |
---|
1 | // MinMax circuit. Translated into Verilog from the LDS description in |
---|
2 | // "Verification of Sequential Machines Using Boolean Functional Vectors" |
---|
3 | // by Coudert, Berthet, and Madre. |
---|
4 | // |
---|
5 | // Author: Fabio Somenzi <Fabio@Colorado.EDU> |
---|
6 | |
---|
7 | module minMax (clock,clear,enable,reset,in,out); |
---|
8 | parameter MSB = 29; // index of the MSB |
---|
9 | input clock; |
---|
10 | input clear; |
---|
11 | input enable; |
---|
12 | input reset; |
---|
13 | input [MSB:0] in; |
---|
14 | output [MSB:0] out; |
---|
15 | |
---|
16 | reg [MSB:0] min; |
---|
17 | reg [MSB:0] last; |
---|
18 | reg [MSB:0] max; |
---|
19 | |
---|
20 | wire [MSB:0] sup; |
---|
21 | wire [MSB:0] inf; |
---|
22 | wire [MSB:0] avg; |
---|
23 | wire aux; |
---|
24 | |
---|
25 | initial begin |
---|
26 | min = {MSB+1{1'b1}}; // fill min with all ones. |
---|
27 | max = 0; |
---|
28 | last = {MSB+1{1'bx}}; |
---|
29 | end |
---|
30 | |
---|
31 | // Next state logic. |
---|
32 | assign {avg,aux} = {1'b0,sup} + {1'b0,inf}; // average of min and max |
---|
33 | assign sup = (in > max) ? in : max; // unsigned comparison |
---|
34 | assign inf = (in < min) ? in : min; |
---|
35 | |
---|
36 | always @ (posedge clock) begin |
---|
37 | if (clear) begin |
---|
38 | last = 0; max = 0; min = {MSB+1{1'b1}}; |
---|
39 | end else begin |
---|
40 | if (!enable) begin |
---|
41 | max = 0; min = {MSB+1{1'b1}}; |
---|
42 | end else begin |
---|
43 | last = in; |
---|
44 | if (reset) begin |
---|
45 | max = 0; min = {MSB+1{1'b1}}; |
---|
46 | end else begin |
---|
47 | max = sup; min = inf; |
---|
48 | end |
---|
49 | end |
---|
50 | end |
---|
51 | end |
---|
52 | |
---|
53 | // Output logic. |
---|
54 | assign out = clear ? 0 : |
---|
55 | !enable ? last : |
---|
56 | reset ? in : avg; |
---|
57 | |
---|
58 | endmodule // minMax |
---|
Note: See
TracBrowser
for help on using the repository browser.