位计数电路概念:所谓位计数电路,就是对一个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状态,计数完成信号Done拉高,然后判断S信号是否为0,如果为0,跳转到状态S0,否则保持在状态S2。
三、datapath设计
所谓datapath,即描述整个电路所需的基本块以及输入输出信号,基本块包括寄存器、移位寄存器、存储器、计数器、多路选择器、译码器等。本设计中,很明显只需要计数器和移位寄存器这两个数据块。对应的datapath如下所示。

描述完dataoath之后,下一步就是要使用verilog描述datapath。这就是verilog为什么称为硬件描述语言,因为其本质使用来描述硬件电路,而不是凭空写代码。在实用硬件描述语言进行描述之前,还需要确定ASM状态机中的每个状态的控制信号。
四、控制信号
根据图2数据路径图可知,控制移位寄存器的输入信号有load、en、data_in[n-1:0]