这是我写的程序 原本我的显示程序模块是和主程序是一起的,现在我想把显示模块提出来 然后用实例引用的方式引用显示模块,方便以后引用。
程序的主要功能是 一个按键加一 一个按键减一 一个按键复位
这个是顶层文件 被注释掉的那部分是显示程序的
/*****************************
*Project : key_2
*Author : Mr.li
*CreateData : 2010-11-2
*Information :
*Function :
*ModifyInformation : 2010-11-10
*****************************/
module Key_3( Clk_50Mhz, //50Mh系统时钟输入
KeyIn, //按下为低电平 不按下为高电平
Rst_L, //
LedSeg, //
LedEn //
);
input Clk_50Mhz, Rst_L;
input[1:0] KeyIn; //
output[7:0] LedSeg, LedEn;
reg[7:0] LedSeg, LedEn;
//reg[15:0] Scant_Cnt;
reg[19:0] Cnt; //20ms 扫描一次
//reg[4:0] Num;
reg[4:0] LedNum[7:0]; // 宽度为四 深度为八的存储空间
reg[1:0] Key_R; //存储键值
reg[1:0] Key_R_H;
/*
always @ (posedge Clk_50Mhz or negedge Rst_L)
begin
if(!Rst_L)
begin
Scant_Cnt <= 0;
LedEn <= 8'b1111_1110;
end
else
begin
if( Scant_Cnt == 16'hffff ) //
begin
Scant_Cnt <= 0;
LedEn[7:1] <= LedEn[6:0];
LedEn[0] <= LedEn[7];
end
else Scant_Cnt <= Scant_Cnt + 1;
end
end
*/
/****************************************************************/
always @ (posedge Clk_50Mhz or negedge Rst_L)
if(!Rst_L)
Cnt <= 20'd0;
else
Cnt <= Cnt + 1'b1;
always @ (posedge Clk_50Mhz or negedge Rst_L)
if(!Rst_L)
Key_R <= 2'b11;
else if(Cnt == 20'hfffff)
Key_R <= KeyIn;
always @ (posedge Clk_50Mhz or negedge Rst_L)
if(!Rst_L)
Key_R_H <= 2'b11;
else
Key_R_H <= Key_R;
wire[1:0] sw = Key_R_H & (~Key_R);
////////////////////////////////////////////////////
always @ ( posedge Clk_50Mhz or negedge Rst_L )
begin
if(!Rst_L)
begin
LedNum[0] <= 0;
LedNum[1] <= 0;
LedNum[2] <= 0;
LedNum[3] <= 0;
LedNum[4] <= 0;
LedNum[5] <= 0;
LedNum[6] <= 0;
LedNum[7] <= 0;
end
/*
else if( sw )
*/
else
case (sw)
2'b01 : // add 1 +1
begin
LedNum[0] <= LedNum[0] + 1;
if(LedNum[0] == 9)
begin
LedNum[1] <= LedNum[1] + 1;
LedNum[0] <= 0;
if(LedNum[1] == 9)
begin
LedNum[2] <= LedNum[2] + 1;
LedNum[1] <= 0;
if(LedNum[2] == 9)
begin
LedNum[3] <= LedNum[3] + 1;
LedNum[2] <= 0;
end
end
end
end
2'b10 : // subtract 1 -1
begin
LedNum[0] <= LedNum[0] - 1;
if(LedNum[0] == 0)
begin
LedNum[1] <= LedNum[1] - 1;
LedNum[0] <= 9;
if(LedNum[1] == 0)
begin
LedNum[2] <= LedNum[2] - 1;
LedNum[1] <= 9;
if(LedNum[2] == 0)
begin
LedNum[3] <= LedNum[3] - 1;
LedNum[2] <= 9;
end
end
end
end
default :
begin
LedNum[0] <= LedNum[0];
LedNum[1] <= LedNum[1];
LedNum[2] <= LedNum[2];
LedNum[3] <= LedNum[3];
LedNum[4] <= LedNum[4];
LedNum[5] <= LedNum[5];
LedNum[6] <= LedNum[6];
LedNum[7] <= LedNum[7];
end
endcase
end
LedDis v1(
.Clk_50Mhz (Clk_50Mhz),
/*.LedNum[0] (LedNum[0]),
.LedNum[1] (LedNum[1]),
.LedNum[2] (LedNum[2]),
.LedNum[3] (LedNum[3]),
.LedNum[4] (LedNum[4]),
.LedNum[5] (LedNum[5]),
.LedNum[6] (LedNum[6]),
.LedNum[7] (LedNum[7]),*/
.LedSeg (LedSeg),
.LedEn (LedEn),
.Rst_L (Rst_L)
);
/*
//////////////////////////////////////////////////////
always @ (posedge Clk_50Mhz)
begin
case ( LedEn )
8'b1111_1110 : Num <= LedNum[0];
8'b1111_1101 : Num <= LedNum[1];
8'b1111_1011 : Num <= LedNum[2];
8'b1111_0111 : Num <= LedNum[3];
8'b1110_1111 : Num <= LedNum[4];
8'b1101_1111 : Num <= LedNum[5];
8'b1011_1111 : Num <= LedNum[6];
8'b0111_1111 : Num <= LedNum[7];
endcase
end
//////////////////////////////////////////////////////
//数码管代码译码进程块 触发信号为Num
always @ ( Num )
begin
case(Num)
5'b00000:
LedSeg=8'b1100_0000; //0 c0
5'b00001:
LedSeg=8'b1111_1001; //1 f9
5'b00010:
LedSeg=8'b1010_0100; //2 a4
5'b00011:
LedSeg=8'b1011_0000; //3 b0
5'b00100:
LedSeg=8'b1001_1001; //4 99
5'b00101:
LedSeg=8'b1001_0010; //5 92
5'b00110:
LedSeg=8'b1000_0010; //6 82
5'b00111:
LedSeg=8'b1111_1000; //7 f8
5'b01000:
LedSeg=8'b1000_0000; //8 80
5'b01001:
LedSeg=8'b1001_0000; //9 90
5'b01010:
LedSeg=8'b1000_1000; //a 88
5'b01011:
LedSeg=8'b1000_0011; //b 83
5'b01100:
LedSeg=8'b1100_0110; //c c6
5'b01101:
LedSeg=8'b1010_0001; //d a1
5'b01110:
LedSeg=8'b1000_0110; //e 86
5'b01111:
LedSeg=8'b1000_1110; //f 8e
5'b10000:
LedSeg=8'b1011_1111; // -
default :
LedSeg=8'b0100_0000; //
endcase
end
*/
endmodule
这个是显示模块 是我改写的 不成功
/***************************************
*Project : LedDis
*Author : Mr.Li
*CreateData : 2010-11-13 pm
*Information :
*Function :
***************************************/
module LedDis(
Clk_50Mhz,
LedNum[0],
LedNum[1],
LedNum[2],
LedNum[3],
LedNum[4],
LedNum[5],
LedNum[6],
LedNum[7],
LedSeg,
LedEn,
Rst_L
);
input[4:0] LedNum[0],
LedNum[1],
LedNum[2],
LedNum[3],
LedNum[4],
LedNum[5],
LedNum[6],
LedNum[7];
input Clk_50Mhz, Rst_L;
output[7:0] LedSeg, LedEn;
reg[7:0] LedSeg, LedEn;
reg[15:0] Scant_Cnt;
reg[4:0] Num;
/////////////////////////////////////////////////////////
always @ ( posedge Clk_50Mhz or negedge Rst_L )
begin
if(!Rst_L)
begin
LedEn <= 8'b1111_1110;
Scant_Cnt <= 0;
end
else
begin
if(Scant_Cnt == 16'hffff)
begin
Scant_Cnt <= 0;
LedEn[7:1] <= LedEn[6:0];
LedEn[0] <= LedEn[7];
end
else
Scant_Cnt <= Scant_Cnt + 1;
end
end
//////////////////////////////////////////////////
always @ (posedge Clk_50Mhz)
begin
case ( LedEn )
8'b1111_1110 : Num <= LedNum[0];
8'b1111_1101 : Num <= LedNum[1];
8'b1111_1011 : Num <= LedNum[2];
8'b1111_0111 : Num <= LedNum[3];
8'b1110_1111 : Num <= LedNum[4];
8'b1101_1111 : Num <= LedNum[5];
8'b1011_1111 : Num <= LedNum[6];
8'b0111_1111 : Num <= LedNum[7];
endcase
end
//////////////////////////////////////////////////////
//数码管代码译码进程块 触发信号为Num
always @ ( Num )
begin
case(Num)
5'b00000:
LedSeg=8'b1100_0000; //0 c0
5'b00001:
LedSeg=8'b1111_1001; //1 f9
5'b00010:
LedSeg=8'b1010_0100; //2 a4
5'b00011:
LedSeg=8'b1011_0000; //3 b0
5'b00100:
LedSeg=8'b1001_1001; //4 99
5'b00101:
LedSeg=8'b1001_0010; //5 92
5'b00110:
LedSeg=8'b1000_0010; //6 82
5'b00111:
LedSeg=8'b1111_1000; //7 f8
5'b01000:
LedSeg=8'b1000_0000; //8 80
5'b01001:
LedSeg=8'b1001_0000; //9 90
5'b01010:
LedSeg=8'b1000_1000; //a 88
5'b01011:
LedSeg=8'b1000_0011; //b 83
5'b01100:
LedSeg=8'b1100_0110; //c c6
5'b01101:
LedSeg=8'b1010_0001; //d a1
5'b01110:
LedSeg=8'b1000_0110; //e 86
5'b01111:
LedSeg=8'b1000_1110; //f 8e
5'b10000:
LedSeg=8'b1011_1111; // -
default :
LedSeg=8'b0100_0000; //
endcase
end
endmodule
此帖出自
小平头技术问答
一周热门 更多>