七段数码管的动态扫描显示
实验四 七段数码管的动态扫描显示
动态扫描显示与视觉暂留
设计计数时钟
设计一个分频器,对50MHz分频输出到计数器,让计数器以较慢的速度递增。
module int_div(clk,div_out);
input clk;
output reg div_out;
reg [31:0] clk_div;
parameter CLK_FREQ = 'D50_000_000;//系统时钟50MHz
parameter DCLK_FREQ = 'D10;//输出频率10/2Hz
always@(posedge clk)
begin
if(clk_div < (CLK_FREQ/DCLK_FREQ))
clk_div <= clk_div + 1;
else
begin
clk_div <= 0;
div_out <= ~div_out;
end
end
endmodule
2.调用宏功能模块设计计数器
见讲义。(自己设计BCD码计数器)
3.数码管扫描显示程序设计(不含小数点)
module segmain(clk,reset_n,datain,seg_data, seg_com);
input clk;
input reset_n;
input [15:0] datain;
output [7:0] seg_data;
output [3:0] seg_com;
reg [3:0] seg_com;
reg [7:0] seg_data;
reg [3:0] bcd_led;
reg [26:0] count;
always@(posedge clk)
begin
if (!reset_n)count <= 0;
elsecount <= count + 1;
end
always@(count[26:25] or datain)
begin
case(count[26:25])
2'b00:
begin
bcd_led = datain[3:0];
seg_com = 4'b1110;//
end
2'b01:
begin
bcd_led = datain[7:4];
seg_com = 4'b1101;//
end
2'b10:
begin
bcd_led = datain[11:8];
seg_com = 4'b1011;//
end
2'b11:
begin
bcd_led = datain[15:12];
seg_com = 4'b0111;//
end
endcase
end
always@(seg_com or bcd_led)
begin
case(bcd_led)
4'h0:seg_data = 8'hc0;//0
4'h1:seg_data = 8'hf9;//1
4'h2:seg_data = 8'ha4;//2
4'h3:seg_data = 8'hb0;//3
4'h4:seg_data = 8'h99;//4
4'h5:seg_data = 8'h92;//5
4'h6:seg_data = 8'h82;//6
4'h7:seg_data = 8'hf8;//7
4'h8:seg_data = 8'h80;//8
4'h9:seg_data = 8'h90;//9
4'ha:seg_data = 8'h88;//a
4'hb:seg_data = 8'h83;//b
4'hc:seg_data = 8'hc6;//c
4'hd:seg_data = 8'ha1;//d
4'he:seg_data = 8'h86;//e
4'hf:seg_data = 8'h8e;//f
default:seg_data = 8'h80;//0
endcase
end
endmodule
4.设置芯片和管脚。设置芯片型号、配置芯片型号等内容。
参照以下文件配置芯片管脚,并运行该tcl 脚本。
#Setup.tcl ------ Setup pin setting for EP3C25-V5 main board
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
set_global_assignment -name ENABLE_INIT_DONE_OUTPUT OFF
set_locatio