1 实验现象:在Quartus II中,使用In system sources and probes editor工具,输入需要显示在数码管上的数据,则数码管显示对应数值
2 知识点:(1)数码管动态扫描 (2)In system sources and probes editor(ISSP)调试工具的使用
(a)4输入查找表,8位输出 (b)分频模块,从系统时钟分频得到1KHz的扫描时钟 (c)8选1多路器,选择端为当前扫描的数码管位置 (d)8位循环移位寄存器sel0=0000_0001,sel1=0000_0010,左移一位。
代码段
1> 分频器:1KHz的周期是1ms,使用二分频,即50%的占空比,为500000ns,而系统时钟周期为20ns,所以计数500000/20=25000,所以计数值为15位。
// 分频计数器计数模块
reg [14:0]divider_cnt;//24_999
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
divider_cnt <= 15'd0;
else if(!En)
divider_cnt <= 15'd0;
else if(divider_cnt == 15'd24_999)
divider_cnt <= 15'd0;
else
divider_cnt <= divider_cnt + 1'b1;
// 1K扫描时钟生成模块
reg Clk_1K;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
Clk_1K <= 1'b0;
else if(divider_cnt == 15'd24_999)
Clk_1K <= ~Clk_1K;
else
Clk_1K <= ~Clk_1K;
2> 8位循环移位寄存器
reg [7:0]sel_r;
always@(posedge Clk_1K or negedge Rst_n)
if(!Rst_n)
sel_r <= 8'b0000_0001;
else if(sel_r == 8'b1000_0000)
sel_r <= 8'b0000_0001;
else
sel_r <= sel_r <<1;
3> 8选1多路选择器
reg data_tmp[3:0];
always@(*)
case(sel_r)
8'b0000_0001:data_tmp = disp_data[3:0];
8'b0000_0010:data_tmp = disp_data[7:4];
8'b0000_0100:data_tmp = disp_data[11:8];
8'b0000_1000:data_tmp = disp_data[15:12];
8'b0001_0000:data_tmp = disp_data[19:16];
8'b0010_0000:data_tmp = disp_data[23:20];
8'b0100_0000:data_tmp = disp_data[27:24];
8'b1000_0000:data_tmp = disp_data[31:28];
default:data_tmp = 4'b0000;
endcase
4> 查找表
always@(*)
case(data_tmp)
4'h0:seg = 7'b1000000;
4'h1:seg = 7'b1111001;
4'h2:seg = 7'b0100100;
4'h3:seg = 7'b0110000;
4'h4:seg = 7'b0011001;
4'h5:seg = 7'b0010010;
4'h6:seg = 7'b0000010;
4'h7:seg = 7'b1111000;
4'h8:seg = 7'b0000000;
4'h9:seg = 7'b0010000;
4'ha:seg = 7'b0001000;
4'hb:seg = 7'b0000011;
4'hc:seg = 7'b1000110;
4'hd:seg = 7'b0100001;
4'he:seg = 7'b0000110;
4'hf:seg = 7'b0001110;
endcase
5> 2选1多路器
assign sel = (En)?sel_r : 8'b0000_0000;