搜索
bottom↓
回复: 18

本人用Verilog写的数码管动态显示测试程序,个人感觉效率极低,不知哪位大虾帮忙看看,可

[复制链接]

出0入0汤圆

发表于 2010-11-4 21:44:04 | 显示全部楼层 |阅读模式
module shumaguan(
                                        rst_n,clk,
                                        SW,sem_cs,sem_db
                                        );
input rst_n,clk;
input[3:0] SW;
output[6:0] sem_cs;
output[7:0] sem_db;
reg[6:0] sem_cs;
reg[7:0] sem_db;

parameter        
                          sem_seg_0 = 8'hc0,     // "0"  
              sem_seg_1 = 8'hf9,     // "1"  
              sem_seg_2 = 8'ha4,     // "2"  
              sem_seg_3 = 8'hb0,     // "3"  
              sem_seg_4 = 8'h99,     // "4"  
              sem_seg_5 = 8'h92,     // "5"  
              sem_seg_6 = 8'h82,     // "6"  
              sem_seg_7 = 8'hf8,     // "7"  
              sem_seg_8 = 8'h80,     // "8"  
              sem_seg_9 = 8'h90,     // "9"  
              sem_seg_a = 8'h88,     // "a"  
              sem_seg_b = 8'h83,     // "b"  
              sem_seg_c = 8'hc6,     // "c"  
              sem_seg_d = 8'ha1,     // "d"  
              sem_seg_e = 8'h86,     // "e"   
              sem_seg_f = 8'h8e;     // "f"  
//reg[11:0] Data;

