type
status
date
slug
summary
tags
category
Property
Nov 30, 2023 02:46 PM
icon
password
属性
属性 1
描述
Origin
URL
写1:100质数SV中的约束,怎么将256个数从小到大排列,不用sort方法 分频奇数分频五分频 偶数分频任意占空比小数分频序列检测器(输出)序列检测异步复位,同步释放帧头检测边沿检测加法器串并转换跨时钟域同步FIFO格雷码转换参考资料
写1:100质数
c语言
Matlab
SV中的约束,怎么将256个数从小到大排列,不用sort方法
分频
分频器的原理:当计数器是分频系数的一半时,信号翻转。当复位信号变化时,就会变化。
思路:需要使用always判定计数器,输入有 复位信号,时钟信号,输出是寄存器。当复位信号不变时,且输入是0时,输出也是0.当复位信号不变,输入小于分频数时,计数器加1.0到3的计数器,到3翻转,就可以得到一个4分频的计数器。
奇数分频
分别写两个计数器和分频器(分别在上升沿计数、下降沿计数,上升沿分频和下降沿分频)
三分频
五分频
由于奇分频需要保持分频后的时钟占空比为 50% ,所以不能像偶分频那样直接在分频系数的一半时使时钟信号翻转(高电平一半,低电平一半)。在此我们需要利用输入时钟上升沿和下降沿来进行设计。
接下来我们设计一个 5 分频的模块,设计思路如下:
采用计数器 cnt1 进行计数,在时钟上升沿进行加 1 操作,计数器的值为 0、1 时,输出时钟信号 clk_div 为高电平;计数器的值为2、3、4 时,输出时钟信号 clk_div 为低电平,计数到 5 时清零,从头开始计数。我们可以得到占空比为 40% 的波形 clk_div1。
采用计数器 cnt2进行计数,在时钟下降沿进行加 1 操作,计数器的值为 0、1 时,输出时钟信号 clk_div 为高电平;计数器的值为2、3、4 时,输出时钟信号 clk_div 为低电平,计数到 5 时清零,从头开始计数。我们可以得到占空比为 40% 的波形 clk_div2。
clk_div1 和clk_div2 的上升沿到来时间相差半个输入周期,所以将这两个信号进行或操作,即可得到占空比为 50% 的5分频时钟。程序如下:
偶数分频
八分频代码,N分频就是N,偶数分频的时候写一个N位的计数器,再写一个分频器吗,在(N/2)-1和N-1的时候翻转
六分频波形
任意占空比
现在在前面两个实验的基础上做一个简单的总结,实现对一个频率的任意占空比的任意分频。
比如: FPGA系统时钟是50M Hz,而我们要产生的频率是880Hz,那么,我们需要对系统时钟进行分频。很容易想到用计数的方式来分频:50000000/880 = 56818。
显然这个数字不是2的整幂次方,那么我们可以设定一个参数,让它到56818的时候重新计数就可以实现了。程序如下:
下面我们来算一下它的占空比:
我们清楚地知道,这个输出波形在counter为0到32767(2的14次方)的时候为低,在32768到56817的时候为高,占空比为40%多一些,
如果我们需要占空比为50%,那么我们需要再设定一个参数,使它为56817的一半,使达到它的时候波形翻转,就可以实现结果了。
程序如下:28408=56818/2-1,计数到28408就清零,翻转,其余的计数期间,保持不变。
继续让我们来看如何实现任意占空比,比如还是由50M分频产生880Hz,而分频得到的信号的占空比为30%。
56818×30%=17045
小数分频
输入频率f_in、输出频率 f_out,计数器位宽N、计数器步长M之间存在f_in/f_out=(2^N)/M的关系,以M为计数步长进行计数,当计数值大于等于(2^N)/2时为高电平否则为低电平。
序列检测器(输出)
周期性输出一个序列为00_1011_0111
序列检测
序列检测器的逻辑功能就是将一个指定的比特序列从一串较长的比特流中识别出来。
例如:针对一个较长的比特流010010010011110101010…,我们希望能将比特序列为“10010”的序列检测出来,并且每次检测到10010就将输出置“1”.
注意:如序列”100100100…",根据以上的介绍,会在第六个比特的时刻输出会置1,但是,在第9个比特时输出不会被置”1“,虽然第4-8比特也构成了”10010“,但是却与第一次的”10010“重叠,因此不能算作有效检测。
二段式FSM描述:
鉴于一段式描述的缺点,两段式描述使用2个always块,一个always块利用同步时序逻辑描述状态转移,一个always块利用组合逻辑描述状态转移条件以及输出;(但是输出一般使用组合逻辑描述,而组合逻辑易产生毛刺等不稳定因素,并影响系统执行速率)
三段式FSM描述:
三段式描述应运而生,通过使用3个always块,一个always块利用同步时序逻辑描述状态转移,一个always块利用组合逻辑描述状态转移条件,一个always块利用同步时序逻辑描述输出,避免了前两种描述方式的弊端;
异步复位,同步释放
一般来说,同步系统,都使用异步复位。这是因为同步复位比异步复位的电路实现要浪费更多电路资源。
帧头检测
边沿检测
用verilog实现1bit信号边沿检测功能,输出一个周期宽度的脉冲信号
重点在上升沿,下降沿,上升沿或下降沿
定义了一个2位的寄存器变量data_r,data_r[0]用来存储当前的状态,data_r[1]用来存储上一拍的状态
每个时钟到来的时候,向左移位,相对于当前时钟的上上拍信号舍弃掉,只保留相对于当前时钟上一拍的状态,存储在data_r的高位上,即data_r[1]表示的是上一拍的状态
加法器
描述带进位输入、输出的两位全加器
先写一位全加器,然后再写个顶层模块,调用两个一位全加器,其中第一个加法器的cout作为第二个加法器的cin
串并转换
verilog实现8位串行数据转并行数据
解串器(deserialize):串行信号转并行信号
输入信号有:时钟信号clk,复位信号rst,串行数据输入信号din。
输出信号为8bit并行信号dout。
每经过8个时钟周期,便把收到的8个串行信号合成并行信号并输出,等下8个时钟周期过后再输出下一个并行信号。
跨时钟域
单bit(慢时钟域到快时钟域):
用快时钟打两拍,直接采一拍大概率也是没问题的,两拍的主要目的是消除亚稳态;
慢时钟域信号到快时钟域信号,一般情况下都是打两拍(单比特传输)也叫两级寄存器同步
单bit(快时钟域到慢时钟域):
握手、异步FIFO、异步双口RAM;
快时钟域的信号脉宽较窄,慢时钟域不一定能采到,可以通过握手机制让窄脉冲展宽,慢时钟域采集到信号后再“告诉”快时钟域已经采集到信号,确保能采集到;
快时钟域到慢时钟域(clka慢时钟域,clkb快时钟域)
- 将快的时钟域中的信号进行展宽
- 对展宽的信号在慢的时钟域2级同步
- 在慢时钟域中产生反馈信号来对快的展宽信号进行拉低处理
跨时钟域处理从快时钟域到慢时钟域,如果是下面第一个图,cklb则可以采样到signal_a_in,但是如果 只有单脉冲,如第二个图,则不能确保采样掉signal_a_in。这个时候用两级触发器同步是没有用的。
多bit:
异步FIFO、异步双口RAM、握手、格雷码;
同步FIFO
深度16,位宽8
格雷码转换
二进制转换为格雷码
原数右移一位再与原数异或
格雷码转换为二进制
二进制最高位取格雷码最高位,然后循环做二进制高位与低一位的格雷码异或
参考资料
- 作者:Conor
- 链接:https://www.xzhh.top/article/coding
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。