0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA學(xué)習(xí)系列:26. 計(jì)算器的設(shè)計(jì)

FPGA學(xué)習(xí)交流 ? 2018-08-13 13:45 ? 次閱讀

設(shè)計(jì)背景:

計(jì)算器是設(shè)計(jì)中經(jīng)常用到的一個(gè)操作軟件,設(shè)計(jì)和學(xué)習(xí)計(jì)算器使我們親密的聯(lián)系所學(xué)的各模塊, 對(duì)我們的學(xué)習(xí)有很大的幫助和提升。希望大家來(lái)學(xué)習(xí)

設(shè)計(jì)原理:

本次的設(shè)計(jì)主要通過(guò)矩陣鍵盤來(lái)實(shí)現(xiàn)按鍵的加減乘除運(yùn)算,通過(guò)按下有效鍵值來(lái)當(dāng)被加數(shù)或者被除數(shù)等等,按下10 -- 13等數(shù)字來(lái)表示對(duì)應(yīng)的運(yùn)算符。按鍵鍵值15表示等于號(hào)。

此次的設(shè)計(jì)是通過(guò)數(shù)碼管來(lái)實(shí)現(xiàn)顯示的,通過(guò)按下對(duì)應(yīng)的按鍵來(lái)顯示到數(shù)碼管上,百位十位個(gè)位等等。當(dāng)按下運(yùn)算算符的時(shí)候顯示清0不顯示東西,之后通過(guò)繼續(xù)按下別的鍵值來(lái)顯示出對(duì)應(yīng)的加數(shù)和除數(shù)等等,之后通過(guò)按下對(duì)應(yīng)的鍵值15表示等于后,然后數(shù)碼管清0之后立馬顯示出對(duì)應(yīng)的等于的數(shù)。

這樣來(lái)完成我們此次的設(shè)計(jì)。

設(shè)計(jì)架構(gòu)圖:

image.png

設(shè)計(jì)代碼:

頂層模塊

0modulecalc(clk,rst_n,row,col,sel,seg7); //端口列表

1 inputclk; //時(shí)鐘

2 inputrst_n; //復(fù)位

3 input[3:0]row; //信號(hào)

4

5 output[3:0]col; //列信號(hào)

6 output[2:0]sel; //數(shù)碼管位選信號(hào)

7 output[7:0]seg7; //數(shù)碼管段選信號(hào)

8

9 wire[23:0]data;

10

11 //例化數(shù)碼管模,和矩陣鍵盤模塊

12 key_borad key_borad_dut(

13 .clk(clk),

14 .rst_n(rst_n),

15 .row(row),

16 .col(col),

17 .data(data)

18 );

19 seg seg_dut(

20 .clk(clk),

21 .rst_n(rst_n),

22 .sel(sel),

23 .seg7(seg7),

24 .data_in(data)

25 );

26

27endmodule

設(shè)計(jì)模塊

0modulekey_borad(clk,rst_n,row,col,data);

1 inputclk; //時(shí)鐘 50M

2 inputrst_n; //復(fù)位

3 input[3:0]row; //輸入行信號(hào)

4

5 outputreg[3:0]col; //輸出列信號(hào)

6 outputreg[23:0]data;

7

8 //狀態(tài)變量,表示

9 parameters0 =3'b00;

10 parameters1 =3'b01;

11 parameters2 =3'b10;

12 parameters3 =3'b11;

13 parameters4 =3'b100;

14 parameters5 =3'b101;

15

16 parameterT1ms =50000;//掃描間隔

17 //parameter T1ms = 2;

18 parameterT10ms=500_000;//按鍵消抖時(shí)間

19 //parameter T10ms = 20;

20

21 wireflag;

22 reg[15:0]count;

23 always@(posedgeclk ornegedgerst_n)

24 if(!rst_n)

25 begin

26 count <=16'd0;

27 end

28 else

29 begin

30 if(count <T1ms -1) //計(jì)數(shù)1K的頻率時(shí)間

31 count <=count +1'b1;

32 else

33 begin

34 count <=16'b0;

35 end

36 end

37

