本帖最后由 西疆木 于 2016-8-29 10:09 编辑
六位十进制数四则运算计算器(1)整体结构及其设计思路
雾盈 2016-8-26
一、写在之前
上周做的是一个小项目—计算器。
从这篇文章开始,陆续的,我会将计算器设计的各个模块分篇写出来。
今天的这篇文章先谈一下整体结构和设计思路。
二、功能实现
1.六位十进制数的加减乘除四则运算。
2.按键输入操作数时,数码管移位显示。
3.数码管显示消零,控制数码管亮灭,对于无意义的零予以不显示。
4.运用小算法进行加减乘除运算,大量节省了 FPGA内部硬件资源的消耗。
三、设计思路成形步骤
1.拿出一张纸,将自己想要实现的功能分点全部写出来。
我自己写的就是上面二里的功能。
2.对照着各个目标功能,联想其可能用到的逻辑设计想法。
例如,我想实现按键输入时,让数码管移位显示并参与计算,这个功能。我就联想到:必须有一个移位设计,而移位后这个数是BCD码,想让它参与计算,就还必须有BCD转二进制设计,计算完之后,还能让它显出在数码管上,那还得有一个二进制转BCD设计。
就这样,一个功能实现的思路就有了。
3.将单个目标功能和其逻辑设计想法整合成小的模块。
上一步进行完毕之后,这一步就可以很快的分出块了。
4.将上述的小模块之间的逻辑关系和顺序关系捋清并清楚表达在框图里。(我的设计框图在下面)
这一步也很重要,框图搭建完毕之后,敲代码就变的很容易,速度也快很多。
四、框图
顶层框图:
矩阵键盘模块:
数码管模块:
五、框图及模块介绍
由上图可以看到,整个计算器顶层(Alu_top)里包含了六个子模块:
1. 矩阵键盘模块(keyscan_top):
a) 按键模块(key_scan)
b) 消抖模块(key_pulse)
2. 移位控制模块(shift)
这个模块在我的设计里是核心。计算,数码管显示,BCD与二进制相互转换,都要通过这个模块去控制。
3. BCD转二进制模块(bcd2bin)
移位后的数据经过此模块进入计算模块计算。
4.计算模块(Alu1)
用几个小算法去完成加减乘除的四则运算。
5.二进制转BCD模块(bin2bcd)
计算后的二进制结果要送回数码管以BCD码的形式显示。
6.数码管模块(smg_top):
a)数码管开关模块(smg_off)
这个模块也可以叫做消零模块,几位数在数码管上就只显示几位数,不显示无意义的零。
b)数码管显示模块(smg_dsp)
这个数码管虽然做完了,但是我觉得还可以优化的更好一些,实现更多的功能,我会慢慢优化然后把优化的结果更新出来。
顶层连线程序如下图:
- //=====================================================================
- // module name : alu_top
- // project : alu_top
- // function : &
- // create data : from 2016-8-23 20:56:04 to 2016-8-24 13:55:49
- // editor : miao
- // Tool versions : quartus 13.0
- //=====================================================================
- module alu_top(
- input clk ,
- input rst_n ,
- input [3:0] row ,
-
- output [3:0] col ,
- output [2:0] sel ,
- output [7:0] seg ,
- output [2:0] led
- );
- //====link==============
- wire [23:0] shift_data ;
- wire key_flag ;
- wire [3:0] key_real ;
- wire clk_1k ;
- wire [23:0] bcd_result ;
-
- wire [23:0] bcd_data_a ;
- wire [23:0] bcd_data_b ;
- wire shift_done ;
- wire flag_ab ;
- wire [3:0] opcode ;
- wire [23:0] data_dsp ;
- wire [19:0] bin_a ;
- wire [19:0] bin_b ;
- wire [19:0] result ;
- wire bcd_done ;
- wire alu_start ;
- wire alu_done ;
- wire bin_done ;
- //--
- //===========instation==================
- clk_dk clk_dk_inst(
- .clk ( clk ) ,
- .rst_n ( rst_n ) ,
-
- .clk_1k ( clk_1k )
- );
- keyscan_top keyscan_top_inst(
- .clk ( clk_1k ),
- .rst_n ( rst_n ),
- .row ( row ),
-
- .col ( col ),
- .key_flag ( key_flag ), // to shift4
- .key_real ( key_real ) // to shift4
- );
- shift4 shift4_inst(
- .clk (clk_1k ),
- .rst_n (rst_n ),
- .key_real (key_real), // from keyscan_top
- .key_flag (key_flag), // from keyscan_top
- .bcd_result (bcd_result ),// from bin2bcd
- .bin_done (bin_done ), // from bcd2bin
- .alu_done (alu_done ), // from alu1
- .bcd_done (bcd_done ), // from bcd2bin
- .led (led[1]) ,
-
- .bcd_data_a (bcd_data_a ), // to bcd2bin
- .bcd_data_b (bcd_data_b ), // to bcd2bin
- .shift_done (shift_done ), // to bcd2bin
- .flag_ab (flag_ab ), // to bcd2bin
- .opcode (opcode ), // to alu1
- .alu_start (alu_start ), // to alu1
- .data_dsp (data_dsp ) // to smg_top
- );
-
- bcd2bin bcd2bin_inst(
- .clk (clk_1k ),
- .rst_n (rst_n ),
- .bcd_data_a (bcd_data_a ), // from shift4
- .bcd_data_b (bcd_data_b ), // from shift4
- .shift_done (shift_done ), // from shift4
- .flag_ab (flag_ab ), // from shift4
-
- .led (led[0]) ,
-
- .bcd_done (bcd_done ) , // to alu1
- .bin_a (bin_a ), // to alu
- .bin_b (bin_b ) // to alu
- );
-
- alu1 alu1_inst(
- .clk (clk_1k ) ,
- .rst_n (rst_n ) ,
- .opcode (opcode ) , // from shift4
- .a (bin_a ) , // from bcd2bin
- .b (bin_b ) , // from bcd2bin
- .alu_start (alu_start ),// from shift4
- .led (led[2]),
-
- .alu_done (alu_done ), // to bin2bcd & shift4
- .result (result ) // to bin2bcd
- );
- bin2bcd bin2bcd_inst(
- .clk (clk_1k ),
- .rst_n (rst_n ),
- .bin_result (result ), // from alu1
- .alu_done (alu_done), // from alu
-
- .bin_done (bin_done ), // to shift4
- .bcd_result (bcd_result ) // to shift4
- );
-
- smg_top smg_top_inst(
- .clk ( clk ),
- .rst_n ( rst_n ),
- .data_dsp ( data_dsp), // from shift4
-
- .sel ( sel ),
- .seg ( seg )
- );
-
- endmodule
复制代码
0
|
|
|
|