吴忠躺衫网络科技有限公司

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

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

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

用FPGA設(shè)計計算器

電子工程師 ? 來源:未知 ? 作者:工程師李察 ? 2018-09-15 08:48 ? 次閱讀

設(shè)計背景:

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

設(shè)計原理:

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

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

這樣來完成我們此次的設(shè)計。

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

用FPGA設(shè)計計算器

設(shè)計代碼:

頂層模塊

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

1 inputclk; //時鐘

2 inputrst_n; //復(fù)位

3 input[3:0]row; //行信號

4

5 output[3:0]col; //列信號

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

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

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è)計模塊

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

1 inputclk; //時鐘 50M

2 inputrst_n; //復(fù)位

3 input[3:0]row; //輸入行信號

4

5 outputreg[3:0]col; //輸出列信號

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;//按鍵消抖時間

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

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; //計數(shù)到了就給一個高脈沖,反之低脈沖

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) //如果沒有按下

58 begin

59 data_flag <=1'b0;

60 col <=4'b0000;

61 end

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

63 begin

64 data_flag <=1'b0;

65 state <=?s1;

66 end

67 end

68 s1:begin

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

70 begin

71 cnt <=19'b0;

72 state <=?s0;

73 end

74 else

75 begin

76 if(cnt

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)下一個狀態(tài)

92 row_col <={row,col}; //拼接行和列信號

93 end

94 else //行信號不導(dǎo)通,開始進(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; //表示一次成功的按鍵,輸出一個高脈沖

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 //計算模塊的表示

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