38 assignflag =(count ==T1ms -1)?1'b1:1'b0; //計(jì)數(shù)到了就給一個(gè)高脈沖,反之低脈沖

39

40 reg[2:0]state;

41 reg[7:0]row_col;

42 reg[18:0]cnt;

43 regdata_flag;

44 always@(posedgeclk ornegedgerst_n)

45 if(!rst_n)

46 begin

47 state <=3'b0;

48 row_col <=8'b1111_1111;

49 data_flag <=1'b0;

50 col <=4'b0000;

51 cnt <=19'b0;

52 end

53 else

54 begin

55 case(state)

56 s0:begin

57 if(row ==4'b1111) //如果沒(méi)有按下

58 begin

59 data_flag <=1'b0;

60 col <=4'b0000;

61 end

62 else //表示按下,跳轉(zhuǎn)下一個(gè)狀態(tài)

63 begin

64 data_flag <=1'b0;

65 state <=s1;

66 end

67 end

68 s1:begin

69 if(row ==4'b1111) //如果是抖動(dòng)跳轉(zhuǎn)0狀態(tài)

70 begin

71 cnt <=19'b0;

72 state <=s0;

73 end

74 else

75 begin

76 if(cnt <T10ms -1) //計(jì)數(shù)相應(yīng)的時(shí)間,消抖處理

77 begin

78 cnt <=cnt +1'b1;

79 end

80 else

81 begin

82 cnt <=19'b0;

83 state <=s2;

84 col <=4'b0111;//消抖完表示按鍵有效

85 end

86 end

87 end

88 s2:begin

89 if(row !=4'b1111) //表示導(dǎo)通

90 begin

91 state <=s3; //導(dǎo)通后跳轉(zhuǎn)下一個(gè)狀態(tài)

92 row_col <={row,col}; //拼接行和列信號(hào)

93 end

94 else //行信號(hào)不導(dǎo)通,開(kāi)始進(jìn)行列掃描

95 begin

96 if(flag)

97 begin

98 col <={col[2:0],col[3]}; //1ms進(jìn)行一次列掃描

99 end

100 else

101 begin

102 col <=col;

103 end

104 end

105 end

106 s3:begin

107 if(row ==4'b1111) //按鍵抬起

108 begin

109 state <=s0;

110 data_flag <=1'b1; //表示一次成功的按鍵,輸出一個(gè)高脈沖

111 end

112 else

113 begin

114 state <=s3;

115 end

116 end

117 default:state <=s0;

118 endcase

119 end

120

121 reg[3:0]key_num;

122 //鍵值的翻譯模塊的表示

123 always@(posedgeclk ornegedgerst_n)

124 if(!rst_n)

125 key_num =4'd0;

126 else

127 case({row_col})

128 8'b0111_0111:key_num =4'hf;

129 8'b0111_1011:key_num =4'he;

130 8'b0111_1101:key_num =4'hd;

131 8'b0111_1110:key_num =4'hc;

132

133 8'b1011_0111:key_num =4'hb;

134 8'b1011_1011:key_num =4'ha;

135 8'b1011_1101:key_num =4'h9;

136 8'b1011_1110:key_num =4'h8;

137

138 8'b1101_0111:key_num =4'h7;

139 8'b1101_1011:key_num =4'h6;

140 8'b1101_1101:key_num =4'h5;

141 8'b1101_1110:key_num =4'h4;

142

143 8'b1110_0111:key_num =4'h3;

144 8'b1110_1011:key_num =4'h2;

145 8'b1110_1101:key_num =4'h1;

146 8'b1110_1110:key_num =4'h0;

147 default:;

148 endcase

149

150

151

152 //計(jì)算模塊的表示

153 reg[2:0]state_s;//狀態(tài)變量

154 reg[23:0]num1,num2,data_in,data_t; //信號(hào)變量

155 reg[3:0]flag_s;//運(yùn)算符

156 always@(posedgeclk ornegedgerst_n)

157 begin

158 if(!rst_n)

159 begin

160 data <=24'b0;

161 state_s <=s0;

162 num1 <=24'b0;

163 num2 <=24'b0;

164 data_t <=24'b0;

165 flag_s <=4'b0;

166 data_in <=24'b0;

167 end

168 else

169 begin

170 case(state_s)

171 s0:begin

172 if(data_flag) //如果有一次按下

173 begin

174 if(key_num <4'd9)//鍵值小于9便是有效

175 begin

176 num1 <=num1*10+key_num;//BCD碼轉(zhuǎn)為2進(jìn)制

177 data <={data[19:0],key_num};//數(shù)碼管移位

178 end

179 if(key_num >4'd9&&key_num <4'd14)//10 -- 13 表示運(yùn)算符

180 begin

181 data <=24'b0;

182 state_s <=s1;

183 flag_s <=key_num;

184 end

185 else//否則無(wú)效信號(hào)

186 state_s <=s0;

187 end

188 end

189 s1:begin

190 if(data_flag)//如果有一次按下

191 begin

192 if(key_num <4'd9)//鍵值小于9便是有效

193 begin

194 num2 <=10*num2 +key_num;//BCD碼轉(zhuǎn)為2進(jìn)制

195 data <={data[19:0],key_num};//數(shù)碼管移位

196 end

197 if(key_num >4'd9&&key_num <4'd14)//10 -- 13 表示運(yùn)算符

198 begin

199 state_s <=s1;

200 end

201 if(key_num ==15)//表示等于

202 begin

203 state_s <=s2;

204 end

205 end

206 end

207 s2:begin

208 state_s <=s3;

209 case(flag_s)

210

211 4'd10:begin//加運(yùn)算

212 data_in <=num1 +num2;

213 state_s <=s3;

214 end

215

216 4'd13:begin//乘運(yùn)算

217 data_in <=num1 *num2;

218 state_s <=s3;

219 end

220 endcase

221 end

222 s3:begin//二進(jìn)制轉(zhuǎn)為BCD碼顯示到對(duì)應(yīng)的數(shù)碼管上

223 data[3:0]=data_in %10;

224 data[7:4]=data_in /10%10;

225 data[11:8]=data_in /100%10;

226 data[15:12]=data_in /1000%10;

227 data[19:16]=data_in /10000%10;

228 data[23:20]=data_in /100000;

229 state_s <=s0;

230 data_in <=24'b0;

231 end

232 default:state_s <=s0;

233 endcase

234 end

235 end

236

237

258endmodule

測(cè)試模塊

0`timescale1ns/1ps

1

2modulecalc_tb();

3 regclk;

4 regrst_n;

5 reg[4:0]pressnum;

6 wire[3:0]row;

7

8 wire[3:0]col;

9 wire[3:0]key_num;

10

11 initialbegin

12 clk =1'b1;

13 rst_n =1'b0;

14 pressnum =5'd16;

15

16 #200.1

17 rst_n =1'b1;

18 #2000

19 pressnum =5'd16;

20

21 #1000

22 pressnum =5'd5;

23

24 #1000

25 pressnum =5'd16;

26

27 #1250

28 pressnum =5'd11;

29 #1250

30 pressnum =5'd16;

31 #1250

32 pressnum =5'd2;

33 #1250

34 pressnum =5'd16;

35 #1250

36 pressnum =5'd15;

37 #1250

38 pressnum =5'd16;

39 #2000

40 #2000

41 $stop;

42

43 end

44 always#10clk =~clk;

45

46 calc calc_dut(

47 .clk(clk),

48 .rst_n(rst_n),

49 .row(row),

50 .col(col),

51 .sel(sel),

52 .seg7(seg7)

53 );

54 yingjian yingjian_dut(

55 .clk(clk),

56 .rst_n(rst_n),

57 .col(col),

58 .row(row),

59 .pressnum(pressnum)

60 );

61endmodule

仿真:


從仿真圖中可以看出,在放著中我們?cè)O(shè)置的是先按下5,再10,之后2,然后按下等于15.通過(guò)觀察仿真正確,之后由于設(shè)計(jì)中我們10是表示加法,那么5 + 2 = 7 :結(jié)果顯示正確。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21796

    瀏覽量

    605998
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    VirtualLab Fusion應(yīng)用:相干時(shí)間和相干長(zhǎng)度計(jì)算器

    摘要 在本用例中,我們介紹了一種計(jì)算器,它可以根據(jù)給定光源的波譜信息快速估計(jì)其時(shí)間相干特性。然后,可以將該計(jì)算器的結(jié)果自動(dòng)復(fù)制到通用探測(cè)中,以便在考慮時(shí)間相干性時(shí)應(yīng)用近似方法,而無(wú)需對(duì)光源的波長(zhǎng)
    發(fā)表于 12-27 08:48

    Debye-Wolf積分計(jì)算器的用法

    即可進(jìn)行計(jì)算。 該案例將說(shuō)明如何在VirtualLab中使用Debye-Wolf積分計(jì)算器。 **建模任務(wù) ** 開(kāi)啟Debye-Wolf積分計(jì)算器 ?我們直接單擊計(jì)算器,然后選擇D
    發(fā)表于 12-26 08:59

    LP光纖模式計(jì)算器

    摘要 ** 光纖模式計(jì)算器可用于計(jì)算在圓柱對(duì)稱光纖中傳播的線偏振 (LP) 模式,可以是單芯的階躍折射率,也可以是無(wú)限拋物線剖面的漸變折射率。 描述這些模式的相應(yīng)多項(xiàng)式是用于階梯折射率光纖
    發(fā)表于 12-18 13:36

    使用DRV421進(jìn)行設(shè)計(jì):系統(tǒng)參數(shù)計(jì)算器

    電子發(fā)燒友網(wǎng)站提供《使用DRV421進(jìn)行設(shè)計(jì):系統(tǒng)參數(shù)計(jì)算器.pdf》資料免費(fèi)下載
    發(fā)表于 10-26 09:52 ?0次下載
    使用DRV421進(jìn)行設(shè)計(jì):系統(tǒng)參數(shù)<b class='flag-5'>計(jì)算器</b>

    FPGA加速深度學(xué)習(xí)模型的案例

    FPGA(現(xiàn)場(chǎng)可編程門陣列)加速深度學(xué)習(xí)模型是當(dāng)前硬件加速領(lǐng)域的一個(gè)熱門研究方向。以下是一些FPGA加速深度學(xué)習(xí)模型的案例: 一、基于FPGA
    的頭像 發(fā)表于 10-25 09:22 ?354次閱讀

    基于FPGA計(jì)算器設(shè)計(jì)

    本文通過(guò)FPGA實(shí)現(xiàn)8位十進(jìn)制數(shù)的加、減、乘、除運(yùn)算,通過(guò)矩陣鍵盤輸入數(shù)據(jù)和運(yùn)算符,矩陣鍵盤的布局圖如下所示。該計(jì)算器可以進(jìn)行連續(xù)運(yùn)算,當(dāng)按下等號(hào)后,可以直接按數(shù)字進(jìn)行下次運(yùn)算,或者按運(yùn)算符,把上次運(yùn)算結(jié)果作為本次運(yùn)算的第一個(gè)操作數(shù)。
    的頭像 發(fā)表于 10-24 14:28 ?731次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>計(jì)算器</b>設(shè)計(jì)

    CAN位時(shí)序參數(shù)計(jì)算器

    電子發(fā)燒友網(wǎng)站提供《CAN位時(shí)序參數(shù)計(jì)算器.pdf》資料免費(fèi)下載
    發(fā)表于 10-11 09:55 ?1次下載
    CAN位時(shí)序參數(shù)<b class='flag-5'>計(jì)算器</b>

    色環(huán)電阻計(jì)算器的研究與應(yīng)用

    一個(gè)理想的色環(huán)電阻計(jì)算器的界面應(yīng)該包含一個(gè)顏色選擇,讓用戶能夠通過(guò)點(diǎn)擊或下拉菜單選擇各個(gè)顏色環(huán)。而在程序邏輯層面,計(jì)算器需要具備實(shí)時(shí)反饋功能,用戶選擇顏色環(huán)后,系統(tǒng)能夠立即計(jì)算出電阻
    的頭像 發(fā)表于 09-18 13:45 ?434次閱讀

    OC5138資料(DEMO&amp;參數(shù)計(jì)算器

    電子發(fā)燒友網(wǎng)站提供《OC5138資料(DEMO&參數(shù)計(jì)算器).zip》資料免費(fèi)下載
    發(fā)表于 07-20 09:32 ?2次下載

    平平無(wú)奇計(jì)算器:520能對(duì)你說(shuō)多少次?

    5月是一個(gè)愛(ài)人愛(ài)己愛(ài)勞動(dòng)的月份剛剛過(guò)去的5月20日小滿遇見(jiàn)520,人生小滿勝萬(wàn)全情侶們說(shuō)“愛(ài)意恰逢其時(shí)”計(jì)算器對(duì)小白說(shuō)“520”……噠噠噠本期測(cè)評(píng)產(chǎn)品為:簡(jiǎn)易計(jì)算器聽(tīng)計(jì)算器對(duì)我說(shuō)無(wú)數(shù)次520(bushi本次測(cè)評(píng)數(shù)據(jù)已上傳
    的頭像 發(fā)表于 05-25 08:04 ?793次閱讀
    平平無(wú)奇<b class='flag-5'>計(jì)算器</b>:520能對(duì)你說(shuō)多少次?

    HarmonyOS開(kāi)發(fā)案例:【計(jì)算器

    基于基礎(chǔ)組件、容器組件,實(shí)現(xiàn)一個(gè)支持加減乘除混合運(yùn)算的計(jì)算器。
    的頭像 發(fā)表于 05-07 15:31 ?1448次閱讀
    HarmonyOS開(kāi)發(fā)案例:【<b class='flag-5'>計(jì)算器</b>】

    蘋果將為iPad推出原生計(jì)算器應(yīng)用

    早前,IT之家曾披露,此次蘋果還計(jì)劃對(duì)macOS系統(tǒng)內(nèi)的計(jì)算器應(yīng)用進(jìn)行功能升級(jí),這是該軟件近10年來(lái)的首次重大設(shè)計(jì)變革。據(jù)悉,蘋果正在內(nèi)部測(cè)試一款名為“GreyParrot”的全新計(jì)算器應(yīng)用。
    的頭像 發(fā)表于 04-24 14:10 ?502次閱讀

    OpenHarmony開(kāi)發(fā)案例:【分布式計(jì)算器

    使用分布式能力實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的計(jì)算器應(yīng)用,可以進(jìn)行簡(jiǎn)單的數(shù)值計(jì)算,支持遠(yuǎn)程拉起另一個(gè)設(shè)備的計(jì)算器應(yīng)用,兩個(gè)計(jì)算器應(yīng)用進(jìn)行協(xié)同計(jì)算
    的頭像 發(fā)表于 04-11 15:24 ?1117次閱讀
    OpenHarmony開(kāi)發(fā)案例:【分布式<b class='flag-5'>計(jì)算器</b>】

    AWTK 開(kāi)源串口屏開(kāi)發(fā)(13) - 計(jì)算器應(yīng)用

    計(jì)算器是一個(gè)常見(jiàn)的應(yīng)用程序,在AWTK串口屏中,利用fscript表達(dá)式計(jì)算函數(shù),無(wú)需編寫一行傳統(tǒng)的代碼,即可實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器應(yīng)用程序。1.功能計(jì)算器是一個(gè)很常見(jiàn)的應(yīng)用,比如在電子
    的頭像 發(fā)表于 03-16 08:23 ?6485次閱讀
    AWTK 開(kāi)源串口屏開(kāi)發(fā)(13) - <b class='flag-5'>計(jì)算器</b>應(yīng)用

    fpga學(xué)習(xí)需要具備哪些課程

    FPGA(Field Programmable Gate Array)學(xué)習(xí)需要具備一系列的課程知識(shí)和實(shí)踐技能
    的頭像 發(fā)表于 03-14 15:51 ?1306次閱讀