如何使用 6 个开关作为位在两个 7 段显示器上显示十进制等效值 (0-63)?
How to display decimal equivalent (0-63) on two 7-segment displays using 6 switches as bits?
我最近做了一个技能测试,其中问题被描述为:
"Create a .v (verilog hdl) file that uses sw [6:1] to represent 0 to 63 in the 7-segment displays hex2 and hex1 while showing "--" 对于任何可被 4 整除的数字。"
我通过硬编码完成了它(因为我在时间限制内)使用 0-63 的 case 语句的所有值,注意到那些可以被 4 整除的值只显示“--”
当然这不是最佳解决方案,我不想留下通过硬编码值解决的问题。
这是用于 Cyclone-II FPGA(我们在大学里拥有的)并且我正在使用 Quartus II 进行编译。对于每个可被 4 整除的数字的“--”,我通过添加条件运算符并执行“(sw % 4) == 0 ? n : ...”来解决它。我已经完成了硬编码,并尝试通过记录每 16 个间隔的模式和 "shifting up" 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 语句进行硬编码,因为我编写的这个新的替代代码比那个长。我想寻求帮助以获得比硬编码每个或我上面的尝试更好的选择。非常感谢任何答案!
既然是为了显示结果,花一些时钟周期来得到结果应该是可以接受的。
检查 "double dabble" 算法。
南兰网站也有一些例子:https://www.nandland.com/vhdl/modules/double-dabble.html
我最近做了一个技能测试,其中问题被描述为: "Create a .v (verilog hdl) file that uses sw [6:1] to represent 0 to 63 in the 7-segment displays hex2 and hex1 while showing "--" 对于任何可被 4 整除的数字。"
我通过硬编码完成了它(因为我在时间限制内)使用 0-63 的 case 语句的所有值,注意到那些可以被 4 整除的值只显示“--”
当然这不是最佳解决方案,我不想留下通过硬编码值解决的问题。
这是用于 Cyclone-II FPGA(我们在大学里拥有的)并且我正在使用 Quartus II 进行编译。对于每个可被 4 整除的数字的“--”,我通过添加条件运算符并执行“(sw % 4) == 0 ? n : ...”来解决它。我已经完成了硬编码,并尝试通过记录每 16 个间隔的模式和 "shifting up" 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 语句进行硬编码,因为我编写的这个新的替代代码比那个长。我想寻求帮助以获得比硬编码每个或我上面的尝试更好的选择。非常感谢任何答案!
既然是为了显示结果,花一些时钟周期来得到结果应该是可以接受的。
检查 "double dabble" 算法。
南兰网站也有一些例子:https://www.nandland.com/vhdl/modules/double-dabble.html