急,FPGA编程求助

2019-03-25 10:21发布

我想编一个数码管动态显示的程序,但是下到板子(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 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
小草风清扬
1楼-- · 2019-03-25 21:58
< / 我看后的建议:
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 ,看起来,程序有点乱
stepan
2楼-- · 2019-03-25 22:05

跑不起来是什么意思?错误还是没显示?

仔细找了下,你把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 编辑 ]
eeleader
3楼-- · 2019-03-26 03:54

楼上的建议已经很仔细了,LZ可以再找找问题,然后就结果拿出来继续讨论!

eeleader
4楼-- · 2019-03-26 07:53
 精彩回答 2  元偷偷看……

一周热门 更多>