Как отобразить десятичный эквивалент (0-63) на двух 7-сегментных дисплеях, используя 6 переключателей в качестве битов? - PullRequest
0 голосов
/ 04 октября 2019

Недавно я провел тест на умение, в котором проблема описывалась так: «Создайте файл .v (verilog hdl), который использует sw [6: 1] для представления от 0 до 63 в 7-сегментных дисплеях hex2 и hex1 при отображении"-" для любого числа, кратного 4. "

Я закончил его жестким кодированием (так как у меня был ограничен по времени) все значения, используя инструкцию case от 0-63, принимая во внимание те, которые делятся на 4показывать только "-"

Конечно, это не оптимальное решение, и я не хочу оставлять проблему решенной с помощью значений жесткого кодирования.

Это для ПЛИС Cyclone-II (то, что у нас в университете), и я использую Quartus II для компиляции. Для «-» для каждого числа, делимого на 4, я решил это, добавив условный оператор, и сделал «(sw% 4) == 0? N: ...». Я сделал жесткое кодирование и попытался решить его по-другому, приняв к сведению шаблон для каждых 16 интервалов и «сдвигая» значение 7-сегментного дисплея до значения «0000» для этого значения (в 16,10000 = h6, 17 10001 = h7 и т. Д.):

module sk10(sw,hex1,hex2,hex3,hex0);
input [5:0] sw;
output [6:0] hex1,hex2,hex3 = 7'h7F, hex0 = 7'h7F; 

reg [6:0] hex1;

parameter h0 = 7'b0000001; 
parameter h1 = 7'b1001111;
parameter h2 = 7'b0010010; 
parameter h3 = 7'b0000110;
parameter h4 = 7'b1001100;
parameter h5 = 7'b0100100;
parameter h6 = 7'b0100000;
parameter h7 = 7'b0001111;
parameter h8 = 7'b0000000;
parameter h9 = 7'b0000100;
parameter n =  7'b1111110;

assign hex2 = (sw % 4 == 0) ? n :
                    (sw < 10) ? h0 : 
                    (sw < 20 && sw >= 10) ? h1 :
                    (sw < 30 && sw >= 20) ? h2 :
                    (sw < 40 && sw >= 30) ? h3 :
                    (sw < 50 && sw >= 40) ? h4 :
                    (sw < 60 && sw >= 50) ? h5 :
                    (sw < 70 && sw >= 60 ) ? h6 : n;

always @ (sw)
begin
    if (sw < 16) begin 
            case (sw[3:0])
            0 : hex1 = h0; 
            1 : hex1 = h1;
            2 : hex1 = h2; 
            3 : hex1 = h3;
            4 : hex1 = h4;
            5 : hex1 = h5;
            6 : hex1 = h6;
            7 : hex1 = h7;
            8 : hex1 = h8;
            9 : hex1 = h9;
            10 : hex1 = h0;
            11 : hex1 = h1;
            12 : hex1 = h2;
            13 : hex1 = h3;
            14 : hex1 = h4;
            15 : hex1 = h5;
            endcase
            end
    else if (sw >= 16 && sw < 32) begin
            case (sw[3:0])
            0 : hex1 = h6; 
            1 : hex1 = h7;
            2 : hex1 = h8; 

... and so on for every 16 intervals until 64

Это работает, но вряд ли оптимально, и я мог бы также жестко закодировать все 64 оператора case, поскольку этот новый альтернативный код, который я сделал, длиннеечем это. Я хотел бы попросить о помощи для лучшей альтернативы, чем жесткое программирование каждого или моей попытки выше. Любой ответ высоко ценится!

1 Ответ

0 голосов
/ 05 октября 2019

Поскольку результат предназначен для отображения, допустимо потратить несколько тактов, чтобы получить результат.

Проверьте алгоритм "double dabble" .

На сайте Nanland также есть несколько примеров: https://www.nandland.com/vhdl/modules/double-dabble.html

...