位计数电路概念:所谓位计数电路,就是对一个N位寄存器中1或者0的个数进行计数。
例如:要统计一个四位寄存器data_in[3:0]='b1111中1的个数,将该数据输入位计数电路,会输出结果4。
实现位计数电路步骤:
一、首先使用自然语言来描述实现的过程
1、要将data_in[3:0]每次向右移一位,取移位后的结果的最低位data_in[0];
2、判断data_in[0]是否为1,如果是1,计数器count加1,否则,保持不变。输出计数结果;
3、判断右移后的数据data_in[3:0]是否为0,如果为0,结束整个过程,反之循环步骤1~3。
这个描述完了之后,对位计数器的基本工作过程就已经明明白白。接下来要把上述语言转换为流程图,根据最近看《数字逻辑基础与verilog设计》所学知识,使用ASM来描述比用流程图描述要清晰一些,而且更容易画出实现电路的datapath,毕竟Verilog 是硬件描述语言,最高境界就是写代码之前先把datapath画出然后用verilog描述。因此,此处也使用ASM来进行描述上述实现过程。
二、ASM设计
ASM跟FSM的状态迁移图基本功能一致,都有状态转移以及状态转移条件。只不过ASM更详细一些,把在每个状态中所要实现的功能都尽量描述出来,而FSM只描述输入输出及状态转移条件。因此,使用ASM能更好的理解实现电路所需的基本块(寄存器、移位寄存器、存储器、计数器、多路选择器、译码器)
- ASM如上图所示:首先在rst信号下进入状态S0,在S0对计数器count进行初始化,输入信号S用来控制这个位计数过程,当信号S=0时,在Load信号的控制下加载数据A,当S=1时,进入S1状态,在S1状态,对数据A进行右移,然后判断移位后的A是否为0,如果不等于0,判断A的最低位A[0]是否等于0,如果等于0,计数器保持不变,继续S1状态操作;如果A[0]=1,计数器count加1,然后继续S1状态。如果移位后的A=0,跳转到S2状态,计