2014-3-12 FPGA学习-数码管 2

因为昨天那个用了130多个LE,太多了,所以今天想精简一下,顺便改成10进制的。

在修改代码中发现always后设置敏感变量用cnt_1ms 比用clk和rst_n消耗的LE要多10个左右。

在修改时还因为阻塞和非阻塞导致了bug:

display <= display + 16'd1;

if(display[3:0] >=4'd9)
begin
display <= display & 16'hfff0;
display[7:4] <= display[7:4] + 4'd1;

end

else

display <= display;

因为第二个display赋值用了非阻塞,导致了display将未+1前的display赋给自己,数字不再变化。


这次的LE用的还是很多,大概有110个,原谅我这个新手吧:

module leds(
clk, //50Mhz时钟
rst_n, //低电平复位
seg, //段选信号
bit //位选信号
);


input clk;
input rst_n;


output[7:0] seg;
output[7:0] bit;


reg[7:0] seg;
reg[3:0] bit;
reg[3:0] dis_seg;//段选辅助寄存器
reg[9:0] cnt_1s; //计时1s
reg[15:0] cnt_1ms; //计时1ms
reg[15:0] display; //显示的数字




//==========the 1ms gap ===================
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt_1ms <= 26'd0;
else if(cnt_1ms >= 16'd5000)
cnt_1ms <= 16'd0;
else
cnt_1ms <= cnt_1ms + 16'b1;
//==========the 1s gap====================
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt_1s <= 10'd0;
else if(cnt_1ms >= 16'd5000)
cnt_1s <= cnt_1s + 10'd1;
else if(cnt_1s>=10'd1000)
cnt_1s <= 10'd0;
else
cnt_1s <= cnt_1s;

//============显示数増一,位选循环=============
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
display <= 16'd0;
else if(cnt_1s >= 10'd1000)
begin
display <= display + 16'd1;

if(display[3:0] >=4'd9)
begin
display <= display & 16'hfff0;
display[7:4] <= display[7:4] + 4'd1;
if(display[7:4] >=4'd9)
begin
display <= display & 16'hff00;
display[11:8] <= display[11:8] + 4'd1;
if(display[11:8] >=4'd9)
begin
display <= display & 16'hf000;
display[15:12] <= display[15:12] + 4'd1;
if(display[15:12] >=4'd9)
begin
display <= 16'd0;
end
end
end
end





if(display[15:12] >=4'd9)
begin
display <= 16'd0;
end


end
else
display <= display;

if(!rst_n)
bit <= 4'b1110;
else if(cnt_1ms >= 16'd5000)
bit <= {bit[2:0],bit[3]};
else
bit <= bit;
end


//==========位选显示==========================
always@(bit)
begin
case(bit)
4'b1110 : dis_seg <= display[3:0];
4'b1101 : dis_seg <= display[7:4];
4'b1011 : dis_seg <= display[11:8];
4'b0111 : dis_seg <= display[15:12];
default   : dis_seg <= dis_seg;
endcase
end
//========片选显示===========================
always@(dis_seg)
begin
case(dis_seg)
4'h0 : seg <= 8'hc0;   // "0"
4'h1 : seg <= 8'hf9;   // "1"
4'h2 : seg <= 8'ha4;   // "2"
4'h3 : seg <= 8'hb0;   // "3"
4'h4 : seg <= 8'h99;   // "4"
4'h5 : seg <= 8'h92;   // "5"
4'h6 : seg <= 8'h82;   // "6"
4'h7 : seg <= 8'hf8;   // "7"
4'h8 : seg <= 8'h80;   // "8"
4'h9 : seg <= 8'h90;   // "9"
4'ha : seg <= 8'h88;   // "a"
4'hb : seg <= 8'h83;   // "b"
4'hc : seg <= 8'hc6;   // "c"
4'hd : seg <= 8'ha1;   // "d"
4'he : seg <= 8'h86;   // "e"
4'hf : seg <= 8'h8e;   // "f"
default : seg <= seg;
endcase
end


initial
begin
display <= 16'd0;
dis_seg <= 4'd0;
bit <= 4'b1110;
end


endmodule



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值