数码管为共阳极连接,低电平有效,包括段选信号seg和和位选信号sel。代码包括参数定义,计数器,数码管动态扫描三个部分。源代码如下:
端口定义与参数设置:
module seg(
input wire clk ,
input wire rst ,
input [31:0] dsp_num ,
output reg [7:0] seg ,
output reg [7:0] sel
);
localparam idle = 8'b1111_1111;
localparam DSP_COUNT = 20'd50000;//1ms
reg [19:0] dsp_count;
reg [ 3:0] bits ;
wire [31:0] bcd ;
reg [ 7:0] num [9:0];
initial begin //定义显示数字
num[0] = 8'hC0;
num[1] = 8'hF9;
num[2] = 8'hA4;
num[3] = 8'hB0;
num[4] = 8'h99;
num[5] = 8'h92;
num[6] = 8'h82;
num[7] = 8'hF8;
num[8] = 8'h80;
num[9] = 8'h90;
end
//控制显示位数
assign bcd[31:28] = dsp_num[31:16] % 10000 / 1000;
assign bcd[27:24] = dsp_num[31:16] % 1000 / 100 ;
assign bcd[23:20] = dsp_num[31:16] % 100 / 10 ;
assign bcd[19:16] = dsp_num[31:16] % 10 ;
assign bcd[15:12] = dsp_num[15: 0] % 10000 / 1000;
assign bcd[11: 8] = dsp_num[15: 0] % 1000 / 100 ;
assign bcd[ 7: 4] = dsp_num[15: 0] % 100 / 10 ;
assign bcd[ 3: 0] = dsp_num[15: 0] % 10 ;
1ms计数器
//1ms counter
always @(posedge clk or posedge rst) begin
if(rst)
dsp_count <= 20'd0;
else begin
if(dsp_count == DSP_COUNT - 1) begin
dsp_count <= 20'd0;
end
else
dsp_count <= dsp_count + 20'd1;
end
end
数码管动态显示(标识符为C,记录两位数)
//dynamic display
always @(posedge clk or posedge rst) begin
if(rst) begin
seg <= 8'b1111_1111;
sel <= 8'b1111_1111;
end else begin
if(dsp_count == DSP_COUNT - 1) begin
if(bits == 4'd8)
bits <= 4'd0;
else
bits <= bits + 4'd1;
case(bits)
4'd0: begin sel <= 8'b1111_1110; seg <= 8'b1100_0110; end//标识符
4'd1: begin sel <= 8'b1111_1111; seg <= (dsp_num[31:16] > 16'd999) ? num[bcd[27:24]] : idle; end
4'd2: begin sel <= 8'b1111_1111; seg <= (dsp_num[31:16] > 16'd9 ) ? num[bcd[23:20]] : idle; end
4'd3: begin sel <= 8'b1111_1111; seg <= (dsp_num[31:16] > 16'd0 ) ? num[bcd[19:16]] : idle; end
4'd4: begin sel <= 8'b1111_1111; seg <= (dsp_num[15: 0] > 16'd999) ? num[bcd[15:12]] : idle; end
4'd5: begin sel <= 8'b1111_1111; seg <= (dsp_num[15: 0] > 16'd99 ) ? num[bcd[11: 8]] : idle; end
4'd6: begin sel <= 8'b1011_1111; seg <= (dsp_num[15: 0] > 16'd9 ) ? num[bcd[ 7: 4]] : idle; end
4'd7: begin sel <= 8'b0111_1111; seg <= (dsp_num[15: 0] >= 16'd0 ) ? num[bcd[ 3: 0]] : idle; end
endcase
end
end
end
上述代码可实现共阳极7段数码管的动态显示,结合按键控制模块,UART,SPI,IIC等串口通信协议即可实现更加丰富的功能
tips:
该代码复位按键为高电平有效
如何显示小数?代码示例如下
begin sel <= 8'b1101_1111; seg <= num[bcd[11: 8]]-8'b1000_0000; end//显示小数点