Open kungfudaibi opened 4 months ago
显示位数不对说明scan_seq_disp模块有问题
localparam N=20; reg [N-1:0] cnt; reg [3:0] hex; always @(posedge clk , posedge rst) begin if(rst) begin cnt = 0; hex = 4'd10; end else begin cnt = cnt + 1; case (cnt[N-1]) 1'b0:begin hex = one; an = 8'b11111110; end 1'b1:begin hex = ten; an = 8'b11111101; end endcase end
也就是把
case (cnt[N-1])
换成
case (cnt[N-1 :N-2])
随后用两位2进制数来表示三个数码管的显示情况
module scan_seg_disp ( input clk, input [3:0] one, ten, hun, output reg [7:0] an, output reg [6:0] sseg ); localparam N=20; reg [N-1:0] cnt; reg [3:0] hex; always @(posedge clk) begin cnt = cnt + 1; case (cnt[N-1 : N-2]) 2'b00:begin hex = one; an = 8'b11111110; end 2'b01:begin hex = ten; an = 8'b11111101; end 2'b10:begin hex = hun; an = 8'b11111011; end endcase end always@ (*)begin case(hex) 4'h0:sseg[6:0] = 7'b0000001; 4'h1:sseg[6:0] = 7'b1001111; 4'h2:sseg[6:0] = 7'b0010010; 4'h3:sseg[6:0] = 7'b0000110; 4'h4:sseg[6:0] = 7'b1001100; 4'h5:sseg[6:0] = 7'b0100100; 4'h6:sseg[6:0] = 7'b0100000; 4'h7:sseg[6:0] = 7'b0001111; 4'h8:sseg[6:0] = 7'b0000000; 4'h9:sseg[6:0] = 7'b0000100; default: sseg[6:0] = 7'b1111111; endcase end endmodule
问题剖析
显示位数不对说明scan_seq_disp模块有问题
详见显示原理,当最高位变化的时候,实际上已经过了2的N次方个时钟周期了,也就对应了人肉眼不可见的变化频率也就是把
换成
随后用两位2进制数来表示三个数码管的显示情况
解决方案