Verilog: wyświetlacz 7seg

Poniższy przykład to chyba najprostszy z możliwych sterowników pojedynczego wyświetlacza 7-segmentowego. Działa z wyświetlaczem ze wspólną anodą, czyli elektrodę wspólną podłączamy do plusa zasilania, a segmenty zapalane są zerami. Przeróbka na wyświetlacz ze wspólną katodą jest bardzo prosta - wystarczy w case zmienić zera na jedynki i jedynki na zera.

Interfejs jest również trywialny. Mamy tu jedno wejście w postaci magistrali 4-bitowej, gdzie najmłodszy bit ma wartość 1 (oznaczenie A w klasycznych sterownikach, jak 7447, 4511), a najstarszy ma wartość 8 (oznaczenie D w 7447, 4511). Wyjściami są oczywiście linie sterujące segmentami wyświetlacza: sa, sb... W przeciwieństwie do sterowników klasycznych, możliwe jest tutaj wyświetlanie liter A, b, C, d, E, F. Kropka nie jest w tym przypadku obsługiwana. Cały ten sterownik jest układem kombinacyjnym, który nie posiada żadnej pamięci, ani nie wymaga sygnału zegarowego.

  
// Sterownik wyświetlacza 7-segmentowego LED
// wspólna anoda, zapalanie segmentu zerem

module decoder_7seg(
    input [3:0] digit,
    output reg sa, sb, sc, sd, se, sf, sg    
);

    always @(digit)
        case(digit)                            // abcdefg
            4'b0000: {sa,sb,sc,sd,se,sf,sg} <= 7'b0000001;  // 0
            4'b0001: {sa,sb,sc,sd,se,sf,sg} <= 7'b1001111;  // 1
            4'b0010: {sa,sb,sc,sd,se,sf,sg} <= 7'b0010010;  // 2
            4'b0011: {sa,sb,sc,sd,se,sf,sg} <= 7'b0000110;  // 3
            4'b0100: {sa,sb,sc,sd,se,sf,sg} <= 7'b1001100;  // 4
            4'b0101: {sa,sb,sc,sd,se,sf,sg} <= 7'b0100100;  // 5
            4'b0110: {sa,sb,sc,sd,se,sf,sg} <= 7'b0100000;  // 6
            4'b0111: {sa,sb,sc,sd,se,sf,sg} <= 7'b0001111;  // 7
            4'b1000: {sa,sb,sc,sd,se,sf,sg} <= 7'b0000000;  // 8
            4'b1001: {sa,sb,sc,sd,se,sf,sg} <= 7'b0000100;  // 9
            4'b1010: {sa,sb,sc,sd,se,sf,sg} <= 7'b0001000;  // a
            4'b1011: {sa,sb,sc,sd,se,sf,sg} <= 7'b1100000;  // b
            4'b1100: {sa,sb,sc,sd,se,sf,sg} <= 7'b0110001;  // c
            4'b1101: {sa,sb,sc,sd,se,sf,sg} <= 7'b1000010;  // d
            4'b1110: {sa,sb,sc,sd,se,sf,sg} <= 7'b0110000;  // e
            4'b1111: {sa,sb,sc,sd,se,sf,sg} <= 7'b0111000;  // f
            default: {sa,sb,sc,sd,se,sf,sg} <= 7'b1111111;  // -
        endcase

endmodule
  

Budowa wyświetlacza LED 7-segmentowego:

Wyświetlacz 7-segmentowy

...a tutaj zdjęcie mojego mega low-costowego "zestawu badawczo-rozwojowego" :) Kolejny raz przydały się płytki testowe do mikrokontrolerów

Płytki testowe