Как отобразить десятичный эквивалент (0-63) на двух 7-сегментных дисплеях, используя 6 переключателей в качестве битов?
Недавно я провел тест навыков, в котором проблема была описана как: "Создайте файл.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 ответ
Поскольку результат предназначен для отображения, должно быть приемлемо потратить несколько тактов, чтобы получить результат.
Проверьте алгоритм "двойного прикосновения".
На сайте Nanland также есть несколько примеров: https://www.nandland.com/vhdl/modules/double-dabble.html