3433|4

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急,FPGA编程求助 [复制链接]

我想编一个数码管动态显示的程序,但是下到板子(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

此帖出自FPGA/CPLD论坛

最新回复

闲来无事,分析一下你的程序 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加一 // 意思是20NSX2(23次方)的时间 加一个1always @ (posedge clk or negedge rst)beginif(!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的高四位和低四位分别赋给numassign 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: ;   endcaseassign 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 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)beginif(!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的高四位和低四位分别赋给numassign 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: ;   endcaseassign 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   从程序看,你的程序设计上我没有找到啥问题,我估计是不是你的硬件设计上有问题啊,LZ!                                         EEWORLD  FPGA/CPLD  斑竹阅!  详情 回复 发表于 2011-5-24 09:41
点赞 关注
 

回复
举报

5

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我看后的建议:
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 ,看起来,程序有点乱
此帖出自FPGA/CPLD论坛
 
 

回复

80

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

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

仔细找了下,你把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 编辑 ]
此帖出自FPGA/CPLD论坛
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

4
 

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

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

5
 

闲来无事,分析一下你的程序

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加一

// 意思是20NSX2(23次方)的时间 加一个1
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

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

 

从程序看,你的程序设计上我没有找到啥问题,我估计是不是你的硬件设计上有问题啊,LZ!

                                        EEWORLD  FPGA/CPLD  斑竹阅!

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表