154 reg[23:0]num1,num2,data_in,data_t; //信號變量

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//否則無效信號

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碼顯示到對應(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

測試模塊

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

仿真圖:

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

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

    關(guān)注

    1630

    文章

    21796

    瀏覽量

    605987
  • 數(shù)碼管
    +關(guān)注

    關(guān)注

    32

    文章

    1887

    瀏覽量

    91402
  • 計算器
    +關(guān)注

    關(guān)注

    16

    文章

    438

    瀏覽量

    37469

原文標(biāo)題:FPGA學(xué)習(xí)系列:29. 計算器的設(shè)計

文章出處:【微信號:FPGAer_Club,微信公眾號:FPGAer俱樂部】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FPGA設(shè)計的計算器

    FPGA模擬設(shè)計的計算器
    發(fā)表于 05-04 20:27

    至芯科技昭哥帶你學(xué)FPGAFPGA_100天之旅_計算器設(shè)計

    本文屬于本人原創(chuàng),和大家一起學(xué)習(xí)FPGA,交流FPGA,希望大家多多支持。來源:至芯科技昭哥帶你學(xué)FPGAFPGA_100天之旅_計算器設(shè)
    發(fā)表于 10-18 11:25

    FPGA模擬設(shè)計的計算器

    計算器代碼不能實現(xiàn)一個功能: 3和7是不能同時按的, 也就是不能夠?qū)崿F(xiàn)3+7和3-7等功能 可以自己試試看吧。。。 全部資料下載: fpga計算器.rar
    發(fā)表于 07-03 13:16

    實用的電工計算器

    精典收集整理發(fā)布。這個是手機(jī)上的。“電工計算器”是電氣行業(yè)中最好的應(yīng)用程序,內(nèi)置多種計算功能,幫助您完成工作。您的智能手機(jī)里不能沒有它!主要計算:線芯截面積
    發(fā)表于 09-02 06:18

    如何實現(xiàn)基于FPGA的電子計算器設(shè)計

    今天給大俠帶來基于FPGA的電子計算器設(shè)計,由于篇幅較長,分三篇。今天帶來第二篇,中篇,話不多說,上貨。導(dǎo)讀本篇介紹了一個簡單計算器的設(shè)計,基于 FPGA 硬件描述語言 Verilog
    發(fā)表于 11-11 08:31

    衰減設(shè)計計算器

    衰減設(shè)計計算器起非常方便。 是個好東西哦。
    發(fā)表于 06-05 15:22 ?186次下載

    感抗與容抗計算器

    感抗與容抗計算器 感抗與容抗計算器
    發(fā)表于 06-05 15:11 ?1.4w次閱讀
    感抗與容抗<b class='flag-5'>計算器</b>

    袖珍計算器改裝流量計

    袖珍計算器改裝流量計
    發(fā)表于 04-20 11:38 ?631次閱讀
    <b class='flag-5'>用</b>袖珍<b class='flag-5'>計算器</b>改裝流量計

    c51簡易計算器

    c51簡易計算器 c51簡易計算器c51簡易計算器c51簡易計算器c51簡易計算器c51簡易計算器
    發(fā)表于 11-12 17:04 ?105次下載

    基于FPGA計算器設(shè)計(源碼)

    這是一個基于FPGA設(shè)計的四則運(yùn)算簡易計算器。可以實現(xiàn)定點小數(shù)運(yùn)算和負(fù)數(shù)運(yùn)算。
    發(fā)表于 08-23 16:23 ?31次下載

    科學(xué)計算器開根號怎么按_科學(xué)計算器怎么關(guān)機(jī)

    以下為卡西歐科學(xué)計算器求100的平方根的過程。
    發(fā)表于 05-21 14:32 ?4.5w次閱讀

    基于FPGA的電子計算器設(shè)計(中)

    今天給大俠帶來基于FPGA的電子計算器設(shè)計,由于篇幅較長,分三篇。今天帶來第二篇,中篇,話不多說,上貨。導(dǎo)讀本篇介紹了一個簡單計算器的設(shè)計,基于 FPGA 硬件描述語言 Verilog
    發(fā)表于 11-06 17:36 ?17次下載
    基于<b class='flag-5'>FPGA</b>的電子<b class='flag-5'>計算器</b>設(shè)計(中)

    基于FPGA的電子計算器設(shè)計

    在國外,電子計算器在集成電路發(fā)明后,只用短短幾年時間就完成了技術(shù)飛躍,經(jīng)過激烈的市場競爭,現(xiàn)在的計算器技術(shù)己經(jīng)相當(dāng)成熟。
    的頭像 發(fā)表于 02-13 09:11 ?5569次閱讀

    基于FPGA的披薩切片角度計算器

    電子發(fā)燒友網(wǎng)站提供《基于FPGA的披薩切片角度計算器.zip》資料免費下載
    發(fā)表于 06-16 11:47 ?0次下載
    基于<b class='flag-5'>FPGA</b>的披薩切片角度<b class='flag-5'>計算器</b>

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

    本文通過FPGA實現(xiàn)8位十進(jìn)制數(shù)的加、減、乘、除運(yùn)算,通過矩陣鍵盤輸入數(shù)據(jù)和運(yùn)算符,矩陣鍵盤的布局圖如下所示。該計算器可以進(jìn)行連續(xù)運(yùn)算,當(dāng)按下等號后,可以直接按數(shù)字進(jìn)行下次運(yùn)算,或者按運(yùn)算符,把上次運(yùn)算結(jié)果作為本次運(yùn)算的第一個操作數(shù)。
    的頭像 發(fā)表于 10-24 14:28 ?728次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>計算器</b>設(shè)計
    盐山县| 恩施市| 沙龙百家乐娱乐网| 澳门百家乐官网官网网站| 赌博运气| 百家乐投资| 真人百家乐软件博彩吧| 百家乐官网出千工具价格| 玛纳斯县| 全讯网一码353788| 滨海湾百家乐娱乐城| 狮威百家乐官网娱乐网| 平舆县| 大发888游戏平台403| 新百家乐.百万筹码| 扑克百家乐官网麻将筹码防伪| 百家乐官网概率下注法| 六合彩开奖| 百家乐斗牛稳赚| 百家乐官网赌博现金网平台排名 | 大赢家百家乐的玩法技巧和规则 | 做生意属虎的朝向| 百家乐官网赌博娱乐城| 百家乐官网玩法百科| 大发888 zhldu| 百家乐澳门百家乐澳门赌场| 明珠百家乐官网的玩法技巧和规则| 至尊百家乐官网qvod| 来凤县| 博e百| 大发888娱乐城m88| 至尊百家乐| 如何玩百家乐官网赚钱| 百家乐官网长龙太阳城| 北京市| 太阳城百家乐| 六合彩开| 真钱的棋牌游戏| 大发888提款怎么提| 菲彩百家乐的玩法技巧和规则| 百家乐技巧公司|