七段数码管显示实验(使用Basys3电路板)
功能和目的
利用开发板 4 个 7 段数码管依次显示数字“1234”和“4321”。通过SW0按键选择数码管是顺序显示数字还是逆序显示数字。
如:当 SW0=1 时显示“1234”;
当 SW0=0 时显示“4321”。
要求:
1.给出行为仿真波形;
2.将程序烧录到 ROM 里面(对当前版本vivado似乎不再适用);
3.开发板演示。
项目的创建
创建源文件
-
打开vivado2020.1,选择create project,点击next;
-
进入如下界面,注意各级目录必须全部是英文;
-
点击next,选择RTL Project,再次点击next;
-
进入Add Source界面后选择create file,将语言设置为System Verilog,再设置文件名称,再点击next;
-
再次点击next,跳过Add Constraint部分;
-
按下图进行勾选;
-
进入如下窗口,点击Finish;
-
设置源文件模块的名称,这里我们随便将其设置为self;
-
我们的项目初具雏形(源文件代码在后文)。
创建仿真文件
-
点击Add Source,选择第三项;
-
点击Create File。为了便于理解,设置仿真文件名称为tb_self,注意语言的选择;
-
点击Finish。这里不必再次设置仿真文件的模块名称,因为我们将稍后把全部代码粘贴过来。仿真文件创立完毕(代码在后文)。
创建约束文件(分配引脚)
- 点击Add Source,选择第一项;
- 点击Create File。为了便于理解,设置约束文件名称为cons_self;
- 此时项目内部的文件如下;
- 代码将出现在后文。
运行步骤
仿真与综合
- 点击Run Simulation,选择Run Behavioral Simulation,稍后弹出仿真波形窗口,如图所示;
- 单击Run Synthesis,点击OK,稍后弹出如下窗口;
- 再次点击OK,稍后弹出如下窗口,按下图勾选;
- 再次点击OK,稍后弹出如下窗口,按下图勾选;
下载程序到FPGA
- 点击下图中的Open a new hardware target(再次操作时没有这一步);
- 一直点击next,直至finish;
- 进行如下操作;
- 我们的板子按照1234亮起来啦!惊不惊喜,意不意外!
代码
源文件代码
`timescale 1ns / 1ps
module display(
input logic CLK,
input logic SW_in, //决定是1234模式还是4321模式
output logic [10:0] display_out
);
parameter Time = 50000; //这里将时间定为一个参数,便于理解和修改
logic [2:0]sel = 0; //sel信号决定亮起来的是四个数码管中的哪一个
logic [19:0]count = 0; //count最大是50000,因此20位2进制数是足够的
always@(posedge CLK) begin
if(SW_in==0) begin
case(sel)
0:display_out <= 11'b0111_1001111;
1:display_out <= 11'b1011_0010010;
2:display_out <= 11'b1101_0000110;
3:display_out <= 11'b1110_1001100;
default:display_out <= 11'b1111_1111111;
endcase
end
else begin
case(sel)
0:display_out <= 11'b1110_1001111;
1:display_out <= 11'b1101_0010010;
2:display_out <= 11'b1011_0000110;
3:display_out <= 11'b0111_1001100;
default:display_out <= 11'b1111_1111111;
endcase
end
end
always_ff@(posedge CLK) begin
if(count == Time) begin
sel <= sel + 3'd1;
if( sel == 3'd4) begin
sel <= 3'd0;
end
count <= 11'd0;
end
else begin
count <= count + 11'd1;
end
end
endmodule
仿真文件代码
`timescale 1ns / 1ps
module tb_display(
);
logic CLK;
logic SW_in;
logic [10:0] display_out;
display duc(
.CLK(CLK),
.SW_in(SW_in),
.display_out(display_out)
);
initial begin
CLK = 1'd0;
SW_in = 1'd0;
#20;
SW_in = 1'd1;
end
always #5 CLK = ~CLK;
endmodule
约束文件代码
set_property PACKAGE_PIN W5 [get_ports CLK]
set_property PACKAGE_PIN V17 [get_ports SW_in]
set_property IOSTANDARD LVCMOS33 [get_ports SW_in]
set_property IOSTANDARD LVCMOS33 [get_ports CLK]
set_property PACKAGE_PIN W4 [get_ports {display_out[10]}]
set_property PACKAGE_PIN V4 [get_ports {display_out[9]}]
set_property PACKAGE_PIN U4 [get_ports {display_out[8]}]
set_property PACKAGE_PIN U2 [get_ports {display_out[7]}]
set_property PACKAGE_PIN W7 [get_ports {display_out[6]}]
set_property PACKAGE_PIN W6 [get_ports {display_out[5]}]
set_property PACKAGE_PIN U8 [get_ports {display_out[4]}]
set_property PACKAGE_PIN V8 [get_ports {display_out[3]}]
set_property PACKAGE_PIN U5 [get_ports {display_out[2]}]
set_property PACKAGE_PIN V5 [get_ports {display_out[1]}]
set_property PACKAGE_PIN U7 [get_ports {display_out[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[10]}]
电路板展示
1:两种模式切换;
2:复位按钮;
3:开关。