🌍首页
📁归档
⏳时光机
🚩友链
📫留言
📧订阅
🌟推荐
📕考研课程
🏜️ 免费壁纸
❤ 捐助本站
💰资助名单
🎵音乐实验
Search
1
【NPN/PNP三极管】放大电路饱和失真和截止失真的区别
20,145 阅读
2
论文写作中如何把word/wps里面所有数字和字母替换为新罗马字体
10,704 阅读
3
【高数】形心计算公式讲解大全
9,080 阅读
4
Vivado-FPGA Verilog烧写固化教程
8,072 阅读
5
【概论】一阶矩、二阶矩原点矩,中心矩区别与概念
7,854 阅读
🪶微语&随笔
励志美文
我的随笔
工作办公
📡电子&通信
嵌入式&系统
通信&信息处理
编程&脚本笔记
⌨️IC&系统
FPGA&ASIC
VLSI&IC验证
EDA&虚拟机
💻电子&计算机
IP&SOC设计
机器学习
软硬件算法
登录
/
注册
18(共108篇)
找到
108
篇与
18
相关的结果
- 第 5 页
2022-10-11
读懂史密斯圆图
摘要史密斯圆图用于高频电路阻抗匹配,通过计算电容器、电感器参数和显示频率-阻抗特性。它将阻抗值表示为复数,并使用匹配点、等实部线和等虚部线进行匹配。软件如SmithV3.1可辅助进行阻抗匹配设计。关键词:Smith圆图, 阻抗匹配, 高频电路, 电容, 电感史密斯圆图能干啥用? 史密斯圆图,就是做高频电路之间的阻抗匹配用的。所谓阻抗是电路对电的阻碍能力,它是个矢量,也就是说阻抗值是个复数。这里面既包括实部电阻成分一即与电力 "顶牛儿”的那部分阻力;也包括虚部电抗成分一就是把电力拉偏的那部分阻力。两者加一块,就叫阻抗。阻抗匹配,是电路之间连接的一-个基本要求,简单讲就是输入阻抗和输出阻抗大致相当,方向相反。如果阻抗不匹配呢?轻者电路工作效率低,重者.工作异常或直接烧毁。具体到高频电路来说,这些危害不仅都有,而且比数字电路、低频模拟电路上的危害要严重得多。那高频电路的阻抗匹配是啥标准呢?就是让输入端电阻和输出端电阻是纯阻性,而且最好等于509或752 。那原来阻抗不匹配,现在咋弄它就匹配了呢?就是在两个电路之间,接上电容、电感、传输线,微带线、变压器之类的东西。把阻抗值矫正到阻抗相等面来。史密斯圆图的主要用途,一是计算接到电路里的那些电容器、电感器的参数值的。二是用来显示某一电路的频率一阻抗特性的。 史密斯圆图怎么用? 史密斯圆图,它相当于一个地图,它上面每一个点, 都代表一个复数形式的阻抗值,而其圆心叫做匹配点,它代表了实部50om,虚部0om的理想阻抗,那就是我们要到达的地方。做阻抗匹配,就是规划一条从阻抗点走到匹配点的线路。然后呢?然后就是利用这些点位之间的差值做计算了。这个事儿我就不讲了。因为过去用纸本史密斯圆图才需要自己算,现在有很多专用软件能替我们做,不仅能算刚才我提到的那个匹配元件的电容量、电感量,还能算出谐振电路的Q值,驻波比,衰减量等等,这就用不着咱们算了,诸位知道这些概念是啥意思,就行了!至于具体怎么用史密斯圆图软件?怎么看这些数据?怎么评价匹配的效果?别着急,我们后边再聊。 史密斯圆图第二节史密斯圆图该咋看? 简言之,是看一线、两弧和两圆。 我们说过,史密斯圆图上的每个点,都有实部值和虚部值,那么图上的线,其实也只有两种,一是等实部线,二是等虚部线。读史密斯圆图,就是先沿等虚部线,找到实部值,再沿着等实部线找到虚部值。那么一线和两弧,都是等虚部线;两圆,是等实部线!接下来我们就从一线讲起,说说史密斯圆图的刻度划分刻度值 线一一根特殊的等虚部线 图片 史密斯圆图被一条名为电阻线的蓝色横线分成 上下两个半区,上半部分叫电感区, 那里所有点的虛部值都为正;下半部分叫电容区,那里所有点的虚部值都为负。而电阻线本身的虚部阻抗值不正不负,他上面每一个点的阻抗值均为0欧。所以电阻线是一根特殊的虚部线,它是我们查找实部值的一把尺子。 电阻线上有三个点,最左侧的叫短路点,他表示实部值0欧姆,虚部值也为0欧姆的情况;最右侧的叫断路点,他表示实部值无穷大,虚部值也为0欧姆的情况;而中间点,也就是圆心那是匹配点,那里的阻值是“标准阻值”,一般情况下他是50欧姆。“三点” 是史密斯圆图的基点,也是我们校正天线分析仪的起点,一定记住。 归一化处理 但是请注意!虽然电阻线是一把测量实部阻值的尺子,但是这把尺子上标的不一定是实部阻值。纸本的史密斯圆图标注的是阻抗值/标准阻值的比值,这叫归-化处理,这个值叫归-化阻抗值。下图中的小红字标的是阻抗值,而大红字标的是归一化阻抗值9。咱们先说图.上的大红字,那就是归一化之后的阻抗值。如果我们是在纸本史密斯圆图上标图,那第一步应该把阻抗值转换成归一化阻抗值。 图片 以标准阻抗50欧姆为例。我们要找100欧姆的实部值,就去电阻线上找归一化阻抗值为100欧姆/50欧姆=2的点,而图上显示"0.2" 归一化阻抗值的地方,其实际阻抗值就是0.2*50欧姆= 10欧姆,而匹配点的归一化阻抗值永远为1,这是归一化阻抗标注法的一个识别标志。为什么要用归一化阻抗值标注刻度呢?因为很多时候,我们不是要把电路匹配到50欧姆上,而是要匹配到75欧姆或者300欧姆等阻抗上。 请看下图,这是75欧姆标准电阻时,史密斯原图上的情况,其中电阻线下方写的红字是阻抗值。电阻线上方的写的红字是归一化阻抗值。 图片 第二套刻度一一导纳值和归一化导纳值 等电阻线是一把度量实部值的尺子,它有阻抗值和归一化阻抗值和两种标注方法,其实在电脑版史密斯圆图的等电阻线上,还有一套刻度。就是用大绿字标注的归一化导纳值和用小绿字标注的导纳值。 有人想问导纳值是啥?导是电阻值的倒数,纳是电抗值的倒数,导纳加一块就是导纳值,它是阻抗值的倒数,导纳值的单位是西门子,写作“S",1S等于= 1000mS。给导纳值做归一化,也就是 将导纳值除以0.02S标准导纳值(0.02S, 其实就是1/50欧姆)。这两种标法的值,是等价的。 图片 例如,电阻线上25Ω那个点,它的导纳值为1/25Ω=0.04S,它的归一化导纳值就是0.04S/0.02S为=2。 导纳值既然和阻抗值完全等价,用法也一样,那我们要这个玩意做啥呢?简单讲,我们在标注初始阻抗点时,要根据红色的阻抗值坐标系做,而在做阻抗匹配时,则要用到绿色的导纳值坐标系。 两圆两弧---等实部圆和等虚部弧 图片 两圆---两种等实部线 讲特殊的电阻线--也就是0欧姆等虚部线之后,我们看看与电阻线相切的那些圆形。这些圆圈都是等实部线,那上面每一条线的实部值都相等。其中红色的圆圈都叫阻抗圆,而绿色的圆圈都叫导纳圆,我们在电阻线.上找到实部阻抗值或者实部导纳值之后,就要沿着阻抗圆或者电纳圆去找虚部 值。其中电阻线以上的点是正值,代表阻抗点的虚部值呈现感性,电阻线以下的点是负值,代表阻 抗点的虚部值呈现容性。 和看电阻线的规矩一-样,我们在标注初始阻抗值时只看红色的。 两弧---两种等虚部线 那么虚部值到那去查?从断路点发出,向史密斯圆图边界放射的红线叫等电抗弧;而从短路点发出,向史密斯圆图边界反射的绿线都叫等电纳弧9。这些都是等虚部线,我们找到实部值后,就是沿着实部线9到找到特定值的等虚部线,那虚部线的值标哪儿了呢,在史密斯圆图的外边界上。和刚才-个规矩,我们标初始阻抗值时是根据红色数字做的。总结一下,到底怎么读图? 总结一下,到底怎么读图? 第一步,用阻抗值除以标准电阻,得到归一化实部阻抗值和归一化虚部阻抗值。 第二步,在等电阻线上,找到归一化实部阻抗值对应的阻抗圆。 第三步,沿着阻抗圆,向上或向下旋转,找与归一化虚部阻抗值对应的等电抗弧。 第四步,做个记号,就算OK。 举个栗子~! 1002-j50Ω滴点在哪儿? 第一步,计算归一化实部阻抗值为100Ω/50Ω=2;归一化虚部阻抗值为-50Ω/50Ω=-1。 第二步,在等电阻线上,找到归一化阻抗值为2的阻抗圆。 第三步,沿着归一化阻抗值为2的阻抗圆下旋,转到-1 那个电抗弧上。 第四步,做个记号!我标的是X。 图片 那如果图.上标的是阻抗值呢? 如果是在电脑上识图,图上直接标注的阻抗值,那就更方便了,实部阻抗值标在阻抗圆上,虚部阻抗值写在电抗弧末端。我们标图的时候,不用换算,先根据实部阻抗值找到对应的阻抗圆,再沿着阻抗圆去查对应虚部阻抗值的电抗弧,然后做个记号,就OK啦~ 例如: 我要查100Ω+j50Ω的点,先找到100Ω阻抗圆,然后沿着它的轨迹上旋,到达虚部值为502的地方,然后做个标记,就是Y点。 归一化导纳值呢? 简单讲,导纳值坐标系和阻抗值的查法、标注方法完全一样。 第一步,用导纳值除以标准导纳值,得到归一化导纳值, 第二步,在等电阻线上,找到归一化实部导纳值对应的那个导纳圆。 第三步,沿着导纳圆向上或向下旋转,找与归一化虚部导纳值对应的等电纳弧。 第四步,做个记号,就算OK。 再举个栗子 0.04S+j0.02S的点在哪儿? 第一步,计算归一化实部导纳值为0.04S/0.02S=2;归一化虚部导纳值为0.02S/0.02S=1. 第二步,在等电阻线上,找到归一化导纳值为2的导纳圆。 第三步,沿着归一化导纳值为2的导纳圆上旋,转到导纳值为1的那个电纳弧上。 第四步,做个记号!即Z。 那如果图上标的是导纳值呢? 那也简单,先根据实部导纳值找到对应的导纳圆,再沿着导纳圆去查对应虚部导纳值的电纳弧,然后做个记号,就OK啦~. 例如: 我要查0.04S-j0.02S的点,先找到0.04S导纳圆,然后沿着它的轨迹下旋,到达虚部值为-0.02S的地方,然后做个标记,那就是S点。 好了~!关于怎么查史密斯圆图的事儿,我讲完了,接下来请大家做点练习,看看是否理解了。下一次我们学习如何用史密斯圆图做阻抗匹配。 读图练习 第一题,1点的阻抗值为50Ω+j50N,请问1点在图上什么位置? 第二题,2点的归一化阻抗值为0.5+j0.5,请问2点在图.上什么位置? 第三题,3点导纳值为0.04S-j0.02S,请问3点在图上什么位置? 第四题,4点归一化导纳值为0.5-j0.2,请问4点在图上什么位置? 请把上图打印出来,试着标一下,然后再看文末那个答案。 答案 图片 史密斯圆图第三节怎么用史密斯圆图软件做阻抗匹配 史密斯圆图软件做阻抗匹配有六句口诀:先设参数,后选起点,下容上感,左并右串,顺着圆走,往圆心转。 smithV3.1软件的界面,然后按着口诀顺序,一点点说。然后举个设计例子,最后讲讲注意事项。 软件界面简介 打开SmithV3.1,首先看到左侧-一个有个史密斯圆图,那是我们的操作区域。这里我要着重强调一下,电脑软件上标的都是实际阻抗值,而不是归一化阻抗值,所以我们做阻抗匹配的时候不用换算数据了,但是要在匹配之前设置好频率值和标准电阻值,否则做出来的数据会和现实完全对不上的。 图片 右侧有几个重要窗口,最顶上的是Schematic窗口,当我们在左侧史密斯圆图上用鼠标做匹配的时候,这个窗口里会显示相应的电路图,比如我图.上画的这个匹配路径对应到电路上,就是先双联13.9p电容,再并联23.4nH电感。 图片 下方这个Cursor窗口也很重要哦。它里面标注的是光标所在点的具体参数,这其中最重要的当然是VSWR驻波比、和Z阻抗值, Zo标准电阻值, Freq频率值。 这其中后两项参数是需要我们在做匹配之前要手工输入的。 先设参数,再选起点, 先设参数:就是要设置工作频率和标准阻抗这两个值。 再选起点:就是要把阻抗点的具体位置设到史密斯圆图.上。 我们点击图片 这个图标,然后在 图片 这个页面的左下角General这输入标准阻抗值50Ω,在datapoint那儿输入工作频率,默认设置是500MHz。 图片 然后我们点击 图片 按钮,软件都会弹出这个窗口。 图片 我们在这选中impedance (Ω), 并在下面两个空里填写阻抗点的实部阻抗值和虚部阻抗值,这就样就设好起点了. 然后呢?然后就该我们添加元件了。 下容上感,左并右串 我们点击工具栏的这个部分,就可以在阻抗点上连接电容或电感了。 图片 怎么接线呢?这有两句口诀:下容上感,左并右串。那我们参照下图看一看。 图片 ”下容上感”,是说史密斯圆图的电阻线上方是电感区,下方是电容区,因此呢,我们要往下移动阻抗点,就得接电容;要往上移动阻抗点,就得接电感。那具体是串电容还是并电容,又或者是串电感还是并电感呢?我们来看下一-句左并右串。 “左并右串”,是说如果我们要沿着左侧这组蓝色的导纳圆移动阻抗点,就点击“并联元件”,也就是点工具栏上这两个按钮 图片 ;如果我们要沿着右侧这组红色的阻抗圆移动阻抗点,就点击“串联元件”,就点工具栏上的这两个按钮 图片 顺着圆走,往圆心转 那我们究竟怎么走到标准阻抗点呢?那第五句和第六句说的问题。 所谓“顺着圆走”,是说顺着右侧的50阻抗圆或顺着左侧那个20mS导纳圆走,为什么呢?因为这两个圆都与匹配点相切,所以无论我们走什么路径去匹配点,都得经过其中-一个圆,而“往圆心转”是说我们无论沿着.上面哪条弧线旋转,最终都是往史密斯圆图的中心旋转。等我们把阻抗点挪到自己认为合适的位置后,右侧Schemat窗口里也就画出来了我们的阻抗匹配电路。 一个栗子 某功率放大器的要放大100M信号,其输入阻抗值为252+j352,而信号源阻抗为50Q,现在要在 两者之间接一个匹配电路,为此我要如此操作。 先设参数:我们点击 图片 这个图标,然后在 图片 这个页面的左下角General这输入标准阻抗值50Ω,在Datapoint那儿输入工作频率100MHz。然后点ok按钮。 图片 再选起点:我们点击 图片 按钮,软件都会弹出这个窗口 图片 我们在这选中impedance,然后在下面的两个空里填入实部值25欧姆、虚部值+35欧姆,点ok就行了。这时候我们发现,史密斯圆图上会出现一个方形坐标点DP1. 图片 下容上感,左并右串。顺着圆走,往圆心转那接下来,我们就要通过连接元件,改变阻抗点的阻抗了。由于DP1位于史密斯圆图的电感区,所以我们要让他往下转,那旋转是有很多路径,我们先说最简单的,从DP1直接转到20mS导纳圆上,在顺着20mS导纳圆上继续下旋到圆心。当然这是我们的设想,实际不一定能实现,我们就先以此为目标,试试看吧。 那由于我是要向下移动阻抗点,也就是向电容区移动阻抗点,所以我要连接电容。由于我是沿着右侧的25欧姆阻抗线向下移动,左并右串,所以我应该选串联电容,也就是点 图片 我们点了串联电容按钮之后,会发现光标不能自由移动了,它只能是沿着红色的25欧姆阻抗圆移动,这就是smithV3.1软件的便利之处,他能防止我们走错路。那我们按软件限定的路线,沿着25欧姆阻抗圆下旋,发现有两次机会转到20mS导纳线上,我选哪一次呢?我们设想中是选第一次机会,但是我看到右侧Schenatic窗口里,要添加的串联电容是155pf就改主意了,因为这是个非标容量,说白了我让谁买也买不来这型号的电容。于是我继续沿着25欧姆阻抗圆向下旋转,到第二个交汇点去碰碰运气。那我到达25欧姆阻抗线与20mS导纳线第二次相交的地方一看,发现右侧Schenatic窗口里显示的是串联的是26p电容,这个参数与27p极为接近,那这容量的电容有地方买,所以我就 在这儿点下鼠标左键,图片上就出现了DP2点。 那接下来,我是要由DP2沿着20mS导纳圆上旋对吧?因为下容上感,所以我们要接电感,因为左并右串,我们要沿着左侧圆走,所以要并联电感,那我们点 图片 和第一步一样,我们还是要沿着电脑规划的线路边走边看,走到圆心时,我们发现右侧Schemat窗口里,显示的电感值是80nH左右,这个电感没啥制作难度,所以我就再次点击鼠标左键,史密斯圆图中心附近就会多出来一个DP3。 也就是路径4这个图。 图片 那我们到了这个DP3又意味着什么呢?我们别挪动光标,我们把鼠标停在DP3上,把视线挪到Cursor这个小窗上,在这我们会看到Q值0.005, VSWR1.03等参数。显然,VSWR约等于1,是个 很好的结果,实际小信号的SWR匹配到1 .5就以很好了。而大功率的通讯设备,需要尽量往小了做,做到1.2以下。 两个问题 首先,我们还可以有别的匹配路径么?当然可以,条条大路通罗马。 刚才我们走的路径是先串后并,用了一一个电容一个电感,走20mS导纳圆到的中点,也就是图上的路径1。那如果我们改走右边的509阻抗圆行么?行啊,完全可以。我们可以先并联16pf电容,再串联51pf电容。这就是路径2。 那还有别的路可走么?有啊,比如我们可以选用阻抗匹配变压器,也就是先串联47pf电容,下旋到电阻线,再使用1:1 .4的阻抗变压器,沿着等Q值弧线(也就是从短路点、断路点之间的蓝色弧线,参见文末的图例)向右移动到圆心,这就是路径39。 那还有别的么?有啊,我们还可以接电阻,走等虚部弧。比如我们可以走路径4,即先串联电阻,从DP1进到右边50Q阻抗圆.上,然后再串电容沿着50Q阻抗圆继续下旋,这也是可以的。只不过要注意两个问题,第- -点, 我们接电阻走等虚部线的时候,虽然匹配上了,但是会增加电路损耗的。第二点,由于现实中可没有合用的负阻元件卖,所以我们做匹配时绝不能沿着等虚部线退着走,也就是说不能接负阻器件,这- -点smith3.1软件考虑到了,他会限制我们那么做,但是其他软件或纸本的史密斯圆图就得注意这问题。 图片 其次,如果我们做匹配时转不到史密斯圆图的正中心(不太可能),或者实际制作中对不到史密斯圆图中心(很常见),那又 意味着什么? 请看下图,图上这些棕色圆圈是等VSWR圆,也就是等驻波比圆,这个驻波比圆的特点是越靠近圆心,驻波比越小,比如圆心那- -点是1.也就是说输入端送出进去多少信号,负载端就吸收多少信号,能量一点没糟践;驻波比1.5, 意味着有4%的功率撞到输出端又撞回输入端了。驻波比29,就意味着有11%的能量撞回去了。通常来说,小信号阻抗匹配电路对驻波比要求比较低,达到1.5就算良好匹配了。如果体积有限制,还可以进一步放宽一些。 但是如果是强信号,电台天线那种场合,SWR控制的就比较严格了,大功率电台,通信基站要控制在1.2以内。 图片
嵌入式&系统
# 天线设计
# 电子线路
刘航宇
4年前
0
4,244
8
Verilog实现FIFO的设计
摘要本文介绍了使用Verilog实现FIFO(First In First Out)的设计,包括原理、工作流程、读写时刻、读空状态和写满状态。详细阐述了FIFO的设计要求,包括深度、宽度参数化,以及异步设计。同时,提供了双口RAM和计数器的Verilog描述,以及FIFO模块的主体部分和调用示例。关键词:Verilog, FIFO, 异步数据传输, 双口RAM, 格雷码FIFO(First In First Out)是异步数据传输时经常使用的存储器。该存储器的特点是数据先进先出(后进后出)。其实,多位宽数据的异步传输问题,无论是从快时钟到慢时钟域,还是从慢时钟到快时钟域,都可以使用 FIFO 处理。 完整的 FIFO 设计见附件,包括输入数据位宽小于输出数据位宽时的异步设计和仿真。 源代码FIFO.zip 下载地址:https://wwu.lanzoub.com/iIdvu0am46cf 提取码: 目录 FIFO 原理工作流程 读写时刻 读空状态 写满状态 FIFO 设计设计要求 双口 RAM 设计 计数器设计 FIFO 设计FIFO 调用 testbench 仿真分析 FIFO 原理 工作流程 复位之后,在写时钟和状态信号的控制下,数据写入 FIFO 中。RAM 的写地址从 0 开始,每写一次数据写地址指针加一,指向下一个存储单元。当 FIFO 写满后,数据将不能再写入,否则数据会因覆盖而丢失。 FIFO 数据为非空、或满状态时,在读时钟和状态信号的控制下,可以将数据从 FIFO 中读出。RAM 的读地址从 0 开始,每读一次数据读地址指针加一,指向下一个存储单元。当 FIFO 读空后,就不能再读数据,否则读出的数据将是错误的。 FIFO 的存储结构为双口 RAM,所以允许读写同时进行。典型异步 FIFO 结构图如下所示。端口及内部信号将在代码编写时进行说明。 图片 读写时刻 关于写时刻,只要 FIFO 中数据为非满状态,就可以进行写操作;如果 FIFO 为满状态,则禁止再写数据。 关于读时刻,只要 FIFO 中数据为非空状态,就可以进行读操作;如果 FIFO 为空状态,则禁止再读数据。 不管怎样,一段正常读写 FIFO 的时间段,如果读写同时进行,则要求写 FIFO 速率不能大于读速率。 读空状态 开始复位时,FIFO 没有数据,空状态信号是有效的。当 FIFO 中被写入数据后,空状态信号拉低无效。当读数据地址追赶上写地址,即读写地址都相等时,FIFO 为空状态。 因为是异步 FIFO,所以读写地址进行比较时,需要同步打拍逻辑,就需要耗费一定的时间。所以空状态的指示信号不是实时的,会有一定的延时。如果在这段延迟时间内又有新的数据写入 FIFO,就会出现空状态指示信号有效,但是 FIFO 中其实存在数据的现象。 严格来讲该空状态指示是错误的。但是产生空状态的意义在于防止读操作对空状态的 FIFO 进行数据读取。产生空状态信号时,实际 FIFO 中有数据,相当于提前判断了空状态信号,此时不再进行读 FIFO 数据操作也是安全的。所以,该设计从应用上来说是没有问题的。 写满状态 开始复位时,FIFO 没有数据,满信号是无效的。当 FIFO 中被写入数据后,此时读操作不进行或读速率相对较慢,只要写数据地址超过读数据地址一个 FIFO 深度时,便会产生满状态信号。此时写地址和读地址也是相等的,但是意义是不一样的。 图片 此时经常使用多余的 1bit 分别当做读写地址的拓展位,来区分读写地址相同的时候,FIFO 的状态是空还是满状态。当读写地址与拓展位均相同的时候,表明读写数据的数量是一致的,则此时 FIFO 是空状态。如果读写地址相同,拓展位为相反数,表明写数据的数量已经超过读数据数量的一个 FIFO 深度了,此时 FIFO 是满状态。当然,此条件成立的前提是空状态禁止读操作、满状态禁止写操作。 同理,由于异步延迟逻辑的存在,满状态信号也不是实时的。但是也相当于提前判断了满状态信号,此时不再进行写 FIFO 操作也不会影响应用的正确性。 FIFO 设计 设计要求 为设计应用于各种场景的 FIFO,这里对设计提出如下要求: (1) FIFO 深度、宽度参数化,输出空、满状态信号,并输出一个可配置的满状态信号。当 FIFO 内部数据达到设置的参数数量时,拉高该信号。 (2) 输入数据和输出数据位宽可以不一致,但要保证写数据、写地址位宽与读数据、读地址位宽的一致性。例如写数据位宽 8bit,写地址位宽为 6bit(64 个数据)。如果输出数据位宽要求 32bit,则输出地址位宽应该为 4bit(16 个数据)。 (3) FIFO 是异步的,即读写控制信号来自不同的时钟域。输出空、满状态信号之前,读写地址信号要用格雷码做同步处理,通过减少多位宽信号的翻转来减少打拍法同步时数据的传输错误。 格雷码与二进制之间的转换如下图所示。 图片 双口 RAM 设计 RAM 端口参数可配置,读写位宽可以不一致。建议 memory 数组定义时,以长位宽地址、短位宽数据的参数为参考,方便数组变量进行选择访问。 Verilog 描述如下。 module ramdp #( parameter AWI = 5 , parameter AWO = 7 , parameter DWI = 64 , parameter DWO = 16 ) ( input CLK_WR , //写时钟 input WR_EN , //写使能 input [AWI-1:0] ADDR_WR ,//写地址 input [DWI-1:0] D , //写数据 input CLK_RD , //读时钟 input RD_EN , //读使能 input [AWO-1:0] ADDR_RD ,//读地址 output reg [DWO-1:0] Q //读数据 ); //输出位宽大于输入位宽,求取扩大的倍数及对应的位数 parameter EXTENT = DWO/DWI ; parameter EXTENT_BIT = AWI-AWO > 0 ? AWI-AWO : 'b1 ; //输入位宽大于输出位宽,求取缩小的倍数及对应的位数 parameter SHRINK = DWI/DWO ; parameter SHRINK_BIT = AWO-AWI > 0 ? AWO-AWI : 'b1; genvar i ; generate //数据位宽展宽(地址位宽缩小) if (DWO >= DWI) begin //写逻辑,每时钟写一次 reg [DWI-1:0] mem [(1<<AWI)-1 : 0] ; always @(posedge CLK_WR) begin if (WR_EN) begin mem[ADDR_WR] <= D ; end end //读逻辑,每时钟读 4 次 for (i=0; i<EXTENT; i=i+1) begin always @(posedge CLK_RD) begin if (RD_EN) begin Q[(i+1)*DWI-1: i*DWI] <= mem[(ADDR_RD*EXTENT) + i ] ; end end end end //================================================= //数据位宽缩小(地址位宽展宽) else begin //写逻辑,每时钟写 4 次 reg [DWO-1:0] mem [(1<<AWO)-1 : 0] ; for (i=0; i<SHRINK; i=i+1) begin always @(posedge CLK_WR) begin if (WR_EN) begin mem[(ADDR_WR*SHRINK)+i] <= D[(i+1)*DWO -1: i*DWO] ; end end end //读逻辑,每时钟读 1 次 always @(posedge CLK_RD) begin if (RD_EN) begin Q <= mem[ADDR_RD] ; end end end endgenerate endmodule计数器设计 计数器用于产生读写地址信息,位宽可配置,不需要设置结束值,让其溢出后自动重新计数即可。Verilg 描述如下。 module ccnt #(parameter W ) ( input rstn , input clk , input en , output [W-1:0] count ); reg [W-1:0] count_r ; always @(posedge clk or negedge rstn) begin if (!rstn) begin count_r <= 'b0 ; end else if (en) begin count_r <= count_r + 1'b1 ; end end assign count = count_r ; endmoduleFIFO 设计 该模块为 FIFO 的主体部分,产生读写控制逻辑,并产生空、满、可编程满状态信号。 鉴于篇幅原因,这里只给出读数据位宽大于写数据位宽的逻辑代码,写数据位宽大于读数据位宽的代码描述详见附件。 module fifo #( parameter AWI = 5 , parameter AWO = 3 , parameter DWI = 4 , parameter DWO = 16 , parameter PROG_DEPTH = 16) //可设置深度 ( input rstn, //读写使用一个复位 input wclk, //写时钟 input winc, //写使能 input [DWI-1: 0] wdata, //写数据 input rclk, //读时钟 input rinc, //读使能 output [DWO-1 : 0] rdata, //读数据 output wfull, //写满标志 output rempty, //读空标志 output prog_full //可编程满标志 ); //输出位宽大于输入位宽,求取扩大的倍数及对应的位数 parameter EXTENT = DWO/DWI ; parameter EXTENT_BIT = AWI-AWO ; //输出位宽小于输入位宽,求取缩小的倍数及对应的位数 parameter SHRINK = DWI/DWO ; parameter SHRINK_BIT = AWO-AWI ; //==================== push/wr counter =============== wire [AWI-1:0] waddr ; wire wover_flag ; //多使用一位做写地址拓展 ccnt #(.W(AWI+1)) u_push_cnt( .rstn (rstn), .clk (wclk), .en (winc && !wfull), //full 时禁止写 .count ({wover_flag, waddr}) ); //============== pop/rd counter =================== wire [AWO-1:0] raddr ; wire rover_flag ; //多使用一位做读地址拓展 ccnt #(.W(AWO+1)) u_pop_cnt( .rstn (rstn), .clk (rclk), .en (rinc & !rempty), //empyt 时禁止读 .count ({rover_flag, raddr}) ); //============================================== //窄数据进,宽数据出 generate if (DWO >= DWI) begin : EXTENT_WIDTH //格雷码转换 wire [AWI:0] wptr = ({wover_flag, waddr}>>1) ^ ({wover_flag, waddr}) ; //将写数据指针同步到读时钟域 reg [AWI:0] rq2_wptr_r0 ; reg [AWI:0] rq2_wptr_r1 ; always @(posedge rclk or negedge rstn) begin if (!rstn) begin rq2_wptr_r0 <= 'b0 ; rq2_wptr_r1 <= 'b0 ; end else begin rq2_wptr_r0 <= wptr ; rq2_wptr_r1 <= rq2_wptr_r0 ; end end //格雷码转换 wire [AWI-1:0] raddr_ex = raddr << EXTENT_BIT ; wire [AWI:0] rptr = ({rover_flag, raddr_ex}>>1) ^ ({rover_flag, raddr_ex}) ; //将读数据指针同步到写时钟域 reg [AWI:0] wq2_rptr_r0 ; reg [AWI:0] wq2_rptr_r1 ; always @(posedge wclk or negedge rstn) begin if (!rstn) begin wq2_rptr_r0 <= 'b0 ; wq2_rptr_r1 <= 'b0 ; end else begin wq2_rptr_r0 <= rptr ; wq2_rptr_r1 <= wq2_rptr_r0 ; end end //格雷码反解码 //如果只需要空、满状态信号,则不需要反解码 //因为可编程满状态信号的存在,地址反解码后便于比较 reg [AWI:0] wq2_rptr_decode ; reg [AWI:0] rq2_wptr_decode ; integer i ; always @(*) begin wq2_rptr_decode[AWI] = wq2_rptr_r1[AWI]; for (i=AWI-1; i>=0; i=i-1) begin wq2_rptr_decode[i] = wq2_rptr_decode[i+1] ^ wq2_rptr_r1[i] ; end end always @(*) begin rq2_wptr_decode[AWI] = rq2_wptr_r1[AWI]; for (i=AWI-1; i>=0; i=i-1) begin rq2_wptr_decode[i] = rq2_wptr_decode[i+1] ^ rq2_wptr_r1[i] ; end end //读写地址、拓展位完全相同是,为空状态 assign rempty = (rover_flag == rq2_wptr_decode[AWI]) && (raddr_ex >= rq2_wptr_decode[AWI-1:0]); //读写地址相同、拓展位不同,为满状态 assign wfull = (wover_flag != wq2_rptr_decode[AWI]) && (waddr >= wq2_rptr_decode[AWI-1:0]) ; //拓展位一样时,写地址必然不小于读地址 //拓展位不同时,写地址部分比如小于读地址,实际写地址要增加一个FIFO深度 assign prog_full = (wover_flag == wq2_rptr_decode[AWI]) ? waddr - wq2_rptr_decode[AWI-1:0] >= PROG_DEPTH-1 : waddr + (1<<AWI) - wq2_rptr_decode[AWI-1:0] >= PROG_DEPTH-1; //双口 ram 例化 ramdp #( .AWI (AWI), .AWO (AWO), .DWI (DWI), .DWO (DWO)) u_ramdp ( .CLK_WR (wclk), .WR_EN (winc & !wfull), //写满时禁止写 .ADDR_WR (waddr), .D (wdata[DWI-1:0]), .CLK_RD (rclk), .RD_EN (rinc & !rempty), //读空时禁止读 .ADDR_RD (raddr), .Q (rdata[DWO-1:0]) ); end //============================================== //big in and small out /* else begin: SHRINK_WIDTH …… end */ endgenerate endmoduleFIFO 调用 下面可以调用设计的 FIFO,完成多位宽数据传输的异步处理。 写数据位宽为 4bit,写深度为 32。 读数据位宽为 16bit,读深度为 8,可配置 full 深度为 16。 module fifo_s2b( input rstn, input [4-1: 0] din, //异步写数据 input din_clk, //异步写时钟 input din_en, //异步写使能 output [16-1 : 0] dout, //同步后数据 input dout_clk, //同步使用时钟 input dout_en ); //同步数据使能 wire fifo_empty, fifo_full, prog_full ; wire rd_en_wir ; wire [15:0] dout_wir ; //读空状态时禁止读,否则一直读 assign rd_en_wir = fifo_empty ? 1'b0 : 1'b1 ; fifo #(.AWI(5), .AWO(3), .DWI(4), .DWO(16), .PROG_DEPTH(16)) u_buf_s2b( .rstn (rstn), .wclk (din_clk), .winc (din_en), .wdata (din), .rclk (dout_clk), .rinc (rd_en_wir), .rdata (dout_wir), .wfull (fifo_full), .rempty (fifo_empty), .prog_full (prog_full)); //缓存同步后的数据和使能 reg dout_en_r ; always @(posedge dout_clk or negedge rstn) begin if (!rstn) begin dout_en_r <= 1'b0 ; end else begin dout_en_r <= rd_en_wir ; end end assign dout = dout_wir ; assign dout_en = dout_en_r ; endmoduletestbench `timescale 1ns/1ns `define SMALL2BIG module test ; `ifdef SMALL2BIG reg rstn ; reg clk_slow, clk_fast ; reg [3:0] din ; reg din_en ; wire [15:0] dout ; wire dout_en ; //reset initial begin clk_slow = 0 ; clk_fast = 0 ; rstn = 0 ; #50 rstn = 1 ; end //读时钟 clock_slow 较快于写时钟 clk_fast 的 1/4 //保证读数据稍快于写数据 parameter CYCLE_WR = 40 ; always #(CYCLE_WR/2/4) clk_fast = ~clk_fast ; always #(CYCLE_WR/2-1) clk_slow = ~clk_slow ; //data generate initial begin din = 16'h4321 ; din_en = 0 ; wait (rstn) ; //(1) 测试 full、prog_full、empyt 信号 force test.u_data_buf2.u_buf_s2b.rinc = 1'b0 ; repeat(32) begin @(negedge clk_fast) ; din_en = 1'b1 ; din = {$random()} % 16; end @(negedge clk_fast) din_en = 1'b0 ; //(2) 测试数据读写 #500 ; rstn = 0 ; #10 rstn = 1 ; release test.u_data_buf2.u_buf_s2b.rinc; repeat(100) begin @(negedge clk_fast) ; din_en = 1'b1 ; din = {$random()} % 16; end //(3) 停止读取再一次测试 empyt、full、prog_full 信号 force test.u_data_buf2.u_buf_s2b.rinc = 1'b0 ; repeat(18) begin @(negedge clk_fast) ; din_en = 1'b1 ; din = {$random()} % 16; end end fifo_s2b u_data_buf2( .rstn (rstn), .din (din), .din_clk (clk_fast), .din_en (din_en), .dout (dout), .dout_clk (clk_slow), .dout_en (dout_en)); `else `endif //stop sim initial begin forever begin #100; if ($time >= 5000) $finish ; end end endmodule仿真分析 根据 testbench 中的 3 步测试激励,分析如下: 测试 (1) : FIFO 端口及一些内部信号时序结果如下。 由图可知,FIFO 内部开始写数据,空状态信号拉低之前有一段时间延迟,这是同步读写地址信息导致的。 由于此时没有进行读 FIFO 操作,相对于写数据操作,full 和 prog_full 拉高几乎没有延迟。 图片 测试 (2) : FIFO 同时进行读写时,数字顶层异步处理模块的端口信号如下所示,两图分别显示了数据开始传输、结束传输时的读取过程。 由图可知,数据在开始、末尾均能正确传输,完成了不同时钟域之间多位宽数据的异步处理。 图片 图片 测试 (3) :整个 FIFO 读写行为及读停止的时序仿真图如下所示。 由图可知,读写同时进行时,读空状态信号 rempty 会拉低,表明 FIFO 中有数据写入。一方面读数据速率稍高于写速率,且数据之间传输会有延迟,所以中间过程中 rempty 会有拉高的行为。 读写过程中,full 与 prog_full 信号一直为低,说明 FIFO 中数据并没有到达一定的数量。当停止读操作后,两个 full 信号不久便拉高,表明 FIFO 已满。仔细对比读写地址信息,FIFO 行为没有问题。 图片
FPGA&ASIC
# ASIC/FPGA
刘航宇
4年前
0
936
2
【Verilog】卡诺图到电路Karnaugh Map to Circuit
摘要本文介绍了如何将卡诺图转换为电路,包括最小SOP和POS形式的输出。通过卡诺图化简,得到逻辑表达式,并使用Verilog代码实现。文章展示了三个实例,详细说明了从卡诺图到Verilog代码的转换过程。关键词:Verilog, 卡诺图, 逻辑电路, 逻辑表达式, 代码编写目录 问题描述一问题解答 问题描述二问题解答 问题描述三问题解答 问题描述一 具有四个输入 (a,b,c,d) 的单输出数字系统在输入出现 2、7 或 15 时产生逻辑 1,当输入出现 0、1、4、5、6、9、10、13或14 时产生逻辑 0 。数字 3、8、11 和 12 的输入条件从未出现在此系统中。例如,7 对应于分别设置a,b,c,d为0、1、1、1。确定最小SOP形式的输出out_sop,以及最小POS形式的输出out_pos。 问题解答 (1)根据题意可以画出如下卡诺图: 图片 (2)随后进行卡诺图的化简: 最小SOP:采用圈1法,如图中蓝色和绿色实线所示,合并标1的最小项,即。 最小POS:采用圈0法,如图中红、黄、深蓝色虚线所示,合并标0的最小项,得到$L=c d+\bar{a} \bar{b} c$ 通过将该逻辑表达式进行化简,可以得到。$L=c \cdot(\bar{b}+\bar{c}+d) \cdot(\bar{a}+\bar{c}+d)$ 得到该卡诺图的逻辑表达式后,便可以开始编写verilog代码。 module top_module ( input a, input b, input c, input d, output out_sop, output out_pos ); assign out_sop = (c&d)|(~a&~b&c); //sop assign out_pos = c&(~b|~c|d)&(~a|~c|d); //pos endmodule问题描述二 得出下面卡诺图中显示的函数 f。 图片 问题解答 采用圈0法,如下图所示。 图片 合并标0的最小项,得到$\bar{L}=\overline{x_{1}} \overline{x_{3}}+\overline{x_{3}} \overline{x_{4}}+x_{1} \overline{x_{2}}+x_{1} x_{3}$将该表达式化简,可以得到:$L=\left(x_{1}+x_{3}\right) \cdot\left(x_{3}+x_{4}\right) \cdot\left(\bar{X}_ {1}+x_{2}\right) \cdot\left(\bar{X}_{1}+\bar{X}_{3}\right)$得到该卡诺图的逻辑表达式后,便可以开始编写verilog代码。 module top_module ( input [4:1] x, output f ); assign f = (x[1]|x[3])&(x[3]|x[4])&(~x[1]|x[2])&(~x[1]|~x[3]); endmodule问题描述三 得出下面卡诺图中显示的函数 f。(原试题要求简化 SOP 和 POS 形式的函数。) 图片 问题解答 最小SOP:采用圈1法,如下图所示。 图片 合并标1的最小项,得到$L=\overline{x_{2}} \overline{x_{4}}+\bar{X}_ {1} x_{3}+x_{2} x_{3} x_{4}$ 最小POS:采用圈0法,如下图所示。 图片 合并标0的最小项,得到$\bar{L}=\overline{x_{3}} \overline{x_{4}}+x_{2} \overline{x_{3}}+x_{1} x_{2} \overline{x_{4}}+x_{1} \overline{x_{2}} x_{4}$,通过化简该逻辑表达式,可以得到:$L=\left(x_{3}+\overline{x_{4}}\right) \cdot\left(\overline{x_{2}}+x_{3}\right) \cdot\left(\overline{x_{1}}+\overline{x_{2}}+x_{4}\right) \cdot\left(\overline{x_{1}}+x_{2}+\overline{x_{4}}\right)$得到该卡诺图的逻辑表达式后,便可以开始编写verilog代码。 module top_module ( input [4:1] x, output f ); //assign f = (~x[2]&~x[4])|(~x[1]&x[3])|(x[2]&x[3]&x[4]); //sop assign f = (x[3]|~x[4])&(~x[2]|x[3])&(~x[1]|~x[2]|x[4])&(~x[1]|x[2]|~x[4]); //pos endmodule
FPGA&ASIC
刘航宇
4年前
0
938
1
【1】Verilog-初识、简介与环境搭建
摘要Verilog是一种强大的硬件描述语言,用于数字系统描述和建模,广泛应用于ASIC设计。本文介绍了Verilog的发展历史、主要特性、应用领域以及环境搭建过程,包括Quartus II和Modelsim的使用。关键词:Verilog, 硬件描述语言, FPGA, Quartus II, Modelsim目录 发展历史 主要特性 主要应用 Verilog 环境搭建Quartus II 安装 Modelsim 安装 建立 Quartus II 工程建立工程 新建 Verilog 源文件 Quartus II 调用 Modelsim 仿真 总结 Verilog 具有很强的电路描述与建模能力,能从多个层次对数字系统进行描述和建模。因此,在简化硬件设计任务、提高设计效率与可靠性、语言易读性、层次化和结构化设计等方面展现了强大的生命力与潜力。 发展历史 1983 年,Verilog 最初由 Gateway Design Automation 公司(GDA)的 Phil Moorby 创建,作为内部仿真器的语言,主要用于逻辑建模和仿真验证,被广泛使用。 1989 年,GDA 公司被 Cadence 公司收购,Verilog 语言成为 Cadence 公司的私有财产。 1990 年,Cadence 公司成立 OVI(Open Verilog International)组织,公开 Verilog 语言,促进 Verilog 向公众领域发展。 1992 年,OVI 决定致力于将 Verilog OVI 标准推广为 IEEE(The Institute of Electrical and Electronics Engineers)标准。 1995 年,OVI 的努力获得成功,IEEE 制定了 Verilog HDL 的第一个国际标准,即 IEEE Std 1364-1995,也称之为 Verilog 1.0。 2001 年,IEEE 发布 Verilog 第二个标准(Verilog 2.0),即 IEEE Std 1364-2001, 简称为 Verilog-2001 标准。由于 Cadence 在集成电路设计领域的影响力及 Verilog 语言的简洁易用性,Verilog 成为电路设计中最流行的硬件描述语言。 主要特性 下面是 Verilog 的主要特性: 可采用 3 种不同的方式进行设计建模:行为级描述——使用过程化结构建模;数据流描述——使用连续赋值语句建模;结构化方式——使用门和模块例化语句描述。 两类数据类型:线网(wire)数据类型与寄存器(reg)数据类型,线网表示物理元件之间的连线,寄存器表示抽象的数据存储元件。 能够描述层次设计,可使用模块实例化描述任何层次。 用户定义原语(UDP)创建十分灵活。原语既可以是组合逻辑,也可以是时序逻辑。 可提供显示语言结构指定设计中的指定端口到端口的时延,以及路径时延和时序检查。 Verilog 支持其他编程语言接口(PLI)进行进一步扩展。PLI 允许外部函数访问 Verilog 模块内部信息,为仿真提供了更加丰富的测试方法。 同一语言可用于生成模拟激励和指定测试的约束条件。 设计逻辑功能时,设计者可不用关心不影响逻辑功能的因素,例如工艺、温度等。 主要应用 专用集成电路(ASIC),就是具有专门用途和特殊功能的独立集成电路器件。 Verilog 作为硬件描述语言,主要用来生成专用集成电路。 主要通过 3 个途径来完成: 1、可编程逻辑器件 FPGA 和 CPLD 是实现这一途径的主流器件。他们直接面向用户,具有极大的灵活性和通用性,实现快捷,测试方便,开发效率高而成本较低。 2、半定制或全定制 ASIC 通俗来讲,就是利用 Verilog 来设计具有某种特殊功能的专用芯片。根据基本单元工艺的差异,又可分为门阵列 ASIC,标准单元 ASIC,全定制 ASIC。 3、混合 ASIC 主要指既具有面向用户的 FPGA 可编程逻辑功能和逻辑资源,同时也含有可方便调用和配置的硬件标准单元模块,如CPU,RAM,锁相环,乘法器等。 Verilog 环境搭建 学习 Verilog 做仿真时,可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE(目前已停止更新),VIVADO;因特尔公司的 Quartus II;ASIC 开发环境有 Synopsys 公司的 VCS ;很多人也在用 Icarus Verilog 和 GTKwave 的方法,更加的轻便。 虽然 ISE 或者 Quartus II 都会自带仿真器,但功能还是有欠缺。所以,这里介绍下 Quartus II + Modelsim 联合仿真的测试方法,运行环境为 64bit-win10 系统。 Quartus II 安装 本次介绍使用的 Quartus 版本为 10.1。 目前 Quartus II 官网已经没有 13.1 以下版本的安装包,大家可以安装 13.1 以上版本的软件。功能都是大同小异,下载地址:https://fpgasoftware.intel.com/13.1/?edition=subscription&platform=windows 下载 13.1 以上的 quartus II 时,官网也会推荐相应版本的 Modelsim,一起下载即可。 开始安装,修改安装路径,其他按照默认设置一步步操作即可。 下图是成功安装的截图。 图片 如果提示需要 License file,如下图所示,则需要指定购买该软件时的 license 文件。 图片 如果 license 文件需要替换 Host-ID,只需要 license 文件中的 HOSTID 替换为 NIC 选项中随便一个 ID 即可,如下图红色框所示: l35kw97h.png图片 Quartus II 10.1 安装完还需要安装 Device,即安装支持各种可编程逻辑器件型号的库文件,否则 Quartus II 不能正常建立工程。 安装路径需要选择 Quartus II 的安装路径,此时 Device 安装可自动识别 Quartus II。 最新 Quartus II(例如 2016 版本)已经支持一套化安装了。 Modelsim 安装 Modelsim 选择 modelsim-win64-10.1c-se 版本。 也需要修改下安装路径,然后按照默认设置进行操作即可。 安装完毕后可能提示需要重启电脑,重启即可。 l35kwto3.png图片 建立 Quartus II 工程 建立工程 File->New project Wizard 设置工作路径与工程名字、top module名字。 注意,路径与名字设置时,不能包含中文。 l35kymsh.png图片 选择器件型号 我们只进行简单的仿真,不进行下载、烧录等,所以我们不用关心具体信号,随便选一种即可。 然后一直点击 Next,直到 Finish。 l35kz8mf.png图片 新建 Verilog 源文件 下面就对 4 位宽 10 进制计数器进行简单的仿真。 点击:File->New->Verilog HDL File->OK 点击:File->Save As 输入 module 名字为:counter10.v 需要注意的是,top module 名字一定要和 project 名字一致,否则会报错(如图中所示)。 把 Verilog 代码复制到文件 counter10.v 中,进行一键编译(实际包含了编译、综合、布局布线等)。 代码: module counter10( //端口定义 input rstn, //复位端,低有效 input clk, //输入时钟 output [3:0] cnt, //计数输出 output cout); //溢出位 reg [3:0] cnt_temp ; //计数器寄存器 always@(posedge clk or negedge rstn) begin if(! rstn)begin //复位时,计时归0 cnt_temp <= 4'b0 ; end else if (cnt_temp==4'd9) begin //计时10个cycle时,计时归0 cnt_temp <=4'b000; end else begin //计时加1 cnt_temp <= cnt_temp + 1'b1 ; end end assign cout = (cnt_temp==4'd9) ; //输出周期位 assign cnt = cnt_temp ; //输出实时计时器 endmodule报错时,可通过点击 Error log 来定位错误,进行修改,直至没有 Error。 l35kzvy2.png图片 Quartus II 调用 Modelsim 仿真 仿真设置为 Modelsim-altera 点击:Tool->Options->EDA Tool Options 将 Modelsim 后面的地址改为 Modelsim 启动程序的路径。 l35l1p4j.png图片 选择仿真器 点击:Assignments -> Simulation Tool name 选择 ModelSim,并设置 Format、Time scale 等,如图 l35l22b6.png图片 写 testbench 文件 点击:Processing->start->Start TestBench Template Writer 如果设置正确,会在工程路径 simulation/modelsim 下产生 .vt 文件。 .vt 文件模板已经给出了端口部分的代码、接口变量的声明和例化语句映射等。我们要做的就是将测试代码填入到 testbench 合适的位置。 这里简单的写一下时钟、复位驱动代码,如下图所示。 l35l2is4.png图片 将 testbench 添加到工程中 点击:Assignments -> Settings -> Simulation 在 Compile test bench 选项中,选择 new,设置 Test bench name,并通过 File name 查找的方式,将上一步生成的 .vt 文件添加到工程中。 需要注意的是,testbench 文件名字需要和 testbench 里的 top module 名字保持一致,否则后续启动 Modelsim 时会报错,不能进行正常的仿真。 l35l2w7o.png图片 重新一键编译 此时,你会发现,Tasks 栏编译的状态变成了问号,需要重新进行一键编译。 l35l3k7f.png图片 调用 Modelsim 仿真 点击:Tools->Run simulation Tool->RTL Simulation 这时就会自动启动 Modelsim 软件。 Modelsim 操作这里不做具体介绍。 由仿真图可知,我们的设计完成了 10 进制计数的基本功能。 l35l42j9.png图片 总结 记忆中,Quartus II + Modelsim 的联合仿真功能既强大,又安装方便。几年后重新进行此过程,发现步骤也有些许繁琐,花费了我一晚上的时间来搞定。很多细节也在上面提出,多多注意就好。不过,大家以后有机会进行大型的数字模块仿真时,就会发现此方法的有效性。 在接下来的教程里,有些简单的仿真可能用其他软件进行,截图界面可能与 Modelsim 不一致。大家看到后不用怀疑仿真的准确性,这里特别说明。 设计模块与 testbench 源码也会全部给出,大家完全可以自己仿真、验证。
FPGA&ASIC
刘航宇
4年前
0
963
2
2022-05-14
ASIC/FPGA应该学习Verilog还是VHDL?
摘要选择Verilog或VHDL取决于个人需求。VHDL强类型,易于初学者避免错误,但Verilog更简洁,更接近C语言,代码量少。Verilog在仿真功能和市场占有率上优于VHDL,尤其在国内外趋势中更受欢迎。关键词:ASIC, FPGA, Verilog, VHDL, 仿真功能目录 正文 常识讨论 数据分析 结束语 正文 对于FPGA或者ASIC的初学者来说,选择哪种语言貌似应该根据自身的需求而定,例如实验室项目需要使用哪种语言,或者实验室师兄师姐使用了哪种语言,或者导师推荐你学习哪种原因,这都是硬性需求了,因为你需要完成项目的接手,所以必须根据要求而来! 常识讨论 但如果你没有这些顾虑呢?该如何做出选择? 这时,您应该注意几点。 VHDL是强类型的。这使初学者更难犯错误,因为编译器不允许您编写有效的代码。Verilog是弱类型的。它允许您编写错误的代码,但更为简洁。 Verilog看起来更像C之类的软件语言。这使熟悉C的人更容易阅读和理解Verilog的工作。 VHDL需要大量输入。Verilog通常只需要较少的代码即可完成相同的操作。 VHDL是非常确定的,因为在某些情况下Verilog是不确定的。 当然,这里并不是评论Verilog或者VHDL的优劣的,对于语言的选择是根据需求而定的! 有人喜欢用Verilog,自然喜欢它的优点,也能包它的缺点,VHDL也是如此! 例如1995年OVI主题演讲时,时任Cadence首席执行官的Joe Costello,认为: VHDL is one of the biggest mistakes the Electronics Design Automation industry has ever made. A $400 million mistake. Wouldn’t this money have been better spent on handling sub-micron design, testability issues, or even a new type of HDL that had significantly more capabilities than what Verilog and VHDL offer today? 翻译过来就是: VHDL是电子设计自动化行业有史以来最大的错误之一。4亿美元的错误。这笔钱不会花在处理亚微米设计,可测试性问题,甚至是比Verilog和VHDL提供的功能明显更多的新型HDL上吗? 这明显是对VHDL的负面评论! 这也很好理解:在那些年里,Verilog和VHDL是主要的HDL竞争者,而Cadence主导了Verilog仿真市场。 也有一些反对Verilog的声音,大概是认为: 一方面,如果仅存Verilog,那么是形成垄断,垄断并不符合行业及其客户的普遍利益。有了垄断,就没有竞争。当竞争消失时,创新也会消失。 另一方面,诟病Verilog的编程陷阱?例如非阻塞赋值等等! 对于事情的好坏,声音总是很多,都是利益相关,这与我们的主题无关,到此为止! 数据分析 下面我们来从更多的数据方面看看Verilog还有VHDL的对比情况: 谷歌网页搜索热度: 全球 图片 红色代表Verilog,蓝色代表VHDL,可以明显看出Verilog从追赶到反超的这样一个事实(还有一点有趣的是,很多年龄较大的领导或者导师更熟悉VHDL,和他们所处的年代有关!),我们把时间线拉近感受一下: 图片 从2018年初至今,Verilog的搜索热度还是高于VHDL,这是一个趋势! 中国 上面是全球的情况,那么对于中国来说呢? 图片 可见,大概2008年以前还平分秋色,但是之后,Verilog热度越来越大于VHDL! 结束语 考虑到国内大势,Verilog更受欢迎!verilog强大的仿真功能,相比之下VHDL的仿真功能弱爆了。verilog这么多年的市场占有率远胜于VHDL,除了一些以前的设计需要支持以及很多学校还是以VHDL教学,基本用的很少了。
FPGA&ASIC
# VLSI
刘航宇
4年前
0
680
2
2022-05-07
智能无源感知技术简介
摘要无源感知技术通过设备发射无线信号,接收反射信号获取信息,应用于人机交互、健康监护等领域。该技术具有非接触、低成本等优势,正推动智能设备发展。关键词:智能无源感知技术, 无线信号, 人机交互, 软件定义设备, 智能MEMS传感器图片 什么是无源感知?——设备发射无线信号(例如WIFI、声波、RFID、光以及毫米波等),无线信号被待检测对象反射,特定路径的信号返回到接收设备,通过对获取的无线信号进行信号处理等流程获取待检测对象的信息。 生活中的无源感知广泛应用于人机交互、软件定义设备、健康监护及行为识别等领域,比如老人跌倒监测、Google Pixel 4手势识别、超声波VR交互、基于RFID的软件定义转速仪等。 而当今社会中的人机交互领域,目前已经催生出机械设备人机交互、可穿戴设备人机交互与无源感知人机交互三大应用,其中的无源感知由于其与设备间的隔离状态,可操作性更强、卫生性也更好。 软件定义设备,自1883年Warren S.Johnson发明全球首台恒温器,近年来已经由机械型传感器进化为固体传感器、智能MEMS传感器,时至今日,无源感知为基础的新型传感器已经成为最新的科技产物。 该技术拥有三大特点:声波的短波长提供细粒度特征、声波在空气中自由传播提供非接触感知方式、基于智能移动设备的低成本软件开发。而创新思路主要为设计具有物理强关联特征的提取方法,采用多维信号智能融合。
通信&信息处理
刘航宇
4年前
0
807
2
GNURadio-软件无线电入门教程
摘要本文介绍了GNU Radio软件无线电框架,包括其概述、工作原理、安装配置以及使用GNU Radio Companion进行流程图创建。文章详细讲解了如何使用GRC进行信号处理模块的搭建和调试,并提供了实际操作示例。关键词:GNU Radio, 软件无线电, 数字信号处理, SDR, GNURadio Companion目录 第一章 GNURadio 和软件无线电概述1.1什么是 GNU Radio 1.2为什么我们要使用 GNU Radio 1.3关于数字信号处理 1.4GNU Radio 是如何工作的 第二章 GNU Radio 软件安装与配置2.1操作系统的选择 2.2Linux 环境下的直接安装 2.3Linux 下使用PyBOMBS 辅助自动从源码构建 2.4Linux 下手动从源码编译构建请参阅: 2.5Windows 环境下的安装 2.6Mac OS X 环境下的安装 第三章 教程初阶3.1熟悉使用 GNU Radio Companion 第一章 GNURadio 和软件无线电概述 1.1什么是 GNU Radio GNU Radio 是一个软件框架,使用户能够设计、模拟和部署功能强大的软件无线电系统。它是一个高度模块化的,面向“流程图”的框架,带有一个全面的处理模块库,可以轻松组合并构成复杂的信号处理系统的应用程序。 GNU Radio 已用于大量的无线电应用程序。包括音频处理,移动通信,跟踪卫星,雷达系统,GSM,数字无线电等等,所有这些都在计算机软件中使用。 1.2为什么我们要使用 GNU Radio 以前,在开发无线电通信设备时,工程师必须先开发用于接收并处理特定信号的接收机, 来对特定信号传输进行解码或编码。随着数字信号处理与其算法越来越复杂,这些信号处理的平台也变得越来越复杂,通常需要较为高速的 ADC、FPGA 以及能将实时数据串流到计算机平台的连接芯片等,每个系统所对应的硬件平台不一定是一样的,这就带来了巨大的开发成本。通过使用软件无线电(SDR)设备进行模拟信号处理,在相同的硬件平台上可以同时兼容运行各种不同的软件程序,不仅节约了开发成本,也提高了开发新系统的效率。 1.3关于数字信号处理 作为一种软件框架,GNU Radio 通过硬件平台串流的比特数据流输入到计算机中,并在操作系统中运行相应的应用程序以此达到对特性信号进行处理的目的。 我们都知道计算机只能处理数字信号。如何去理解数字信号呢? 简单举个例子:当你想要录制一段人声的时候,说话的人会产生声音信号,该信号由震动导致周围气压发生变化而产生。这样一个时变的物理量就是一种信号。 图片 当空气波到达麦克风时,麦克风将变化的压力转换为电信号,即可变电压 图片 现在我们已经将信号转化为了电信号,在一些模拟系统中,已经可以开始对信号进行处 理。但是对于我们的计算机系统,一个数字的系统,这还远远不够。为了使计算机能够处理这样的数据,我们还需要满足两个条条件:1.是有限点数的 2.是在有限时间之内的 图片 因此,该数字信号可以由称为样本的数字序列表示。采样之间的固定时间间隔直接影响到采样率。提取物理量(电压)并将其转换为数字样本的过程由模数转换器(ADC)完成。相反,我们还有数模转换器(DAC),可从将计算机中提取数字序列转换为模拟信号。 现在我们已经有了一个数字序列,我们的计算机就可以使用它进行各种操作。 图片 同样,电磁波显然也是一种波,它跟声波有许多相同的性质。我们可以用天线将变化的电信号发射出去,这个电信号一般位于一个较高的频率上,可以是数百 KHz 到 GHz。通过使用软件无线电接收机,我们可以接收并对这些信号进行处理,以此进行我们想要的操作。 1.4GNU Radio 是如何工作的 在 GNU Radio 中,为了处理数字信号,我们可以使用简单的流程指示箭头将其连接: l1psgx5b.png图片 在上图中,Signal Source 即为信号源,左边的输入接口可以输入频率参数,右边的输出接口可以输出音频数据流。右边的 Audio Sink 为音频接收器,允许通过扬声器或其他音频设备播放出输入的信号。这就构成了一个十分简单的流程图,点击软件中的运行按钮即可非常简单快捷的编译流程图并运行。 GNU Radio 是一个框架,用于开发这些处理模块并创建流程图。软件自带大量的处理模 块,在这里简单举例一些: Waveform Generators 信号发生器 Constant Source 常数源(可以理解成直流分量) Noise Source 噪声源 Signal Source (e.g. Sine, Square, Saw Tooth) 信号源 Modulators AM Demod AM 解调 Continuous Phase Modulation 连续相位调制 PSK Mod / Demod PSK 调制/解调 GFSK Mod / Demod GFSK 调制/解调 GMSK Mod / Demod GMSK 调制/解调 QAM Mod / Demod QAM 调制/解调 WBFM Receive 宽带 FM 接收机 NBFM Receive 窄带FM 接收机 使用这些模块,我们只需要进行相应的连接操作,就可以快速搭建数字信号处理系统。另外,当然你也可以自己开发新的 block,或者将现有的块与其他软件结合在一起,开发出新的功能。 因此,GNU Radio 主要是用于开发信号处理模块及其交互的软件框架。它带有广泛的标准块库,开发人员可以在其中构建许多系统,是十分方便的软件无线电开发工具。 第二章 GNU Radio 软件安装与配置 GNURadio 的官方 GitHub 页面为 https://github.com/gnuradio/gnuradio。其首页中也明确说明了对于不同操作系统的不同安装方式。 2.1操作系统的选择 我个人最推荐使用 Ubuntu18.04 我在这个系统版本上搭建过很多次所需要的环境,没怎么出过问题,使用一直很稳定。19 版本或许可以,我没有尝试过,但是 20 版本一定不可以, 因为有接到过软件报错的情况报告。 2.2Linux 环境下的直接安装 对于GNU Radio,如果只是简单轻度使用我就建议大家直接使用 Linux 的二进制软件包安装。最快捷方便而且最重要不容易出错。根据 GNURadio 官方 GitHub 界面,首先的安装方式也是直接使用 apt 安装。 以下命令适用于 Debian,Ubuntu 及其衍生版本。它将使用 Python2 安装 GNURadio 3.7 版 sudo apt install gnuradio 对于以上操作系统,直接执行这条命令即可安装完成。如果遇到报错建议自行查询报错信息解决。对于其他 Linux 发行版,请查阅: https://wiki.gnuradio.org/index.php/InstallingGR#From_Binaries 2.3Linux 下使用PyBOMBS 辅助自动从源码构建 PyBOMBS 是安装GNURadio 以及相关软件工具的一个快捷工具。你可以使用它来安装各种 SDR 设备所依赖的支持库,绝大部分操作都是全自动的。 PyBOMBS 是方便用来从源代码构建 GNU Radio,UHD 和各种 Out of Tree(OOT)模块,然后将其安装到指定的用户目录中的工具。在使用之前,PyBOMBS 会检测用户的操作系统并在构建的第一阶段加载所有先决条件(可能会出现各种花式报错)。如果你对于自己解决 Linux 环境配置问题不是很有信心,我不建议你使用这种方法安gnuradio。 注意!!:GitHub 中详细描述了安装的步骤,请自行参阅: 项目地址:https://github.com/gnuradio/pybombs 因为它是从源代码安装GNU Radio,所以第五步可能需要一些时间,要进行更快的安装, 请参阅 https://wiki.gnuradio.org/index.php/InstallingGR#Ubuntu_PPA_Installation 2.4Linux 下手动从源码编译构建请参阅: https://wiki.gnuradio.org/index.php/InstallingGR#From_Binaries 2.5Windows 环境下的安装 在 Windows 环境下,官方提供了非正式版的 GNU Radio 3.7 和 3.8 的安装文件,虽然我也不推荐你真的在 Windows 平台运行这个软件,但是它在 Win 平台是真的可以使用的。不管是 USRP 还是 PlutoSDR,有驱动程序的话就可以使用。对于 USRP,可能存在固件版本的问题,按照教程后面的解决办法是可以解决的。 相关的安装软件包在这里下载:http://www.gcndevelopment.com/gnuradio/index.htm 2.6Mac OS X 环境下的安装 你是认真的? 请参阅:https://wiki.gnuradio.org/index.php/MacInstall 第三章 教程初阶 3.1熟悉使用 GNU Radio Companion 学习目的: 使用标准块库创建流程图 了解如何使用检测模块 Sink 调试流程图 了解GNU Radio 中的采样和调节功能 了解如何使用文档找出模块的功能 在本教程中,我们将从简单框图开始,探讨如何使用 GNU Radio 的图形工具GNU Radio Companion(GRC)来创建不同的框图。GRC 是为了简化 GNU Radio 而诞生的,有了它, 我们可以以图形化编程的方式创建 python 脚本,替代了传统的复杂代码编写,进而降低软件无线电编程的入门门槛。 那么我们开始。首先打开终端,输入以下指令。 $ sudo gnuradio-companion或者直接单击软件图标,也是可以运行软件的。 图片 如果你发现不仅应用程序中没有出现软件图标,而且终端也不能打开这个软件,那么你的安装很有可能出现了问题。请检查安装是否存在问题。 这里有一点区别。当你通过终端运行 GRC 时,下图绿色部分的终端会同时在系统终端里显示。而如果直接通过点击软件图标运行则只能在GRC 的终端面板中观察信息。 图片 首先我们来介绍软件界面。总共分为五个部分:库,工具栏,终端,工作区和变量。 红色区域为工具栏部分,放置了平时最常用的工具,比如运行、停止、编译等重要功能按键。 l1psl5it.png图片 新建、打开、保存、关闭 l1q067qo.png图片 打开/关闭变量编辑器、截图、剪切、复制、粘贴、删除选中模块 l1q06j9q.png图片 查看错误信息、编译流程图、执行流程图、停止运行流程图 l1q06to8.png图片 撤销、重做 l1q074k2.png图片 启用选中模块、禁用选中模块、绕过选中模块、反转禁用连接/模块的状态 l1q07e6n.png图片 查找模块、重置模块、打开选中阶梯模块源码 蓝色区域即为我们绘制具体流程图的地方。我们可以将右边灰色部分库中的模块拖入蓝色区域,并且将他们通过箭头连接起来,这样就可以构成一个真正的信号处理系统。 黄色部分显示的是当前框图中所使用到的变量。在蓝色部分的左上角可以看到两个方框, 分别是 Options 与 Variable,这两个是创建工程时就会自动创建的。 在界面的右边灰色区域中,存放了大量可以用于拖拽到流程图中的模块。其中有很大一部分是软件安装时就自带的,如果你安装了其他gnuradio 附属的插件脚本,也会一并显示在框中,通常自行安装的会显示在最后面。 图片 因为模块非常多,因此平时寻找想要的模块时一个一个手动翻找会非常麻烦。此时可 以点击工具架上的放大镜图标,或是输入 Ctrl + f 输入该块的关键字进行检索,就可以更容易的找到这个block。 例如,这里我们输入 sink(接收器),就可以看到包含单词“接收器”的所有块以及将在其中找到每个块的类别。 l1q08cz9.png图片 现在,我们来添加一个名为 QT GUI Time Sink 的块,方法是单击其名称并将其拖动到工作区中,或者双击其名称以将其自动放置在工作区中。 图片 工作区包含构成流程图的所有块,在每个块内部都有不同的块参数,但是,每个新流程图都需要有一个特殊的块,称为“选项块”。让我们双击选项块以检查其属性。 双击opthions 模块可以看到它的具体内容。Options 中包含了工程的特殊参数设置,每个流程图仅允许存在一个这样的选项模块。 图片 上面的 ID,title,author,description,分别表示这个流程图的 ID,标题以及作者和简介。该块的 ID 决定了生成文件的名称和类的名称。例如,一个 ID 为 top_block 的文件将生成文件 top_block.py 和 top_block 类。 Cavans Size 窗口大小控制流程图编辑器的尺寸。窗口大小(宽度,高度)必须介于 (300,300)和(4096,4096)之间。 Generate options 生成选项控制生成的代码的类型。非GUI 流程图应避免使用带有GUI 的组件或图形变量控件。 Run:流程图的运行可由变量控制,以在需要时启动和停止流程图。 Max number of output 最大输出数是流程图中任何方框所允许的最大输出项数;要禁用此功能,将max_nouts 设置为 0 即可。使用此功能可以调整流程图可以显示的最大延迟。 可以注意到另一个关键的东西。我们可以输入信息的字段中存在的不同颜色。这些实际上对应于不同的数据类型,我们将在本教程的后面部分介绍这些数据类型。 GRC 将我们在编辑器中创建的流程图转换为Python 脚本。因此当我们执行流程图时, 实际上是在运行编译好的Python 程序。ID 用于命名该 Python 文件,该文件与.grc 文件保存在同一文件夹内。默认情况下,ID 是默认值,因此它将创建一个名为 default.py 的文 件。更改 ID 可让我们更改保存的文件名,以便更好地管理文件。在 GNUradio 3.8 中,如果不更改默认 ID,则会收到错误消息,因此需要更改此 ID 才能运行流程图。 l1q0acje.png图片 Variable 即变量,它的 ID 是 samp_rate,你可以在框图中的其他地方调用这个变量。 例如: l1q0amjo.png图片 这样这里的数值就会随着该变量的变化而变化。 如果你点进了设置面板的第三个选项卡,就能看到有关这个block 的文档。通常情况下正规的 block 都是会写使用文档的,当然少数自定义的模块可能是没有的。 虽然这些说明是英文的,但是我十分建议大家自己去用谷歌等工具翻译一下这些文档,因为教程不可能每个详细的点都能讲到,有时还是得靠自己查一查的。 l1q0b5kp.png图片 如果我们删除了一个重要的参数,或是填入了什么不正确的参数,以至于我们的框图无法正常运行,那么此时你会看到执行按钮变成灰色不可点击的状态。此时报错信息按钮亮起,并且在出现错误的block 上,它的名称出现了红色的高亮显示。 l1q0bis5.png图片 你可以点击这个按钮,就可以看到存在问题的错误信息。 l1q0bsmb.png图片 在错误信息中,详细指出了错误出现的位置(如果看不懂就用翻译工具翻译一下,不过英语这么差我建议你直接放弃,这玩意高中生都能看懂。#日常劝退)我们只需要按照报错信息所提示的位置:模块-top block-选项中的一个参数:max_nouts l1q0c3uy.png图片 双击打开这个模块,就可以看到在模块中也存在同样的错误信息提示位于正下方。 l1q0cmos.png图片 错误明确指出,在这个输入框中数值“”不能被接受,因为这里必须填写的是一个数字, 我们填写数字 0 进去后点击确定,即可发现错误信息已经消失。执行按钮也亮起,说明框图无明显错误,可以正常运行。 现在,我们对如何找到块,如何将它们添加到工作区以及如何编辑块属性有了更好的了解,下面我们随意以几个 block 组成一个框图来进行简单的演示。 刚才我们拖入了 QT GUI Time Sink 这个模块,这是个图形接收器,可以同时显示多个信号。接下来我们搜索并向流程图中添加 Signal Source(信号源)模块,和 Throttle(节气门)模块,有关这几个模块详细的说明将在之后的教程中详细讲解,现在只需知道此块会限制流程图的某些数据即可,以确保它不会占用 100%CPU 资源导致电脑直接卡到裂开。 l1q0daor.png图片 “生成流程图”,“ 执行流程图”和“终止流程图”的快捷键分别为 F5,F6 和 F7。你可以在我们刚刚提到的工具架上点击这些按钮,或者直接按快捷键来进行相关的操作。当你按下生成流程图按钮之后,软件就会自动将你刚才绘制的流程图转化为一个 python 脚本文件。单击执行流程图按钮之后,就可以看到以下运行结果。 l1q0dl85.png图片 如果你不想运行了,只要点击终止流程图即可停止当前运行的程序。这样我们的第一个流程图就成功运行了。这是一个从信号源产生信号,经过限流器限制后输出到 time sink 进行接收并显示到屏幕上的操作。 你可以注意到这里有两根数据曲线被绘制出来,他们都来自于 Data 0,蓝色的曲线为Re(实部),红色部分为 Im(虚部)。 如果你根本不知道Re 和 Im 是什么个玩意儿,那么我建议你先学习下我们电子通信类专业的一门必修课程《复变函数》,这将会对你的系统性学习产生很大的帮助。 l1q0e32p.png图片 (有意思的是这两个信号的相位差正好为 ,这对于我们的零中频(Zero-IF)接收/发 2 射机有至关重要的意义,不过这个咱们以后有机会再提。) 在这个流程图中,我们很轻松的就把所有的block 连起来了,轻松的离谱你不觉得吗? 没有出现任何头疼的问题或是错误。那么有没有会出现错误的情形呢?当然有,而且经常会有。 Source IO size "8" does not match sink IO size "4". 源 IO 大小“ 8”与接收器 IO 大小“ 4”不匹配。 这似乎是一个和数据类型有关的报错。既然出现了这个错误,那么就说明我们还没有搞懂框图输入输出的数据类型到底是个什么玩意儿。那么现在就让我们点击软件上方的 help,这里面有对于数据类型的说明。 图片 图片 (最上面那个棕色的看的不是很清楚,不过这问题不大,你用鼠标把它选中高亮就能看清了。) 我们可以看到在许多编程语言中都可以看到的常见数据类型。在我们刚才搭建的流程图中,你可以注意到所有连接的模块端口均是蓝色的,这代表当前所传输的数据为Complex Float 32 类型,这意味着它们同时包含实部和虚部,并且每一个都是 Float 32 类型。我们可以推断出,当“Time Sink 时间接收器”采集到这样一个Complex 的数据类型时, 它将在两个不同的通道上同时输出实部和虚部的图像,也就是我们刚才看到的红蓝两种颜色的图像了。 现在进入其 Signal Source 的属性面板,并更改“输出类型”参数,将信号源更改为浮点型输出。此时我们传输的数据流是一个普通的 32 位浮点数。 图片 图片 可以看到现在我们所有连接的点均变成了橘色,(当然 throttle 也要调整,别问我为什么它还是蓝色的),这也就说明了目前数据类型均匹配,当然刚才出现的报错也就消失了。 图片 有同学发现 throttle 的输出连接了两个 block。不同的节点之间是可以支持多条同样的数据链路的,这是非常方便的一点,也是绝大部分图形化编程界面都具有的功能。可以注意到刚才的两条线此时变成了只有一条线,这是因为我们刚刚修改了数据类型。 现在让我们来尝试一些更复杂的框图吧。 图片 运行结果如下: 图片
通信&信息处理
# 软件无线电
刘航宇
4年前
0
6,094
6
2022-04-07
西北大学模拟电子技术个人考研笔记
摘要西北大学模拟电子技术考研笔记分享,包含历年真题及个人学习笔记,供考研学子参考。关键词:西北大学, 模拟电子技术, 考研笔记, 历年真题, 843, 849西北大学843、849历年真题 下载地址:https://wwaqw.lanzoue.com/i2nMY2g3qh4j 提取码: 警告 若个人或辅导机构 擅自复制本文直接或间接盈利 、请向我举报,举报方式见下面,本人以 著作权法 追查到底!同时核查该机构/个人 是否有非法出书情况 、是否有 出版权与书号 , 一并交于公安机关追查 ! 本站域名由sciarm.com更变为ee.ac.cn 和下文页面中信息不冲突 举报方式-请携带证据举报 1.邮箱hyliu@ee.ac.cn 2.点击博客中留言或私聊都可
嵌入式&系统
我的随笔
# 电子线路
刘航宇
4年前
0
1,926
33
UltraSE: Single-Channel Speech Enhancement Using Ultrasound阅读感悟
摘要UltraSE利用超声波传感和深度学习技术,从噪声中分离说话者语音,显著提高语音清晰度和质量,优于现有语音增强方法。关键词:UltraSE, Single-Channel Speech Enhancement, Ultrasound Sensing, Deep Learning, Multimodal Fusion目录 一、论文基本信息 二、论文主要内容2.1 研究的背景 2.2 研究的目标 2.4 困难与拟解决对策, 2.5 技术优势 2.6 研究技术简述 2.6.1 ULTRASE DNN 模型概述2.6.2 基于 CGAN 的跨模态训练 2.6.3 ULTRASE 实现 2.7 研究验证2.7.1 微基准比较 2.7.2 消融研究 2.7.3 系统效率 2.8 文章结论 三、阅读理解与心得 参考文献 一、论文基本信息 作者 :孙科(加州大学圣地亚哥分校); 张新宇(加州大学圣地亚哥分校) 出版源 :第27届移动计算和网络国际会议论文集2021年10月第160-173页 摘要 :鲁棒语音增强被认为是音频处理的圣杯,也是人机交互的关键要求。用单通道、纯音频方法解决这个任务仍然是一项艰巨的挑战,尤其是在涉及相互竞争的扬声器和背景噪声混合的实际场景中。在本文中,我们提出了UltraSE,它使用超声波传感作为一种补充模式,将所需说话者的声音从干扰和噪声中分离出来。UltraSE使用商用移动设备(例如智能手机)发射超声波并捕捉说话者发音手势的反射。 它引入了一种多模态、多领域的深度学习框架来融合超声多普勒特征和可听语音频谱图。此外,它还利用一个基于跨模态相似性测量网络的经过对抗性训练的鉴别器来学习两种异质特征模式之间的相关性。我们实验验证了UltraSE同时提高了语音清晰度和质量,并且大大优于最先进的解决方案。 二、论文主要内容 2.1 研究的背景 人类听觉系统非常有能力在干扰扬声器和噪音的混合中挑选出语音源,这仍然是机器听觉的基本挑战。在当今人机交互和人机交互的数字通信系统的激增下,但这个问题仍然存在。示例:移动VoIP、语音命令、现场语音的后期制作等。语音分离与增强(SSE)的相关研究问题通常被认为是音频处理的圣杯。经典解决方案需要依赖先验知识(即每个扬声器的特征工程)或[1] 定向麦克风阵列来将所需的源与环境声音隔离开来。在过去的几年里,深度学习技术已经激增并显着推进了该领域,实现了单麦克风扬声器独立SSE。在分离2个净语音的混合物时,最先进的解决方案已证明平均音频质量提高了约 10 dB。然而,超过2个扬声器与背景噪声混合的具有挑战性的情况很少受到关注。最近的一个初步测试表明,现有的深度学习模型在这种情况下通常表现不佳,因为非结构化背景噪声损害了它们识别语音流中可分离结构的能力。此外,现有的纯音频方法无法解决标签排列问题,即将模型输出与所需的说话者相关联。视听算法利用说话者面部的视频记录来同时解决SSE和排列问题。然而,在特定视角和可调节照明条件下对相机的需求限制了它们的实际可用性[2]。 2.2 研究的目标 利用超声传感作为一种补充方式,将所需的说话者语音与噪声和干扰分开。 这种方法称为 UltraSE,适用于配备单个麦克风和扬声器的商品移动设备(例如智能手机)。 图1说明了该文的基本思想。在录音过程中,UltraSE 不断发出听不见的超声波,该超声波由靠近智能手机的说话者的发音(嘴唇运动)调制。 因此,麦克风记录的信号既包含可听见的声音,也包含听不见的反射。如图1 所示,虽然可听声音(“绿色”)混合了目标清晰的语音(“黑色”)和其他干扰以及背景噪声(“蓝色”),但听不见的反射(“橙色”)仅捕捉目标用户与清晰语音相关的发音手势动作。UltraSE采用DNN框架捕捉这种相关性,并对可听声音进行去噪 图片 图1:UltraSE 针对用户手持智能手机在嘈杂环境中录制语音的场景。UltraSE 使用超声波传感作为一种补充方式,将所需说话者的声音与干扰分开。 2.4 困难与拟解决对策, 问题一:尽管存在干扰,如何通过超声波描述发音姿势?捕捉精细的发音手势是一项挑战,因为它们速度快(80厘米/秒),位移小(小于5厘米)。此外,由于谐波和硬件伪影,语音和超声波之间存在相互干扰 解决对策:充分利用了超声波的优势,即高采样率和与时间域中清晰语音的完美对齐。作者设计了发射超声波形来捕获短期高分辨率多普勒频谱图,并采用一次性发射体积校准来减少跨模态干扰。 问题二:如何设计一个 DNN 模型来融合这两种模态并表示它们的相关性?没有现有方法能够解决作为 UltraSE 基础的跨模态降噪问题,即使用一种模态(超声波)来重建受噪声/干扰污染的另一种模态(语音)。 解决对策:由于两种模态的物理特征特征不同,我们设计了一个双流 DNN 架构来处理每个模态,并设计一个自注意力机制来融合它们。 此外,作者提出了一种基于条件 GAN (cGAN) 的训练模型,该模型具有新颖的跨模态相似性测量网络,以实现这种能力。 问题三:如何提高增强语音的清晰度和质量? 解决对策:时频 (T-F) 频谱图的幅度对于语音清晰度至关重要,而相位决定了语音质量。作者将 UltraSE 扩展为两阶段多域 DNN 架构,该架构优先优化 T-F 域中的清晰度,然后在T域中重构相位以提高语音质量。根据经验观察,我们将多模态融合网络置于 T-F 域内,即发音手势与语音清晰度更相关。 2.5 技术优势 纯音频语音增强:利用T-F 域方法、T域方法和多领域方法对非语音噪声表现出可接受的性能,但它们仍然无法处理涉及多个干扰。为了解决此类语音分离问题,Deep clustering 为每个源训练语音嵌入,然后使用聚类算法将它们分离。PIT在训练过程中迭代地改变源的排列,以训练一个排列不变的语音分离模型。这些方法仍然需要先验地知道说话人的数量,并且不适用于超过3个说话人加上噪声的情况。此外,标签排列问题仍然存在——它们可以分离多个语音源,但不能自动识别哪个来自目标说话者,这可能会阻碍某些机器操作的后端任务(例如,智能手机上的语音助手)。UltraSE克服了所有这些缺陷。 多模态语音增强为了解决排列问题:视听(AV)方法使用对象面部的视频记录作为音频的提示,有许多缺点。例如除了麦克风之外,他们还需要一个额外的摄像头,在良好的光照条件下指向拍摄对象的脸部,这在许多典型用例中是不方便的,甚至是不可行的。此外,相机在许多对隐私敏感的地方无法使用。前人探索了使用超声作为增强语音的补充方式的想法。然而,这些作品都需要特殊的超声波硬件。相比之下,UltraSE 只需要智能手机上的单个音频通道,并克服了模态之间的相互干扰等实际挑战。此外,他们使用传统的方法,即非负矩阵分解和非线性回归,只显示了对环境噪声的语音增强性能,而不是语音干扰。UltraSE 通过设计多模态多域 DNN 框架进一步突破了这一想法的极限,以实现与视听方法类似的语音分离和增强性能。 无需设备的超声波传感:无设备超声波传感技术可以利用商品移动设备上的扬声器和麦克风来跟踪附近物体的距离/方向变化。最先进的超声波手势跟踪方案可以达到毫米级的精度。 除了位置和手势跟踪,最近的研究还尝试使用超声波传感进行唇读[41]。 然而,由于空间分辨率不足,它们只适合粗略的传感应用,相比之下,UltraSE 率先展示了超声波传感可以作为一种补充方式来解决鸡尾酒会问题并将语音增强提升到一个新的水平。 2.6 研究技术简述 UltraSE 代表了首个使 SSE 性能接近多通道解决方案的纯音频方法,同时克服了标签排列问题。下面简述出三个重要技术贡献: • 作者设计了一个多模态多域 DNN 框架,用于单通道语音增强,融合了超声和语音特征,同时提高了语音清晰度和质量。 2.6.1 ULTRASE DNN 模型概述 第一步是从原始信号创建 DNN 输入特征。然后,我们设计一个两阶段、多模态、多域的 DNN 模型,该模型包括三个关键模块,简述如下。 T-F 域多模态振幅网络模块通过使用语音和超声波作为输入来生成幅度理想比率掩码 (aIRM),即净和噪声频谱图的幅度之间的比率。它由两个子网组成。 子网 (i) 双流特征嵌入:我们的模型首先使用嘈杂语音的 T-F 频谱图和并发超声多普勒频谱图作为输入。然后,我们设计了一个双流特征嵌入架构,将不同的模态转换到相同的特征空间,同时保持它们的时域对齐。 子网 (ii) 语音和超声融合网络:然后,我们在频率维度上连接每个流的特征。进一步应用自我注意机制来融合级联特征图,让多模态信息相互“串扰”。融合的特征随后被送入 BiLSTM 层,然后是三个 FC 层。结果输出是一个幅度掩模,它与原始噪声幅度谱图相乘以生成幅度增强的T-F 谱图。 图片 图2:UltraSE的多模态多域 DNN 设计概览。卷积层表示法:Channels@Kernel size 如图3说明了DNN 输入特征的预处理步骤工作流程。 l1ev5znd.png图片 图3:DNN 输入特征设计 l1ev76fq.png图片 图4:UltraSE基于cGAN的跨模态训练概览 基于cGAN 的跨模式训练,如图 4 所示,我们设计了一种基于 cGAN 的训练方法,以进一步去噪幅度增强的T-F频谱图。在我们的cGAN 模型中,生成器就是上面的 T-F 域多模态幅度网络;鉴别器被设计成鉴别增强的频谱图是否对应于超声传感特征。T 域相位网络。我们使用iSTFT(一个固定的 1D 卷积层)将幅度增强的 T-F 频谱图转换为T域波形。为了微调增强信号的相位,我们设计了一个编码器-解码器架构来重建相位以接近 T 域中的净语音。 • 作者设计了一个基于cGAN 的跨模态训练模型,该模型有效地捕捉了超声和语音之间的相关性以进行多模态去噪。 2.6.2 基于 CGAN 的跨模态训练 UltraSE 的基本问题是多模态降噪,即使用一种模态(超声波)来恢复被噪声/干扰污染的另一种模态(语音)。前者感知分辨率低,但无干扰,与后者相关。尽管我们有意保持两者之间的时间对齐,但很难强制多模态融合网络“理解”这种多模态相关性,因为传统的损失函数(例如MSE)只能训练网络来清理端到端的TF频谱。 因此,我们提出了一种基于 cGAN 的训练方法,该方法隐含地将跨模态相关性的最大化本身作为训练目标。 任何GAN设计中的一个关键要素是定义鉴别器使用的相似度度量。与在相同类型特征之间进行比较的传统 GAN 应用程序(例如图像生成)不同,我们的跨模态 cGAN 需要区分增强的 TF 语音频谱图是否与超声多普勒频谱图匹配(即,它们是“真实的”还是“假”对)。 我们提出了一个跨模式的 Siemese 神经网络来应对这一挑战。Siamese 神经网络使用共享权重和模型架构,同时在两个不同的输入向量上协同工作以计算可比较的输出向量。它传统上用于测量来自相同模态的两个输入之间的相似性,例如,两个图像。为了启用跨模态连体神经网络,我们创建了两个独立的子网络(图7),旨在分别表征语音和超声的时频域特征之间的对应关系。基本架构下,这两个输入是一个 CNN-LSTM 模型。 由于人类语音在 F 域中包含谐波和空间关系,因此语音 CNN 子网络使用扩张卷积进行频域上下聚合。超声传感的多普勒频移主要包含局部特征。因此,超声 CNN 子网络仅包含传统的卷积层。在卷积之后,使用 Bi-LSTM 层来学习两种模式的长期时域信息。 最后,引入三个全连接(FC)层来分别学习两个可比较的输出向量。 我们强调,这种跨模态设计不共享架构和参数,这与传统的 Siamese 网络不同。 l1ev87c1.png图片 图5:跨模态相似性测量网络的输出 PDF 图5显示了输出的概率密度函数 (PDF),其中较小的值表示较高的相似性。很明显他输出的真对和假对的PDF完美分离,这意味着我们的相似性测量网络可以有效地区分一对语音和超声输入是否由相同的发音姿势生成。 • 我们收集了一个新的语音数据集——UltraSpeech,并与最先进的解决方案相比验证了 UltraSE 的性能。 2.6.3 ULTRASE 实现 传统的语音数据集只包含原始语音,没有超声波传感信号。为了评估 UltraSE,我们创建了一个名为 UltraSpeech 的新数据集,其中包含两者。 数据收集:我们招募了20名流利的英语人士(4名女性,16 名男性,平均年龄 25 岁)来收集 UltraSpeech 数据集。每个参与者被要求在安静的环境中使用 2 种典型的电话持有方式(“电话”模式和“走向麦克风”模式,如图8(b)所示)在 TIMIT 语音语料库[3]中说出至少300个句子。同时,我们使用定制的 Android 应用程序 UltraRecord,通过智能手机底部的扬声器和麦克风以 96 kHz 的采样率发出超声波信号并捕获音频片段。 请注意,我们不限制用户将智能手机与嘴巴保持特定距离。总的来说,我们为每种握持方式收集了8k 5秒净的语音片段。我们遵循现有的 SSE 工作,合成混合生成嘈杂的语音数据集。干扰语音来自 TIMIT 数据集,其中包含 6300 个不同的英语句子,由 630 位说话者生成,总共持续 3.5 小时。环境噪声数据集来自 AudioSet,其中包含来自现实生活的526种噪声类型的超过170万个10秒片段,包括广泛的人类和动物声音、乐器和流派以及日常生活中常见的噪声。此外,我们生成了一个训练集,其中干扰语音和净语音来自同一个说话者。 这被广泛认为是 SSE [4] 最具挑战性的案例,因为干扰具有与所需语音无法区分的相同听觉模式。 我们将其添加到训练数据集中,以强制模型利用除了听觉特征之外的超声特征。我们的训练数据集包含由三星 Galaxy S8 智能手机收集的 15 名参与者的净语音。每个参与者的净语音都混合了 20 种不同的噪音设置。 对于每个噪声设置,干扰扬声器的数量 ? 均匀分布在 [0,4]中,SNR 均匀分布在 [−9, 6] dB(平均为 -1.5 dB)中。训练数据总共包含 120k 5 秒的嘈杂语音片段(300 小时)。 l1evaw7s.png图片 l1evbffv.png图片 我们在 Pytorch 中实现了 UltraSE DNN模型。特征图的维度和每一层的参数如图 2、6、7 和表 1、2、3所示。除了最后一层应用了sigmoid 之外,ReLU 激活跟随所有层。对于训练,我们使用 Adam 优化器,初始学习率为 1? − 04,每 5 个 epoch 下降25%,总共 20 个 epoch。UltraSE有15.5M和3.1M参数用于第一阶段和第二阶段 DNN。 2.7 研究验证 2.7.1 微基准比较 在本节中,我们的默认测试数据集包括另外 5 名参与者在“Towards mic”模式下的净语音,使用三星 S8 收集。我们的测试环境包括 6 种不同的干扰加噪声设置:1? +?、2? +?、3? +?、> 3? +?、2?(“s”和“a”表示干扰扬声器和环境噪声)和最难的情况 >= 2 个同说话者干扰加上噪声 (>= 2?? + ?)。 噪声语音信号的 SNR 水平均匀分布在 [−9, 6] dB 中。 UltraSE 的所有结果都来自从训练数据集生成的单个模型。我们将 UltraSE 与 4 种最先进的 SSE 方法进行比较,PHASEN [5](TF 域方法)、SEGAN(T 域方法)、AVSPEECH (视听方法)、Conv-TasNet(语音分离法)。为了公平比较,我们重新实现了 PHASEN、SEGAN 和 Conv-TasNet,并在 UltraSpeech 数据集上训练和测试它们。PHASEN 和 SEGAN 只使用 1? + ? 训练集,因为它们是为语音增强而不是分离而设计的。PHASEN 和 SEGAN 在 1? + ?(见表 4)下的结果与原始工作相似,这表明了我们实现的正确性。对于语音分离方法,即 Conv-TasNet,我们首先在“2?”环境中对其进行训练和评估,以检查我们实现的正确性。 然后,我们使用“2? + ?”数据集以 2 位说话者的净语音作为基本事实来训练模型,并在表 4 中比较其他环境中的结果。对于AVSPEECH,由于我们的数据集没有录像,我们直接使用[6]中的结果作为基线。 l1evc762.png图片 与最先进的语音增强方法相比,UltraSE 显着提高了嘈杂和多说话人环境中的语音质量和清晰度。表4显示了在 [−9, 6] dB 范围内均匀分布的所有输入 SNR 水平下的测试结果。UltraSE 在所有4个指标上均优于 PHASEN 和 SEGAN。在 1? + ? 环境中,UltraSE 实现了平均 17.25 SiSNR (18.75 ΔSiSNR) 和 3.50 PESQ。在具有多扬声器干扰的其他环境中,超声传感模式的作用更为突出,在2个基线上分别平均提高了 6.04 dB 和 9.77 dB 的 SiSNR。即使对于最困难的情况 >= 2?? + ?,UltraSE 仍可实现 8.97 dB SiSNR 和 2.52 PESQ。 此外,UltraSE 的性能略高于AVSPEECH,这可能是因为超声波特征的采样时间粒度比视频帧更精细,并且可以更好地与语音信号对齐。 大多数现有的语音分离方法只能在有限数量的干扰说话者(2∼3)和没有环境噪声的情况下工作[29,30,73,76]。 如表4所示,当使用“2? + ?”数据集训练 Conv-TasNet 时,Conv-TasNet 在“2? + ?”和“2?”设置中取得了良好的性能,但在其他复杂的设置中表现不佳 环境。 相比之下,在 > 3? + ? 设置下,UltraSE 优于 Conv-TasNet 约 6 dB 的 SDR 或 SiSNR,STOI 为 10%,PESQ 为 24%。 l1evcov7.png图片 图8中的散点图显示了测试数据集中每个句子的输入和输出 SiSNR,其中包括所有 6 个环境。UltraSE 在不同环境和句子中始终如一地实现高性能,平均 14.75 dB SiSNR 增益。 即使在 -9 dB 输入的最坏情况下,增强型语音平均达到 8.86 dB SiSNR。 2.7.2 消融研究 我们进行了消融研究,以更好地了解 UltraSE 中不同设计组件的性能。 这里的测试数据集包括除了“>= 2?? + ?”之外的所有环境,这在实践中并不常见。 表 5 总结了结果。 l1evdhei.png图片 “No T domain”表示没有“T do-main波形语音增强”的DNN模型。 结果表明,该模块几乎不影响 STOI,这是一种语音清晰度指标。 但它有助于分别获得 0.46 dB SDR、0.58 dB SiSNR、0.12 PESQ,这证明它可以进一步提高 T-F 域多模态网络,生成语音的感知质量。 “No cGAN”表示没有“基于 cGAN 的跨模态模型训练”的模型。 应用 cGAN 时,所有指标都显着提高,因为我们的 cGAN 设计迫使网络学习超声和语音之间的相关性,这是 UltraSE 设计背后的关键原则。 “No Fusion Network”是指超声和语音信号的特征图在时频域中直接拼接,没有融合块。 性能略有下降,因为融合块有助于多模态特征相互“串扰”。 “No Ultrasound”表示网络开头没有超声流的网络。 结果变得接近于没有超声传感的传统语音增强方法,例如,PHASEN。 2.7.3 系统效率 时间消耗:我们评估 UltraSE 在 3 个平台上的运行时处理延迟,包括 NVIDIA GTX 2020 (GPU)、Intel i9-9980 3.00GHz (CPU) 和配备 Qual comm Snapdragon 835 CPU 的三星 Galaxy S8 (手机)。前两个对应于 UltraSE 被卸载到受信任的云或边缘服务器的情况。 表6总结了结果。GPU 服务器仅经历 14.85 毫秒的延迟,这对于 VoIP 应用程序来说是可以接受的(最多 150 毫秒 [7])。 智能手机外壳是使用三星 Galaxy S8 上的 Pytorch Mobile [8] 测量的。请注意,最新版本的 Pytorch Mobile [8] 仅支持单 CPU 处理,没有任何 GPU/NPU 支持。 因此,延迟相对较高(处理 5 秒语音需要 25.08 秒),这仅适用于离线处理应用程序,例如音频消息和录音。有大量关于提高智能手机 DNN 效率的文献 [9],表明使用移动 GPU/NPU 可以减少 50 倍以上的延迟。 我们将为我们未来的工作探索这些解决方案。 另请注意,由于使用了 Bi-LSTM 块,UltraSE 需要以 5 秒为单位处理输入。 这意味着它的 SSE 在 5 秒的初始引导期后开始生效。 l1eve81q.png图片 能耗:我们的实验表明,典型的智能手机(Samsung S8)可以连续使用 UltraSE 录制语音,同时发射超声波信号 60.57 小时(不显示)。 我们使用 Android Profiler [80] 进行的测量显示 UltraSE 的 CPU 负载平均为 48.7%,功耗为在 0 到 3 之间的“1”级别。当卸载到服务器时,计算能量消耗变得可以忽略不计。 唯一的开销是 UltraSE 需要将原始的 48/96 kHz 采样率的音频流上传到服务器,然后从服务器下载增强的语音。我们的实验表明,三星 S8 可以在卸载模式下连续运行 UltraSE 并通过 WiFi 上传/下载音频流 10.82 小时。服务器卸载可能会引发其他问题,例如安全性,但这超出了我们当前工作的范围。 2.7.4 泛化采样频率 通过 96 kHz 采样率数据集训练的 UltraSE 模型可直接用于增强以 48 kHz 采样率记录的测试语音。只要超声传感特征的 FFT 窗口长度和跳跃长度分别保持 85 ms 和 10 ms,48 kHz 采样率的特征分辨率与 96 kHz 采样率的情况相同。表5 显示在 96 kHz 采样率训练模型上测试 48/ 96 kHz 采样率数据集时性能下降可忽略不计。 l1evf1bn.png图片 图8:发音手势的 SNR。 握持方式:在“电话通话”模式下(图 8(a)),用户的面部部分遮挡了超声波信号,因此我们训练了一个与“朝向麦克风”模式不同的模型(图 8(c))。 UltraSE 可以使用智能手机内置的基于 IMU 的握持方式检测算法自动选择模型 [81]。 我们的实验表明,在 -1.5 dB 平均输入 SNR 下,由于遮挡,“电话呼叫”(12.47 dB SiSNR)的性能略低于“Towards mic”(13.12 dB SiSNR)。 我们进一步评估了每个模型在不同嘴到麦克风距离下的灵敏度。 图8(b) 和图 8(d) 显示了超声的平均 SNR (SNR?) 与增强语音的 SiSNR。 对于两种握持方式,???? 远远超过 10 dB,语音 SiSNR 在 20 cm 距离内保持在 12 dB 左右。 实验表明,只要嘴到麦克风的距离保持在 20 厘米以内,UltraSE 模型的性能就会始终如一。 运动干扰:我们测量来自 3 种主要运动伪影的干扰影响,即呼吸、手势和行走。 在“朝向麦克风”和“打电话”模式下,分别在嘴巴距离麦克风 15 厘米和 2 厘米时进行了实验。(i) 呼吸频率 (~30 bpm) 远小于关节运动 (> 10 Hz),因此它对 UltraSE 的影响可以忽略不计。(ii) 手势引入与关节运动相似的多普勒效应 [36, 40, 51],这可能造成不可忽视的干扰。我们在推动手势干扰下测量关节手势的 SNR?。 SNR? 在 0° 到 90° 的 7 个不同角度每 2 cm 处进行采样,步长为 15°,靠近用户的嘴。 图 13 显示了“朝向麦克风”模式下 SNR? 的空间分布 [82]。 只要手势距离嘴巴 > 25 厘米(这在日常使用场景中很常见),SNR? 就会保持在 10 dB 以上,这对于 UltraSE 来说已经足够了(图 8)。 麦克风阵列可用于聚焦用户的嘴部区域以进一步减轻干扰 [40],但这超出了 UltraSE 的范围。我们省略了“电话通话”模式,因为麦克风离嘴更近,并且感应 SNR? 保持较高。(iii) 当其他人走近(0.8 m 远)时,我们发现 SNR? 几乎没有受到影响,因为超声音量相对较低,并且用户的嘴更近。 总体而言,发音手势的 SNR? 足够高(> 10 dB),并且 UltraSE 模型在日常使用场景中不受运动伪影的影响。 智能手机的概括:不同的智能手机可能有不同的扬声器麦克风布局。 例如,三星 S8、LG G8S ThinQ 和 VIVO X20 的底部麦克风和扬声器之间的距离分别为 5 毫米、25 毫米和 25 毫米。扬声器和麦克风的高频响应也可能因手机型号而异[83]。 将三星 S8 数据集训练的 DNN 模型直接应用到 LG G8S ThinQ 和 VIVO X20 时,增强语音的 SiSNR 分别变为 9.21 dB 和 9.53 dB。低于同款手机壳13.21 dB),但仍高于无超声传感的 SiSNR(7.68 dB)。 为了保持最佳性能,一种直接的方法是为每个电话模型执行一次训练数据收集。 或者,我们可以使用涵盖典型硬件配置的各种智能手机来丰富 UltraSpeech 数据集。 这留给我们以后的工作。 l1evfc20.png图片 真实环境使用实验:我们要求用户在 4 个不同的真实世界环境中使用 UltraSE,即 1) 带有排气扇和流水噪音的浴室环境(平均 75 dBA); 2)有电视噪音的客厅环境(平均55分贝); 3) 有谈话噪音的室内会议环境(平均 60 dBA); 4) 有车辆噪音的室外路边环境(平均 60 dBA)。 与合成嘈杂语音不同,我们无法在这些场景中捕获真实净的语音并评估 SDR、SiSNR、STOI 和 PESQ 等指标。 因此,为了评估 UltraSE 在实际使用中的性能,我们使用 ASR 单词错误率???=(?+?+?)/? 作为指标,其中?、?、?和?是替换、删除的数量 ,插入,目标用户的口语总数。 具体来说,我们要求用户在 TIMIT 语音语料库中跨不同环境说出至少 50 个句子。 图 9 显示了在不同环境中使用和不使用 UltraSE 的WER。 在非语音噪声环境下,即浴室和路边,UltraSE 略微提高了 ASR 语音识别率,因为 ASR 本身具有减轻背景环境噪声干扰的能力。 在语音嘈杂的环境中,即客厅和会议室,WER 高于 100%,因为非目标用户的语音引入了许多词插入和替换。UltraSE 在这种情况下取得了显着的改进,因为它能够通过使用超声波感应将所需的说话者语音与噪声分开。 2.8 文章结论 超声波传感可以作为解决鸡尾酒会问题的补充方式。UltraSE系统引入了通用DNN机制来实现这些功能,例如,多模态多域融合网络和基于新型跨模态连体网络的基于cGAN的训练模型。UltraSE指向了一个新的方向,它融合了无线传感能力,将机器感知提升到一个新的水平。 三、阅读理解与心得 作者提出了UltraSE,它使用超声波传感作为一种补充模式,将所需说话者的声音从干扰和噪声中分离出来。UltraSE使用商用移动设备发射超声波并捕捉说话者发音手势的反射。它引入了一种多模态、多领域的深度学习框架来融合超声多普勒特征和可听语音频谱图。并且利用一个基于跨模态相似性测量网络的经过对抗性训练的鉴别器来学习两种异质特征模式之间的相关性。最后实验验证了UltraSE同时提高了语音清晰度和质量,并且优于当下先进的解决方案。 作者在第一二节分别介绍了该技术的背景与优势,中间章节介绍技术路线,最后就微观基准比较、消融研究、系统效率与泛化采样频率四个方面对实验进行评估得出超声波传感可以作为解决鸡尾酒会问题的补充方式。UltraSE 系统引入了通用 DNN 机制来实现此类功能,融合了无线传感功能,将机器感知提升到一个新的水平。但是在实验分析中不乏存在一个小问题,在系统延时上UltraSE 需要以 5 s 的片段处理输入,这意味着其SSE在5秒的初始引导期后开始生效,如果设备不支持GPU / NPU话,延迟将会很高大于可接受的范围了,基于此这将是进一步研究的对象。 通过本次阅读,使我对电子与通信技术了解了不少,让我懂得专业基本素养及其重要,一方面是专业知识的积累,另一方是英语水平的训练。今后要养成不断阅读文献的习惯,将输入更好的转化为输出,同时在阅读文献方面要做到四知,一、“知事”,了解所读论文的研究内容和研究结果,即英文中的“What had been done? What was the result”。通过阅读摘要(Abstract)或概要(Summary),可以知道研究结果,即知道“What”;而参读全文则可以知道实验方法和策略,即知道“How”。二、“知人”,学会了解研究人员以及他或他们所在研究机构等背景资料。三、“知因”,阅读一篇文章时,有三个问题需要我们思考。一是,为什么研究者能够想到做这个研究。一是,研究者为什么这样设计实验。另一个就是,如果让我们来做,我们会怎样设计我们的研究。四、“知短”,不是所有的研究论文是完美的,许多实验设计可以改进。至于所引出的未解决的问题,更是无穷尽,“真理不是绝对的”。 参考文献 [1] Quan Wang, Hannah Muckenhirn, Kevin Wilson, Prashant Sridhar, Zelin Wu, John Hershey, Rif A Saurous, Ron J Weiss, Ye Jia, and Ignacio Lopez Moreno. Voice filter: Targeted voice separation by speaker-conditioned spectrogram masking. In Proceedings of Interspeech, 2019. [2] Triantafyllos Afouras, Joon Son Chung, and Andrew Zisserman. My lips are concealed: Audio-visual speech enhancement through obstructions. In Proceedings of Interspeech, 2019. [3] John S Garofolo et al. Darpa timit acoustic-phonetic speech database. National Institute of Standards and Technology (NIST), 1988. [4] Aviv Gabbay, Asaph Shamir, and Shmuel Peleg. Visual speech enhancement. In Proceedings of Interspeech, 2018. [5] Dacheng Yin, Chong Luo, Zhiwei Xiong, and Wenjun Zeng. Phasen: A phaseand-harmonics-aware speech enhancement network. In Proceedings of AAAI, 2020. [6] Ariel Ephrat, Inbar Mosseri, Oran Lang, Tali Dekel, Kevin Wilson, Avinatan Hassidim, William T Freeman, and Michael Rubinstein. Looking to listen at the cocktail party: A speaker-independent audio-visual model for speech separation. In Proceedings of ACM SIGGRAPH, 2018. [7] Chris Lewis and Steve Pickavance. Implementing quality of service over cisco mpls vpns. Selecting MPLS VPN Services, 2006 [8] Pytorch Mobile, 2020. https://pytorch.org/mobile/home/. [9] Siqi Wang, Anuj Pathania, and Tulika Mitra. Neural network inference on mobile socs. IEEE Design & Test, 2020.
刘航宇
4年前
1
1,198
1
2022-03-30
西北大学843&849备考小经验
摘要本文分享了作者备考西北大学电子科学与技术专业的经验,包括英语、政治、数学和专业课的学习方法,强调真题的重要性,并提供了免费笔记资源。关键词:西北大学, 843备考, 849备考, 考研经验, 电子科学与技术目录 843&849历年真题 下载地址:https://wwu.lanzoub.com/i3si90ai9k3g 提取码: 正文 本人22考研已经上岸西北大学电子科学与技术专业 图片 本文不会长篇大论,节省彼此时间,不建议天天看经验贴,有这时间建议做个题跑个步比啥都好。 英语和政治篇 英语和政治篇不多叙述、我相信这个难不倒大家,过线肯定能过,多年国家线分数线尚未超过40,精简回答政治7、8月起每天1-2小时,英语前期单词后期真题,真题建议做到2刷。 数学篇 本人数学这次没发挥好105分,,本人正式备考在7月份开始考研,时间短,那么这么短时间如何提高数学与专业课呢?答案就是不断做题,看视频是次要的本人由于起步晚,直接不看视频就做题,不会就翻书查答案,再不行就看对应知识点,一下节省了好几个月时间。咳咳,不建议大家学我。数学前期建议选任何一本考研书都可,1800不建议因为答案非最简答案,很多同学看不懂原因是这个思路有问题,不是最简思路,并非见到极限我就用泰勒!9月前完成强化,强化方式1.强化卷、2.题目少的习题册(张、汤、李都有)选一个精做,别欺骗自己只求数量、不求质量那是害人!9月-10月先做各机构的模拟题,先不要做真题,模拟题做多少是多少!10月-12月中旬做真题,数一必须后期真题,真题每年有好多以前考过的类型你在二刷时候就能发现22年、21年、20年、19年等等都有很多和19xx年、200x年很类似题目,千万别后期光刷模拟题质量不是一个层次哦!第一个月2天1张卷子第一天做完第二天改错吃透,第二个月1天1份,最后半月二刷1天2份根据程度只刷错题也行一定一定要吃透!历年真题。。我们偶数年吃透考个100+不是问题,奇数年吃透110+不是问题。数学就是题海战术和反复吃透,真题很重要有可能就从1987年起刷2次,真题错题能做到我遇到必会就是一个反反复复克服定势思维的过程。 专业篇 不要迷信押题卷,我们这一届843、849也没几个报班、还有有些微博网上讲题的老师水平,emmm我不评价!? ,我考研期间都 免费 给别人讲了一些题,我相信学弟学妹应该也需要学习那么就挂出来吧,如下所示 集成运放深度理解讲解 专业课如何学? 1.前期(7、8月左右)看上海交大模电视频、认真做笔记,有空课后题 2.数电呢?数电再模电之后学、数电可以看书自学23456章很重要,课后题必做,比如逻辑代数,编码、译码器,寄存器,计数器,加法器这些等等 视频课后题9月中旬前建议完成 3.后期9月中旬后,建议好好研究真题?学长可以免费提供我的个人笔记 4.真题建议做到二刷、吃透,最后1个月看自己笔记和书本和做过的习题即可,基本没有什么大问题的 迷茫指导 结语 西北大学很好,老师也很强,希望各位学弟学妹都能上岸,加油!考研过程最忌讳形式主义、自我感动,合理规划,适合自己是最总要的,我的仅仅是个提示,不要老是看这些,7月前有时间多多锻炼一下身体,西北大学目前843、849在211考研中难度不是很大,既然选择了认真对待肯定没问题!学长希望大家都能上岸,一战成硕! 免费笔记入口 模拟电子技术 数字电子技术
我的随笔
刘航宇
4年前
0
1,280
15
2022-03-13
数字电路基础-最大项与最小项
摘要本文介绍了数字电路中的最小项和最大项的定义、性质及它们之间的关系。最小项是n个变量的逻辑乘,最大项是n个变量的逻辑和。文章还讨论了它们的性质,如最小项之和等于1,最大项之积等于0,以及最小项和最大项之间的反关系。关键词:数字电路, 最大项, 最小项, 逻辑乘, 逻辑和目录 1.定义 2.性质 3.关系 1.定义 最小项:n个变量的逻辑乘,即与形式,每个变量以原变量或者反变量的形式出现一次。n个变量共有2n个最小项。用m表示,如ABC,表示为m0。 最大项:n个变量的逻辑和,即或形式,每个变量以原变量或者反变量的形式出现一次。n个变量共有2n个最大项。用M表示,如A+B+C,表示为M0。 如下为三变量最小项和最大项的表示方法: 图片 2.性质 对于n个变量来说,若给定这些变量确定的值,那么2n个最小项中仅有一组值为1,其余全为0;2n个最大项中仅有一组值为0,其余全为1. 全部最小项之和恒等于1;全部最大项之积恒等于0。(可由第一条性质中看出) 任意两个最小项之积等于0;任意两个最大项之和等于1。(可由第一条性质中看出) 若干个最小项的和等于其余最小项和的反。简单可以记做为卡诺图上分成两部分,他们之间为反关系。 3.关系 最小项的反是最大项,最大项的反是最小项。 图片
嵌入式&系统
刘航宇
4年前
0
2,060
6
SIM900A发送与接受短信
摘要本文介绍了使用SIM900A模块实现短信的收发,包括Text Mode和PDU Mode两种控制模式,以及GSM编码和UCS2编码的使用。详细说明了如何通过AT指令进行短信的发送和接收,包括英文和中文短信的发送方法。关键词:SIM900A, 短信服务, SMS, Text Mode, UCS2编码目录 一.SMS简介 二.短信的控制模式与编码1.Text Mode 2.PDU Mode 3.GSM编码 4.UCS2编码 三.收发英文短信1.AT+CPMS查询短信数量 2.AT+CNMI设置新消息提示类型 3.AT+CMGF选择短信模式 4.AT+CSCS设置编码 5.AT+CSMP设置短信文本模式 6.AT+CMGS发送消息到指定手机号 四.收发中文短信 一.SMS简介 SMS(Short Messaging Service)中文名称短信服务,短信是当下每一部手机上必备的功能之一,顾名思义,它是在手机之间发送文字信息或从个人计算机或手持设备向手机发送信息的一种方式,其文本信息的最大发送量为160个字符(字母、数字或者拉丁字母中的字符),对于中文一般最大发送量为70个字符。 这里我想用SIM900A模块实现短信的收发。 图片 二.短信的控制模式与编码 先说一下:我采用的是Text Mode下使用GSM编码收发英文短信、使用UCS2编码收发中文短信 对于短信的控制一共有三种模式:Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Mode 。目前手机中默认使用PDU Mode,通过PDU编码的短信可以是文字、声音或者图像。Text Mode只能用于发送ANSI范围的字符,发送方式比较简单。 SIM900A模块只提供Text Mode 和PDU Mode。 中文短信中,所有汉字和字符都是采用UNICODE编码。 1.Text Mode Text Mode下,发送及接收到的数据均以ASCII码的显示来表示,可以发送指令"AT+CMGF=1",将GSM短信发送方式更改为文本模式。文本模式下接收的数据会自动解码,比如你收到一条短信息,GSM会返回:+CMGR: “REC UNREAD”,"+8613806XXXXXX",“11/10/21,13:22:13+32” hello (短信内容会自动换行) 不需要自己解码,便可得到短信的发送者、发送时间和短信内容,比较容易操作。 理论上Text Mode下,是只能够收发英文短信,但是SIM900A模块可以在Text Mode下使用UCS2编码,从而可以发送接收中文短信。 2.PDU Mode PDU相当于一个数据包,它由SMS的信息组成,作为一种数据单元,必须包含源地址、目的地址、有效时间、数据格式、协议类型、正文、正文长度(可达140字节),这些信息都以十六进制表示。 PUD Mode被所有手机支持,可以使用任何字符集,其编码方式分为:7bit、8bit、UCS2。 7-bit编码用于发送普通的ASCII字符,它将一串7-bit的字符(最高位为0)编码成8-bit的数据,每8个字符可“压缩”成7个;8-bit编码通常用于发送数据消息,比如图片和铃声等;而UCS2编码用于发送Unicode字符。在这三种编码方式下,PDU串的用户信息(TP-UD)段最大容量(可以发送的短消息的最大字符数)分别是160、140和70。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。 理论上发送中文短信需要使用PDU Mode的UCS2编码,上面也说了,SIM900A模块可以使用Text Mode发送UCS2编码,而且PDU Mode比Text Mode更加复杂,所以我采用了Text Mode收发中英文短信。 PDU Mode的详细讲解可以借鉴此博客:点击链接跳转 3.GSM编码 在GSM编码模式下,收发消息的内容和电话号码,都是以ASCII字符的形式显示的,发送英文短信时使用十分方便。 所以我使用GSM编码来收发英文短信。 4.UCS2编码 谈到UCS2编码就不得不说UNICODE,UNICODE又叫统一码、万国码,是计算机科学领域里的一项行业标准,包括字符集、编码方案等。UNICODE 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。简单来说,UNICODE编码可以表示世界上任意一种语言(有点夸张),自然也可以表示中文。 而UCS2编码是UNICODE的一种,UCS2中每个字符都占俩个字节。 使用UCS2编码后,发送短信的手机号码、短信内容都要经过UCS2编码转换才可以,但UCS2编码发送的消息在手机上可以直接显示为中文。 所以,需要UCS2与中文的转换软件,如下,可以实现中文和UCS2的双向转换 图片 三.收发英文短信 1.AT+CPMS查询短信数量 图片 2.AT+CNMI设置新消息提示类型 图片 3.AT+CMGF选择短信模式 图片 4.AT+CSCS设置编码 图片 图片 5.AT+CSMP设置短信文本模式 使用Text Mode的GSM编码时,短信文本模式设置为: AT+CSMP=17,167,0,240(消息显示在终端) AT+CSMP=17,167,0,241(消息存储在SIM卡中) 图片 6.AT+CMGS发送消息到指定手机号 使用Text Mode的GSM编码时,直接AT+CMGS="手机号"即可,然后,在>后输入要发送的内容(不要勾选发送新行),最后发送HEX(十六进制)的:1A 即可。 如图,我使用本机向本机发送了一条短信,而且,本机收到短信后在终端中显示出来了。 图片 这是SIM公司给出的例子: 图片 CTRL-Z 代表十六进制:1A 使用SIM900A向本机发送一条英文短信的完整步骤如下: 图片 四.收发中文短信 收发中文短信利用的是Text Mode下的UCS2编码。 相比于收发英文短信,收发中文短信需要修改的地方有: 修改编码:AT+CSCS=“UCS2” 修改短信文本模式:AT+CSMP=17,167,0,24(短消息显示在终端,25:存储在SIM中) 手机号码要用UNICODE码 发送的消息要用UNICODE码(有专门的转换软件) 这是SIM公司给出的例子: 图片 我要发送信息:可爱的小白鼠,女朋友收到后回复消息,用软件将UNICODE码转换为中文,串口操作界面如示: 图片 发消息如示: 图片 收消息如示: 图片 这是我的SIM900A 图片
嵌入式&系统
刘航宇
4年前
0
1,253
2
上一页
1
...
4
5
6
...
9
下一页