hdd961140543 发表于 2010-11-4 21:44:04

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

module shumaguan(
                                        rst_n,clk,
                                        SW,sem_cs,sem_db
                                        );
input rst_n,clk;
input SW;
output sem_cs;
output sem_db;
reg sem_cs;
reg 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 Data;

reg 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 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 ge,shi,bai,qian;
always@(dis)
begin
       
        ge <= dis;
        shi <= dis;
        bai <= dis;
        qian <= 0;
end

reg 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 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 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

hdd961140543 发表于 2010-11-4 21:48:59

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_595355HV8HD2.jpg
逻辑块使用情况,竟然高达64%! (原文件名:1.jpg)

hdd961140543 发表于 2010-11-4 21:56:12

还有就是,不知道用Verilog如何将16进制数转为10进制数啊!

Jigsaw 发表于 2010-11-4 22:49:00

是太大了点
我的占用了大概30%左右

Jigsaw 发表于 2010-11-4 22:51:46

回复【2楼】hdd961140543
还有就是,不知道用verilog如何将16进制数转为10进制数啊!
-----------------------------------------------------------------------

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

hdd961140543 发表于 2010-11-4 23:11:57

哦,这样啊,多谢了,我试试看

jianchangd 发表于 2010-11-5 09:15:03

epm240基本做不了多少事。只能用来做点简单的东西。

hdd961140543 发表于 2010-11-5 11:26:48

我是一个初学者,刚开始学Verilog。

NJ8888 发表于 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

akuei2 发表于 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

leilei2268967 发表于 2010-11-6 21:58:11

用function函数转换啊,输入十进制,对应输出数码管数值
//function : convert number to led-formed data
function data_convert;
   input data;
   reg 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

leilei2268967 发表于 2010-11-6 21:59:08

对应返回的就是数码管的数据,每次调用就行了

YFM_LMM 发表于 2010-11-7 11:12:15

LZ 居然用拼音 不好不好啊

YFM_LMM 发表于 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的长项

hdd961140543 发表于 2010-11-9 19:44:13

回复【13楼】YFM_LMM
----------------------------------------------------------------------
多谢YFM_LMM的提醒!

hdd961140543 发表于 2010-11-9 19:49:35

回复【10楼】leilei2268967
//function : convert number to led-formed data
function data_convert;
   input data;
   reg 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
-----------------------------------------------------------------------
这种方式很不错啊!

anxiangbo 发表于 2011-7-20 15:41:59

记号

Jigsaw 发表于 2011-7-21 21:14:05

回复【15楼】hdd961140543阿逸
-----------------------------------------------------------------------

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

综合后还是有差异的

yyxiaoshu 发表于 2011-9-29 09:38:28

看来如何优化也是一种学问
页: [1]
查看完整版本: 本人用Verilog写的数码管动态显示测试程序,个人感觉效率极低,不知哪位大虾帮忙看看,可