OpenCores
URL https://opencores.org/ocsvn/vtach/vtach/trunk

Subversion Repositories vtach

[/] [vtach/] [trunk/] [display.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 wd5gnr
`timescale 1ns / 1ps
2
// Drive the 7 segment displays
3
// Note that it displays 3 digits + sign
4
// It is capable of displaying hex
5
// Even though anything >9 in a 4 bit nybble
6
// would be an error
7
module DisplayHex (
8
 
9
 
10
        // Global system resources:
11
        input clk,      // System clock 
12
        input rst,      // Master reset (active high)
13
 
14
        // Inputs:
15
        input [12:0] inval,
16
 
17
        // Outputs:
18
        output reg oSegmentA,   // LED segment a (active low)
19
        output reg oSegmentB,   // etc.
20
        output reg oSegmentC,
21
        output reg oSegmentD,
22
        output reg oSegmentE,
23
        output reg oSegmentF,
24
        output reg oSegmentG,
25
        output reg oDigitRight, // Rightmost digit enable (active high)
26
        output reg oDigitMiddleRight,   // etc.
27
        output reg oDigitMiddleLeft,
28
        output reg oDigitLeft
29
);
30
 
31
// User-adjustable constants
32
parameter clkfreq = 16; // Clock frequency in MHz
33
parameter dispfreq = 100;       // Display refresh rate (for entire display) in Hz
34
 
35
// Upper limit for frequency divider counter
36
parameter uplimit = (clkfreq * 1000000) / (4 * dispfreq);
37
//parameter pUpperLimit = 2; // for simulation only
38
 
39
// Number of bits for frequency divider counter 
40
parameter ctrbits = 24;
41
 
42
 
43
// Registered identifiers:
44
reg [ctrbits-1:0] rCycles;
45
reg [1:0] rDigitSelect;
46
reg [3:0] rNybble;
47
reg [3:0] rDigit;
48
reg [6:0] rCharacter;
49
 
50
// Frequency divider and 2-bit counter for digit selector
51
always @ (posedge clk or posedge rst)
52
        if (rst) begin
53
                rCycles <= 0;
54
                rDigitSelect <= 3;
55
        end
56
        else
57
                if (rCycles == uplimit) begin
58
                        rCycles <= 0;
59
                        rDigitSelect <= rDigitSelect - 1;
60
                end
61
                else
62
                        rCycles <= rCycles + 1;
63
 
64
// Decode the digit selector to four control lines
65
always @ (rDigitSelect)
66
                case (rDigitSelect)
67
                        2'b00 : rDigit <= 4'b1110;
68
                        2'b01 : rDigit <= 4'b1101;
69
                        2'b10 : rDigit <= 4'b1011;
70
                        2'b11 : rDigit <= 4'b0111;
71
                endcase
72
 
73
 
74
// MUX the four 4-bit inputs to a single 4-bit value
75
always @ (rDigitSelect or inval )
76
        case (rDigitSelect)
77
                2'b00 :  rNybble <= inval[3:0];
78
                2'b01 :  rNybble <= inval[7:4];
79
                2'b10 :  rNybble <= inval[11:8];
80
                2'b11 :  rNybble <= { 3'b0, inval[12]};
81
        endcase
82
 
83
// Convert 4-bit value to character
84
always @ (rNybble or rDigitSelect)
85
        if (rDigitSelect==2'b11)   // see if it is time to do the sign
86
           rCharacter <= rNybble?~(7'b0000001):~(7'b0000000);
87
        else
88
        case (rNybble)       //     abcdefg
89
                4'h0 : rCharacter <= ~(7'b1111110);
90
                4'h1 : rCharacter <= ~(7'b0110000);
91
                4'h2 : rCharacter <= ~(7'b1101101);
92
                4'h3 : rCharacter <= ~(7'b1111001);
93
                4'h4 : rCharacter <= ~(7'b0110011);
94
                4'h5 : rCharacter <= ~(7'b1011011);
95
                4'h6 : rCharacter <= ~(7'b1011111);
96
                4'h7 : rCharacter <= ~(7'b1110000);
97
                4'h8 : rCharacter <= ~(7'b1111111);
98
                4'h9 : rCharacter <= ~(7'b1111011);
99
                4'ha : rCharacter <= ~(7'b1110111);
100
                4'hb : rCharacter <= ~(7'b0011111);
101
                4'hc : rCharacter <= ~(7'b1001110);
102
                4'hd : rCharacter <= ~(7'b0111101);
103
                4'he : rCharacter <= ~(7'b1001111);
104
                4'hf : rCharacter <= ~(7'b1000111);
105
                default : rCharacter <= ~(7'b1001001);
106
        endcase
107
 
108
// Create registered outputs (for glitch-free output)
109
always @ (posedge clk or posedge rst)
110
        if (rst) begin
111
                oSegmentA <= 0;
112
                oSegmentB <= 0;
113
                oSegmentC <= 0;
114
                oSegmentD <= 0;
115
                oSegmentE <= 0;
116
                oSegmentF <= 0;
117
                oSegmentG <= 0;
118
                oDigitRight <= 1'b1;
119
                oDigitMiddleRight <= 1'b1;
120
                oDigitMiddleLeft <= 1'b1;
121
                oDigitLeft <= 1'b1;
122
        end
123
        else begin
124
                oSegmentA <= rCharacter[6];
125
                oSegmentB <= rCharacter[5];
126
                oSegmentC <= rCharacter[4];
127
                oSegmentD <= rCharacter[3];
128
                oSegmentE <= rCharacter[2];
129
                oSegmentF <= rCharacter[1];
130
                oSegmentG <= rCharacter[0];
131
                oDigitRight <= rDigit[0];
132
                oDigitMiddleRight <= rDigit[1];
133
                oDigitMiddleLeft <= rDigit[2];
134
                oDigitLeft <= rDigit[3];
135
        end
136
 
137
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.