本文主要是介绍序列产生器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
序列信号产生器
顾名思义,就是周期性的产生某段序列信号,这里介绍几种方法。
**第一种方法,**最容易想到的方法,设置一个长度和序列长度一样长的信号,在复位时,赋值为该段序列,接下来循环移位即可。
例 :设计一个序列信号发生器电路,能在CLK信号作用下周期性输出“1010110111”的序列信号。
module sequence_generator(input clk ,input rst_n ,output out_sequence //可以根据题目要求加输出使能,读者自行扩展);reg [9:0] sequence ; always@(posedge clk or negedge rst_n) beginif(!rst_n) beginsequence <= 10'b1010110111 ;//可以替换成其他序列end else beginsequence <= {sequence[8:0],sequence[9]} ;//循环移位,先输出高位endendassign out_sequence = sequence[9] ; endmodule
在这种方法中,**优点是代码简洁,通熟易懂,但是也有个缺陷,就是需要花费的寄存器数量较多。
**
下面介绍第二种方法。
注意到这里序列为10’b1010110111 ,长度为10,也就是共10种状态,需要至少4个寄存器(2^4=16),
假如这里我们只使用四个寄存器,我们观察一下移位状态。
注意 移位方向为左移,移入的数据为多少是怎么判断的呢?
以这个为例,首先第一个状态的数据为从高位取寄存器数量的长度,假如这里使用五个触发器,则第一个状态为10101,则下一个数据移入为什么呢?答案是移入的为10101后面一个数据,依次移入后面五个数据,当后面五个数据移入完后在回到高位继续依次移入五个数据完成闭环。
具体也可参考我画的状态转移表
1010–0101–1011–0110–1101–1011·····状态有重复,不可以,因为寄存器的输入和当前状态有关,不允许相同的状态出现两个不同的输出。
再看五个寄存器;
10101—01011–10110–01101–11011-10111–01111–11110—11101–11010 ··· 10101,没有重复,再回到了10101的循环。
因此我们列出状态转移表
卡诺图及其化简都已写出,具体的rtl代码大家就自己写啦。
下面还有两种方法,一种为状态机,另一种为计数器,给出一篇文章:序列信号发生器
这篇关于序列产生器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!