我想编一个数码管动态显示的程序,但是下到板子(epm240t100c5)里一直跑不起来,也不知道是什么问题,求高手指导,谢谢。
module dig_show(clk,rst,csm_1,csm_2,db);
input clk; //时钟(50MHz)
input rst; //复位
output csm_1,csm_2; //数码管的位选
output [7:0] db; //数码管的段选
parameter //数码管显示数字对应的段选
seg0 = 7'h3f,
seg1 = 7'h06,
seg2 = 7'h5b,
seg3 = 7'h4f,
seg4 = 7'h66,
seg5 = 7'h6d,
seg6 = 7'h7d,
seg7 = 7'h07,
seg8 = 7'h7f,
seg9 = 7'h6f,
sega = 7'h77,
segb = 7'h7c,
segc = 7'h39,
segd = 7'h5e,
sege = 7'h79,
segf = 7'h71;
//-------------------------------------------
reg [7:0]flag; //要在两个数码管上显示的数(从0-99),以cnt计数,cnt满后flag加一
always @ (posedge clk or negedge rst)
begin
if(!rst) flag<=0;
else if(cnt==24'hffffff&&flag<=8'd99) flag<=flag+1'b1;
else if(flag>8'd99)flag<=0;
end
wire[3:0] num; //以cnt【23】为标志位,将flag的高四位和低四位分别赋给num
assign num=cnt[23]? flag[7:4]:flag[3:0];
//------------------------------------------------------------
reg[7:0] sm_dbr;
always @(posedge clk)
case (num)
4'h0: sm_dbr <= seg0;
4'h1: sm_dbr <= seg1;
4'h2: sm_dbr <= seg2;
4'h3: sm_dbr <= seg3;
4'h4: sm_dbr <= seg4;
4'h5: sm_dbr <= seg5;
4'h6: sm_dbr <= seg6;
4'h7: sm_dbr <= seg7;
4'h8: sm_dbr <= seg8;
4'h9: sm_dbr <= seg9;
4'ha: sm_dbr <= sega;
4'hb: sm_dbr <= segb;
4'hc: sm_dbr <= segc;
4'hd: sm_dbr <= segd;
4'he: sm_dbr <= sege;
4'hf: sm_dbr <= segf;
default: ;
endcase
assign db=sm_dbr; //把段选址赋给数码管的段选
//-----------------------------------------------
reg [23:0] cnt; //计数器
always @(posedge clk or negedge rst)
if(!rst) cnt<=24'd0;
else cnt<=cnt+1'b1;
assign csm_1=cnt[23]; //以cnt[23]为标志位,分别打开数码管1、2的位选
assign csm_2=~cnt[23];
endmodule
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1. else if(cnt==24'hffffff&&flag<=8'd99) flag<=flag+1'b1; 这句flag后的是<=???
2 assign num=cnt[23]? flag[7:4]:flag[3:0];这句有问题不? 前后位数不一样
3.你可以先让数码管显示一个数,慢慢一步一步来,从简单到复杂,看是哪不有问题
4,一个always里面不要同时有阻塞和非阻塞赋值
5 ,看起来,程序有点乱
跑不起来是什么意思?错误还是没显示?
仔细找了下,你把8段数码管定义成了7位(seg0 = 7'h3f,)但是赋值时赋给了8位(sm_dbr <= seg0)不知道是否是这个原因导致的?
另外就是你的时钟为50M,周期是20ns,每隔2^23个周期会改变一次即1.6秒左右改变一次数码显示。
从功能上讲你的程序实现的是seg0->seg0->seg0->seg1->seg0->seg2->seg0->seg3->......seg1->seg0->seg1->seg1->seg1->seg1->seg2->.....
seg2->seg0->seg2->seg1->seg2->seg2...........segf->seg0->segf->seg1->......反复循环下去
[ 本帖最后由 stepan 于 2011-5-16 11:31 编辑 ]楼上的建议已经很仔细了,LZ可以再找找问题,然后就结果拿出来继续讨论!
一周热门 更多>