数码管显示
输入数据可以自己改变
module SmgDisplay(
input clk,
input rst_n,
input [3:0] shang_jia,
input [5:0] value_jin_all,
output reg [2:0] smgWei,
output reg [6:0] smgDuan //7段数码管,没算小数点
);
parameter WEI_SCAN_COUNT = 20'd1; //位选扫描的常量,定义10MS需要计数500_000,这里仿真只是使用1个周期代替,实际的时候自行修改
reg [19:0] wei_scan_count; //仿真查看延时计数值
reg [3:0] smgData;
//动态扫描选择输出位的计数
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
wei_scan_count <= 'd0;
end
else
begin
if(wei_scan_count == WEI_SCAN_COUNT)
wei_scan_count <= 'd0;
else
wei_scan_count <= wei_scan_count + 'd1;
end
end
//动态扫描选择输出位的计数到了后换下一个位显示
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
smgWei <= 'd0;
end
else
begin
if(wei_scan_count == WEI_SCAN_COUNT)
smgWei <= smgWei + 'd1;
else
smgWei <= smgWei;
end
end
//设置每个位的实际数据
always@(*)
begin
case (smgWei)
3'b0000 : smgData <= shang_jia; //0号数码管,显示商品价格
3'b0001 : smgData <= 'd0; //1号数码管
3'b0010 : smgData <= 'd0; //2号数码管
3'b0011 : smgData <= 'd0; //3号数码管
3'b0100 : smgData <= value_jin_all%10; //4号数码管 显示投入总价的个位
3'b0101 : smgData <= value_jin_all/10; //5号数码管 显示投入总价的十位
3'b0110 : smgData <= 'd0; //6号数码管
3'b0111 : smgData <= 'd0; //7号数码管
default : smgData <= 'd0; //0号数码管
endcase
end
//设置数据显示段码
always@(*)
begin
case (smgData)
4'b0000 : smgDuan <= 7'h3f; //0
4'b0001 : smgDuan <= 7'h06; //1
4'b0010 : smgDuan <= 7'h5b; //2
4'b0011 : smgDuan <= 7'h4f; //3
4'b0100 : smgDuan <= 7'h66; //4
4'b0101 : smgDuan <= 7'h6d; //5
4'b0110 : smgDuan <= 7'h7d; //6
4'b0111 : smgDuan <= 7'h07; //7
4'b1000 : smgDuan <= 7'h7f; //8
4'b1001 : smgDuan <= 7'h6f; //9
4'b1010 : smgDuan <= 7'h77; //A
4'b1011 : smgDuan <= 7'h7c; //B
4'b1100 : smgDuan <= 7'h39; //C
4'b1101 : smgDuan <= 7'h5e; //D
4'b1110 : smgDuan <= 7'h79; //E
4'b1111 : smgDuan <= 7'h71; //F
default : smgDuan <= 7'h3f; //0
endcase
end
endmodule