新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2019-4-27
- 在线时间
- 9 小时
|
各位大神:
在做六位数码管动态显示时,有如下问题。
数码显示的源码如下:
module smg(
input sys_clk, //输入时钟
input rst_n, //复位信号,进行同步复位
input [16:0] timedata, //时间数值,程序里暂未使用
output reg [5:0] smg_wei, //数码管的位选端
output reg [7:0] smg_data //数码管的段选端
);
parameter MS_1 = 100; //动态扫描时间间隔参数定义
parameter ZERO =8'b0011_1111, //段码
ONE =8'b0000_0110,
TWO =8'b0101_1011,
THREE =8'b0100_1111,
FOUR =8'b0110_0110,
FIVE =8'b0110_1101,
SIX =8'b0111_1101,
SEVEN =8'b0000_0111,
EIGHT =8'b0111_1111,
NINE =8'b0110_1111,
TEN =8'b0111_0111,
ELEVEN =8'b0111_1100,
TWELVE =8'b0011_1001,
THIRTEEN=8'b0101_1110,
FOURTEEN=8'b0111_1001,
FIFTEEN =8'b0111_0001;
reg [19:0] sys_smg_count=0; //系统时钟计数器
reg [2:0] scan_count = 0; //扫描计数,需要扫描六位数码管
reg show_char_flag=1; //一维寄存器组,赋值标志,0 赋值阿拉伯数字,1赋值英文字母
reg [7:0] smg_show_data[5:0]; //一维寄存器
always @(posedge sys_clk) //寄存器组赋值
begin
if(show_char_flag == 0)
begin
smg_show_data[5] <= ZERO;
smg_show_data[4] <= ONE;
smg_show_data[3] <= TWO;
smg_show_data[2] <= THREE;
smg_show_data[1] <= FOUR;
smg_show_data[0] <= FIVE;
end
else
begin
smg_show_data[5] <= TEN;
smg_show_data[4] <= ELEVEN;
smg_show_data[3] <= TWELVE;
smg_show_data[2] <= THIRTEEN;
smg_show_data[1] <= FOURTEEN;
smg_show_data[0] <= FIFTEEN;
end
end
//送数显示
always @(posedge sys_clk)
begin
if(rst_n == 1'b0) //复位时,位选赋值,高电平,对应位的数码管工作
begin
smg_wei <= 6'b000001;
end
else
begin
sys_smg_count <= sys_smg_count + 1; //时钟计数
if(sys_smg_count == MS_1) //到达位选计时,要位选移位,并发送对应的段选数据
begin
smg_wei <= smg_wei << 1; //位选移位
smg_data <= smg_show_data[scan_count+1]; //送对应的段选数据
scan_count <= scan_count + 1; //扫描计数加一
if(scan_count == 7) //7才可以六位数码管正常显示,6或5都不可以正常显示
begin
scan_count <= 0; //扫描变量清零
smg_wei <= 6'b000001; //位选重新置位
end
sys_smg_count <= 0; //位选计时清零
end
end
end
endmodule
为什么判定 scan_count == 7 时,才可以正常显示ABCDEF
仿真代码如下:
module smg_tb;
// Inputs
reg sys_clk;
reg rst_n;
reg [16:0] timedata;
reg show_char_flag=1;
// Outputs
wire [5:0] smg_wei;
wire [7:0] smg_data;
// Instantiate the Unit Under Test (UUT)
smg uut (
.sys_clk(sys_clk),
.rst_n(rst_n),
.timedata(timedata),
.smg_wei(smg_wei),
.smg_data(smg_data)
);
initial begin
// Initialize Inputs
sys_clk = 0;
rst_n = 0;
timedata = 0;
// Wait 100 ns for global reset to finish
#100;
rst_n = 1;
// Add stimulus here
end
always #10 sys_clk = ~sys_clk;
endmodule
在仿真波形时,发现smg_data存在不定值的状态,不知道什么原因
感谢指教!
|
|