最近在武汉参加至芯科技的FPGA培训,经过了第一周的强化基础培训,我们掌握了分频模块的书写,以及按键消抖的书写,还有就是边沿检测的方法,当然按键消抖模块我们这里用到的是通过移位打拍然后相或的方法,达到了消抖的目的,不过运用过程中这种方法也会遇到一些BUG,比如时间过短的问题,所以我计划是好要学习一下按键消抖的状态机的实现方法,除了这些还有7段数码管的显示驱动的编写,状态机与TB文件的编写,常用加法期间_74ls161的驱动等等。。。这里就不赘述了 ,当然还有另外一个实验,数字钟的实现的实验,这个实验会在另外一篇随笔中详述。
现在开始今天这次四位运算小计算器的实现,设计之前首先得明确要实现的功能,以及按照老师所说,自顶向下的设计思路,首先要明确顶层模块需要有哪些输入以及输出,然后顶层以下有哪些模块构建。
首先明确四则运算模块的实现需要哪些子模块构成:
1. 7段数码管显示模块 2. 4*4键盘码扫描分析电路 3. 算数逻辑运算模块 4. 数制转换模块: 涉及BCD转bin bin转BCD 5. 运算操作状态机的书写
首先是7段数码管显示模块的书写,这一任务在第一周的培训中已经讲解,并已经写出,参考我原来写的7段数码管显示原理的介绍。
其中在计算模块时要先对码制进行转换,计算器只能对二进制码进行运算,而显示的时候要显示BCD码,所以要对其进行转换,就要编写bin2BCD 和BCD2bin模块。
此次设计的计算器可实现的功能有: 可以实现4位以内的加减乘除,以及固定两位小数的运算。
矩阵键盘与数码管显示模块已经写出,现在主要说一下操作输入输出控制这一模块。
因为要考虑小数的计算,所以对应的要显示小数点的标志位。
第一个操作数显示,操作符显示,第二个操作数显示,以及连续运算模块。
module key2bcd1 (clk, rst_n, real_number, opcode, BCDa, BCDb, result , iKey); input [4:0] real_number; input rst_n,clk; input iKey;// 小数点控制位 input [24:0] result; output reg [24:0] BCDa,BCDb; output reg [3:0] opcode; reg [3:0] opcode_reg; reg [3:0] state; reg datacoming_state,datacoming_flag; // ,rst_dian; reg dian_flag; //always @( posedge rst_dian or negedge iKey) // begin // if(rst_dian) // dian_flag <= 0; // else // dian_flag <= 1; // end always @(posedge clk) if (!rst_n) begin datacoming_state <=0; datacoming_flag <=0; end else if (real_number!=17) case(datacoming_state) 0: begin datacoming_flag <=1; datacoming_state <=1; end 1: begin datacoming_flag <=0;