reg[27:0] count1;
always@(posedge clk or negedge rst_n)  
begin  
     if(!rst_n)
                begin  
                        count1 <= 28'h0000000;
                end  
     else if(count1 == 28'd40000000) count1 <= 28'h0000000;
     else count1 <= count1 + 1'b1;
end

reg[11:0] dis;
always@(posedge clk or negedge rst_n)  
begin
        if(!rst_n) dis <= 4'h0;
        else if(dis == 12'd4000) dis <= 12'h000;
        else if(count1 == 28'd40000000) dis <= dis + 1'b1;
end


reg[3:0] ge,shi,bai,qian;
always@(dis)
begin
       
        ge <= dis[3:0];
        shi <= dis[7:4];
        bai <= dis[11:8];
        qian <= 0;
end

reg[23:0] fresh_cou;
always@(posedge clk or negedge rst_n)
begin
        if(!rst_n) fresh_cou <= 24'h000000;
        else if(fresh_cou == 24'd200000) fresh_cou <= 24'h000000;
        else fresh_cou <= fresh_cou + 1'b1;
end

reg[2:0] fresh_1;
always@(posedge clk or negedge rst_n)
begin
        if(!rst_n) fresh_1 <= 3'd0;
        else if(fresh_1 == 3'd4) fresh_1 <= 3'd0;
        else if(fresh_cou == 24'd200000)fresh_1 <= fresh_1 + 1'b1;
end

reg[3:0] dis_data;
always@(dis)
begin
        case(fresh_1)
                3'b000: begin sem_cs <= 7'b1111110; dis_data <= ge; end
                3'b001: begin sem_cs <= 7'b1111101; dis_data <= shi; end
                3'b010: begin sem_cs <= 7'b1111011; dis_data <= bai; end
                3'b011: begin sem_cs <= 7'b1110111; dis_data <= qian; end
        endcase
        case(dis_data)
        4'h0:        sem_db <= sem_seg_0;
        4'h1:        sem_db <= sem_seg_1;
        4'h2:        sem_db <= sem_seg_2;
        4'h3:        sem_db <= sem_seg_3;
        4'h4:        sem_db <= sem_seg_4;
        4'h5:        sem_db <= sem_seg_5;
        4'h6:        sem_db <= sem_seg_6;
        4'h7:        sem_db <= sem_seg_7;
        4'h8:        sem_db <= sem_seg_8;
        4'h9:        sem_db <= sem_seg_9;
        4'ha:        sem_db <= sem_seg_a;
        4'hb:        sem_db <= sem_seg_b;
        4'hc:        sem_db <= sem_seg_c;
        4'hd:        sem_db <= sem_seg_d;
        4'he:        sem_db <= sem_seg_e;
        4'hf:        sem_db <= sem_seg_f;
        endcase
end

endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-11-4 21:48:59 | 显示全部楼层

逻辑块使用情况,竟然高达64%! (原文件名:1.jpg)

出0入0汤圆

 楼主| 发表于 2010-11-4 21:56:12 | 显示全部楼层
还有就是,不知道用Verilog如何将16进制数转为10进制数啊!

出0入0汤圆

发表于 2010-11-4 22:49:00 | 显示全部楼层
是太大了点
我的占用了大概30%左右

出0入0汤圆

发表于 2010-11-4 22:51:46 | 显示全部楼层
回复【2楼】hdd961140543  
还有就是,不知道用verilog如何将16进制数转为10进制数啊!
-----------------------------------------------------------------------

其实你不用16进制计数就好了
各位分别计数就不用转换进制了,只多几条语句,应该比进制转换更简单

出0入0汤圆

 楼主| 发表于 2010-11-4 23:11:57 | 显示全部楼层
哦,这样啊,多谢了,我试试看

出0入0汤圆

发表于 2010-11-5 09:15:03 | 显示全部楼层
epm240基本做不了多少事。只能用来做点简单的东西。

出0入0汤圆

 楼主| 发表于 2010-11-5 11:26:48 | 显示全部楼层
我是一个初学者,刚开始学Verilog。

出0入0汤圆

发表于 2010-11-5 12:04:58 | 显示全部楼层
如果单纯计数器显示,用BCD计数比较方便,如果其他场合要把BIN转BCD,参考我这贴
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4215535&bbs_page_no=1&search_mode=3&search_text=888888888888&bbs_id=9999

出0入0汤圆

发表于 2010-11-5 21:57:51 | 显示全部楼层
http://blog.ednchina.com/akuei2/1722910/message.aspx
http://cid-c8c65500aea2fb15.office.live.com/self.aspx/Verilog%20HDL%20那些事儿%20(继续未完的故事%20)/第三章1.rar
http://cid-c8c65500aea2fb15.office.live.com/self.aspx/Verilog%20HDL%20那些事儿%20(继续未完的故事%20)/第五章2.rar

出0入0汤圆

发表于 2010-11-6 21:58:11 | 显示全部楼层
用function函数转换啊,输入十进制,对应输出数码管数值
//function : convert number to led-formed data
function[6:0] data_convert;
     input[3:0] data;
     reg[6:0] led;
         case( data )
                                4'd0:           led = ~7'h3f;          //0
                                4'd1:           led = ~7'h06;                 //1
                                4'd2:    led = ~7'h5b;          //2
                                4'd3:    led = ~7'h4f;          //3
                                4'd4:    led = ~7'h66;          //4
                                4'd5:    led = ~7'h6d;          //5
                                4'd6:    led = ~7'h7d;          //6
                                4'd7:    led = ~7'h07;                 //7
                                4'd8:    led = ~7'h7f;                 //8
                                4'd9:    led = ~7'h6f;      //9
                                        default: led = ~7'h00;                  
                    endcase
       data_convert = led;
endfunction

出0入0汤圆

发表于 2010-11-6 21:59:08 | 显示全部楼层
对应返回的就是数码管的数据,每次调用就行了

出0入0汤圆

发表于 2010-11-7 11:12:15 | 显示全部楼层
LZ 居然用拼音 不好不好啊

出0入0汤圆

发表于 2010-11-7 11:26:17 | 显示全部楼层
parameter  
  sem_seg_0 = 8'hc0,     // "0"   
              sem_seg_1 = 8'hf9,     // "1"   
              sem_seg_2 = 8'ha4,     // "2"   
              sem_seg_3 = 8'hb0,     // "3"   
              sem_seg_4 = 8'h99,     // "4"   
              sem_seg_5 = 8'h92,     // "5"   
              sem_seg_6 = 8'h82,     // "6"   
              sem_seg_7 = 8'hf8,     // "7"   
              sem_seg_8 = 8'h80,     // "8"   
              sem_seg_9 = 8'h90,     // "9"   
              sem_seg_a = 8'h88,     // "a"   
              sem_seg_b = 8'h83,     // "b"   
              sem_seg_c = 8'hc6,     // "c"   
              sem_seg_d = 8'ha1,     // "d"   
              sem_seg_e = 8'h86,     // "e"   
              sem_seg_f = 8'h8e;     // "f"  



case(dis_data)
4'h0: sem_db <= sem_seg_0;
4'h1: sem_db <= sem_seg_1;
4'h2: sem_db <= sem_seg_2;
4'h3: sem_db <= sem_seg_3;
4'h4: sem_db <= sem_seg_4;
4'h5: sem_db <= sem_seg_5;
4'h6: sem_db <= sem_seg_6;
4'h7: sem_db <= sem_seg_7;
4'h8: sem_db <= sem_seg_8;
4'h9: sem_db <= sem_seg_9;
4'ha: sem_db <= sem_seg_a;
4'hb: sem_db <= sem_seg_b;
4'hc: sem_db <= sem_seg_c;
4'hd: sem_db <= sem_seg_d;
4'he: sem_db <= sem_seg_e;
4'hf: sem_db <= sem_seg_f;
endcase
end



你这个表会占用一大堆D flip-flop 也就是一大堆 逻辑单元

建议用逻辑门实现BCD到七段的译码 这才是CPLD的长项

出0入0汤圆

 楼主| 发表于 2010-11-9 19:44:13 | 显示全部楼层
回复【13楼】YFM_LMM  
----------------------------------------------------------------------
多谢YFM_LMM的提醒!

出0入0汤圆

 楼主| 发表于 2010-11-9 19:49:35 | 显示全部楼层
回复【10楼】leilei2268967  
//function : convert number to led-formed data
function[6:0] data_convert;
     input[3:0] data;
     reg[6:0] led;
         case( data )
4'd0:           led = ~7'h3f;          //0
4'd1:           led = ~7'h06;          //1
4'd2:    led = ~7'h5b;          //2
4'd3:    led = ~7'h4f;          //3
4'd4:    led = ~7'h66;          //4
4'd5:    led = ~7'h6d;          //5
4'd6:    led = ~7'h7d;          //6
4'd7:    led = ~7'h07;          //7
4'd8:    led = ~7'h7f;          //8
4'd9:    led = ~7'h6f;      //9
default: led = ~7'h00;             
    endcase  
       data_convert = led;
endfunction
-----------------------------------------------------------------------
这种方式很不错啊!

出0入0汤圆

发表于 2011-7-20 15:41:59 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-7-21 21:14:05 | 显示全部楼层
回复【15楼】hdd961140543  阿逸
-----------------------------------------------------------------------

组合逻辑多用阻塞赋值“=”
时序逻辑多用非阻塞赋值“<=”

综合后还是有差异的

出0入0汤圆

发表于 2011-9-29 09:38:28 | 显示全部楼层
看来如何优化也是一种学问
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表