|
本帖最后由 wuyongduoduo 于 2016-8-23 08:52 编辑
今天是进行矩阵键盘计算器的第四天,主要任务是完成数码管自由亮灭控制模块和数码管显示模块,用于实现以下功能:当有数据输入时,若数据为n位,则相应位数上的n个数码管显示数据,其余数码管为灭。这两个模块属于数码管模块,模块名称分别为smg_turnon和smg_display。
一、数码管自由亮灭控制模块
首先进行数码管亮灭控制模块。为了模块比较通用,这里将输入的数据分成了十进制数和十六进制数。若输入为十进制数,则需用昨天的smg_bcd模块将其转换成BCD码,最终smg_turnon模块的输入会是[23:0]bcd_num(十进制转成的BCD码)和[23:0]hex_num(十六进制),输出分别对应[5:0]bcd_tnon和[5:0]hex_tnon,bcd_tnon和hex_tnon的每一位对应一个数码管的亮灭,0亮1灭。
由于BCD码和十六进制都是每四位数据作为一个单位在一个数码管上显示,低位显示在右侧数码管上,高位显示在左侧数码管上。若这一个单位上的数据不为0,则相应数码管应显示该数据,且该数码管右侧的数码管均应亮;否则相应数码管灭。根据以上原理可进行一下算法:
以输入[23:0]bcd_num为例,先设置一个变量[5:0]bcd_code。将bcd_num最低4位相或,若全为0则bcd_code[0]为0,表示该数码管数据为0;只要bcd_num最低4位有一个为1,则bcd_code[0]为1,表示该数码管有非0数据;以此类推,可得到以下程序:
bcd_code[0] <= bcd_num[3]|bcd_num[2]|bcd_num[1]|bcd_num[0]; /***************判断最低位数码管对应数据是否非0***************************/
bcd_code[1] <= bcd_num[7]|bcd_num[6]|bcd_num[5]|bcd_num[4];
bcd_code[2] <= bcd_num[11]|bcd_num[10]|bcd_num[9]|bcd_num[8];
bcd_code[3] <= bcd_num[15]|bcd_num[14]|bcd_num[13]|bcd_num[12];
bcd_code[4] <= bcd_num[19]|bcd_num[18]|bcd_num[17]|bcd_num[16];
bcd_code[5] <= bcd_num[23]|bcd_num[22]|bcd_num[21]|bcd_num[20];/********************判断最高位数码管对应数据是否非0****************************/
这个变量不能直接用于控制数码管的亮灭,应为若处于高位的数码管有非0数据,比它低的所有数码管均应点亮,所以根据bcd_code做以下转换:
casex(bcd_code)
6'b1xxxxx: bcd_turnon <= 6'b000000; /****************若最高位数码管对应数据非0,则全部数码管亮**********************/
6'b01xxxx: bcd_turnon <= 6'b100000;
6'b001xxx: bcd_turnon <= 6'b110000;
6'b0001xx: bcd_turnon <= 6'b111000;
6'b00001x: bcd_turnon <= 6'b111100;
6'b00000x: bcd_turnon <= 6'b111110;/******************最低位数码管一直显示数据**********************/
default:bcd_turnon <= bcd_turnon;
endcase
二、数码管显示模块
数码管显示要受到多种条件的限制,限制条件包括输入的数据类型(十进制还是十六进制,可用dip[6]判断,0表示十进制,1表示十六进制),该位数码管是亮是灭(可用smg_turn模块输出的bcd_turnon和hex_turnon的相应位(1位)表示),是否有小数点(可用dip的相应位(1位)表示),输入的具体数据是什么(可用bcd_num及hex_num的相应位(4位)表示)。设置一个变量[6:0]selcode包含以上条件,根据sel值的不同(即对应不同的数码管)来设置selcode的值,具体如下:
case(sel_r1)
5: selcode <= {dip[6],bcd_turnon[0],dip[0],bcd_num[3:0]};
4: selcode <= {dip[6],bcd_turnon[1],dip[1],bcd_num[7:4]};
3: selcode <= {dip[6],bcd_turnon[2],dip[2],bcd_num[11:8]};
2: selcode <= {dip[6],bcd_turnon[3],dip[3],bcd_num[15:12]};
1: selcode <= {dip[6],bcd_turnon[4],dip[4],bcd_num[19:16]};
0: selcode <= {dip[6],bcd_turnon[5],dip[5],bcd_num[23:20]};
default: selcode <= selcode;
endcase
需注意的是sel为0时表示最左边数码管,sel为5时表示最右边数码管。数据的最低位应显示在最右边数码管,即对应sel为5;数据最高位应显示在最左边数码管,即对应sel为0,所以以上语句的sel值是从5→0排列的。
设置好[6:0]selcode后只需将对应的seg值译码即可:
casex(selcode)
/****the style of the input number is dec,the nixie tube is turned on and have no decamal point**/
7'b0010000: seg <= 8'hC0;//0
7'b0010001: seg <= 8'hF9;//1
7'b0010010: seg <= 8'hA4;//2
7'b0010011: seg <= 8'hB0;//3
7'b0010100: seg <= 8'h99;//4
7'b0010101: seg <= 8'h92;//5
7'b0010110: seg <= 8'h82;//6
7'b0010111: seg <= 8'hF8;//7
7'b0011000: seg <= 8'h80;//8
7'b0011001: seg <= 8'h90;//9
/****the style of the input number is dec,the nixie tube is turned on and have decamal point**/
7'b0000000: seg <= 8'hC0^8'h80;//0.
7'b0000001: seg <= 8'hF9^8'h80;//1.
7'b0000010: seg <= 8'hA4^8'h80;//2.
7'b0000011: seg <= 8'hB0^8'h80;//3.
7'b0000100: seg <= 8'h99^8'h80;//4.
7'b0000101: seg <= 8'h92^8'h80;//5.
7'b0000110: seg <= 8'h82^8'h80;//6.
7'b0000111: seg <= 8'hF8^8'h80;//7.
7'b0001000: seg <= 8'h80^8'h80;//8.
7'b0001001: seg <= 8'h90^8'h80;//9.
/****the style of the input number is dec,the nixie tube is turned on and have no decamal point**/
7'b1010000: seg <= 8'hC0;//0
7'b1010001: seg <= 8'hF9;//1
7'b1010010: seg <= 8'hA4;//2
7'b1010011: seg <= 8'hB0;//3
7'b1010100: seg <= 8'h99;//4
7'b1010101: seg <= 8'h92;//5
7'b1010110: seg <= 8'h82;//6
7'b1010111: seg <= 8'hF8;//7
7'b1011000: seg <= 8'h80;//8
7'b1011001: seg <= 8'h90;//9
7'b1011010: seg <= 8'h88;//A
7'b1011011: seg <= 8'h83;//B
7'b1011100: seg <= 8'hC6;//C
7'b1011101: seg <= 8'hA1;//D
7'b1011110: seg <= 8'h86;//E
7'b1011111: seg <= 8'h8E;//F
/****the style of the input number is dec,the nixie tube is turned on and have decamal point**/
7'b1000000: seg <= 8'hC0^8'h80;//0.
7'b1000001: seg <= 8'hF9^8'h80;//1.
7'b1000010: seg <= 8'hA4^8'h80;//2.
7'b1000011: seg <= 8'hB0^8'h80;//3.
7'b1000100: seg <= 8'h99^8'h80;//4.
7'b1000101: seg <= 8'h92^8'h80;//5.
7'b1000110: seg <= 8'h82^8'h80;//6.
7'b1000111: seg <= 8'hF8^8'h80;//7.
7'b1001000: seg <= 8'h80^8'h80;//8.
7'b1001001: seg <= 8'h90^8'h80;//9.
7'b1001010: seg <= 8'h88^8'h80;//A.
7'b1001011: seg <= 8'h83^8'h80;//B.
7'b1001100: seg <= 8'hC6^8'h80;//C.
7'b1001101: seg <= 8'hA1^8'h80;//D.
7'b1001110: seg <= 8'h86^8'h80;//E.
7'b1001111: seg <= 8'h8E^8'h80;//F.
default:seg <= 8'hff;
endcase |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册
x
|