版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VHDL作业1、写出消抖的程序,通过仿真或下载得出对应的波形,并分析。FPGA对于输入的信号一般都要经过消抖处理,以消除干扰信号。对于两个设备之间的数据传输,这一点显得尤为重要。 消抖一般通过记录脉冲的个数,对输入信号的尖峰宽度进行限制,达不到预定的宽度,即认为是干扰,必须加以滤除,部分代码如下。因此,信号经过消抖去除干扰信号以后,必然产生延迟,延迟时间与系统晶振频率以及计数脉冲个数有关。例如:设系统晶振为40MHz,消抖时间为4个CLK,一个脉冲时间为1/40M=25ns,所以信号延时为25*4=100ns,如图1所示。 图1 信号消抖示意图 代码示例:(a)延时4clk process (
2、gclk,rst) -群信号消抖begin if rst=1 then sig_out=0;elsif gclkevent and gclk = 1 then sig_0 = sig_in; sig_1 = sig_0; sig_2 = sig_1; sig_3 = sig_2;if (sig_3 = sig_2) and (sig_2 = sig_1) and (sig_1 = sig_0) and (sig_0 = sig_in) then sig_out = sig_3; end if;end if;end process;仿真结果如图2:图2消抖程序仿真图(b) 延时4msproces
3、s (gclk) begin if rst=1 then signal_out=0; psignal=0; ppsignal=0; signal_cnt=0;elsif (gclk=1) and (gclkevent) then ppsignal = psignal; psignal = signal_in; if psignal /= ppsignal then signal_cnt = 0; else signal_cnt 159999 then -消抖时间为4ms- -if signal_cnt 99 thensignal_out = psignal; end if; end if; e
4、nd if;end process;仿真结果;图3延时仿真图2、测试在不同主频、分频下逻辑处理上的不同,并分析。分频器是数字系统设计中的基本电路,根据不同设计的需要,我们会遇到偶数分频、奇数分频、半整数分频等,有时要求等占空比,有时要求非等占空比。在同一个设计中有时要求多种形式的分频。通常由计数器或计数器的级联构成各种形式的偶数分频及非等占空比的奇数分频,实现较为简单。但对半整数分频及等占空比的奇数分频实现较为困难。本文利用VHDL硬件描述语言,可设计了一种能够满足上述各种要求的较为通用的分频器。现通过设计一个可以实现8.5分频,等占空比的17分频,2、4、8、16、32分频,及占空比为18和
5、45的9分频等多种形式分频的分频器。分频器由带使能端的异或门、模N计数器和一个2分频器组成,本设计用D触发器来完成2分频的功能,实现方法是:将触发器的Q反输出端反馈回输入端D,将计数器的一个计数输出端作为D触发器的时钟输入端。各功能模块的VHDL语言实现如下。1).模N计数器的实现一般设计中用到计数器时,我们可以调用lpm库中的计数器模块,也可以采用VHDL语言自己设计一个模N计数器。本设计采用VHDL语言设计一个最大模值为16的计数器。输入端口为:使能信号en,复位信号clr和时钟信号clk;输出端口为:qa、qb、qc、qd。其VHDL语言描述略。2).带使能控制的异或门的实现输入端为:x
6、or_en:异或使能,a和b:异或输入;输出端为:c:异或输出。当xor_en为高电平时,c输出a和b的异或值。当xor_en为低电平时,c输出信号b。其VHDL语言略。3).分频(触发器)的实现输入端为:时钟信号clk,输入信号d;输出端为:q:输出信号a,q1:输出信号a反。其VHDL语言略。以下是几种分频器的分析:偶数分频器频最易于实现,欲实现占空比为50%的偶数N分频,一般来说有两种方案:,分频器的基础是计数器,设计分频偶数分N/2-1时,将输出电平进行一次翻转,同时给计数器一个复位信号,如此循环下去;二是当计数器输出为0到N/2-1时,时钟输出为0或1,计数器输出为N/2到N-1时,
7、时钟输出为0或1,计数器输出为N/2到N-1时,时钟输出为0或1,计数器输出为N-1时,复位计数器,如此循环下去。图4 偶数分频仿真结果图图 5 偶数分频仿真结果图奇数分频器实现非50%占空比的奇数分频,如占空比为20%、40%、60%、80%的5分频器,可以采用类似偶数分频的第二种方案;但如果实现占空比为50%的奇数分频,就不能使用偶数分频中所采用的方案了。下面就以实现占空比40%的5分频分频器为例,说明非50%占空比的奇数分频器的实现。该分频器的实现对于我们实现50%占空比的分频器有一定的借鉴意义。一下是奇数分频仿真结果图。图6 占空比为40%的5分频仿真波形半整数分频器仅仅采用数字分频,
8、不可能获得占空比为50%的N+0.5分频,我们只可以设计出占空比为(M+0.5)/(N+0.5)或者M/(N+0.5)的分频器,M小于N。这种半整数分频方法是对输入时钟进行操作,让计数器计数到某一个数值时,将输入时钟电平进行一次反转,这样,该计数值只保持了半个时钟周期,因此实现半整数分频。如上所述,占空比为50%的奇数分频可以帮助我们实现半整数分频,将占空比为50%的奇数分频与待分频时钟异或得到计数脉冲,下面的代码就是依靠占空比为50%的5分频实现2.5分频器的。仿真结果如图所示。图7 2.5分频仿真波形小数分频器小数分频是通过可变分频和多次平均的方法实现的。例如要实现4.7分频,只要在10次
9、分频中,做7次5分频,3次4分频就可以得到。再如要实现5.67分频,只要在100次分频中,做67 6分频,33次5分频即可。考虑到小数分频器要进行多次两种频率的分频,必须设法将两种分频均匀。表1以2.7分频为例,小数部分进行累加,如果大于等于10,则进行3分频,如果小于10,进行2分频。仿真波形如图 所示,我们可以清楚的看到2.7分频的实现。按照占空比的定义,该分频器的占空比应为10/27。图8 2.7分频仿真波形分数分频器将小数分频的方法进行扩展,可以得到形如M*(L/N) 的分数分频的方法,例如,2*(7/13)等于分母的,进行分频,只要在13次分频中,进行7次3分频,6次2分频就可以得到
10、。同样,为了将两种分频均匀,将分子部分累加,小于分母的,进行M分频,大于(M+1)分频。表2显示了2*(7/13) 的分频次序。仿真波形如图11所示。显然,该分频器的占空比为13/33。图9 33/13分频器仿真波形积分分频器积分分频器用于实现形如的分频,例如8/3分频。我们当然可以使用上面提到的分数分频的方法,但对于这种形式的分频,使用积分分频的方法综合往往占用更少的FPGA资源。积分分频法基于下述原理:一个m位的二进制数字每次累加N,假定累加x次累加值最低m位回到0,同时超过次,那么,当前累加的数字应该是;每越过一次,最高位变化 2 次,所以,累加 x 次,最高位变化 2y次,得到分频的分
11、频器,例如,取m为4,N为3,当累加16次时,累加值为48,最低m位变回到0,同时越过16三次,最高位变化6次,由此得到16/6=8/3分频的分频器。分频仿真结果如图所示。图10 积分分频仿真波形3、写出异步串行通信的发送与接收程序,并分析。异步串行数据传输具有设计简单、传输稳定等优点。其两个主要参数是波特率和数据位格式。数据位格式又称帧格式,一般包含一个起始位(逻辑0),一个终止位(逻辑1)以及校验位。在发送空闲时,总线一般处于逻辑1状态。这样当接收端检测到总线上由高到低的电平跳变,即认为是数据开始传输。波特率是用来约定通信双方的通信速率,一般通过对系统时钟进行分频来实现,RS-232协议中
12、,常用的波特率有115200、9600等,RS-422与RS-232原理基本相同,只是在传输线路上,为了抗干扰,采用了差分方式。在FPGA应用领域 ,串行数据传输一般采用422总线。通过对系统晶振分频,得到对应的波特率,比如对40MHz经行4分频,得到10MBit的传输速率。解码端会根据预先设定的波特率,对时钟进行分频,每隔相等时间读取总线上的一位数据。流程如下:在检测到起始位低电平之后,接收端(即解码端)每隔一位时间,采集总线上的电平,并写入移位寄存器中,直到将一帧数据全部接收,然后判断校验位,如果正确,则接收、编帧,否则,丢弃。由于受温度等因素的影响,晶振会产生误差,串行数据在传输过程中,
13、可能会受到干扰而产生毛刺。所以在一些对数据准确度要求比较高的场合,就得考虑串行数据传输的容错能力。对于这种情况,第一种方法通常会采取对总线上的一位分别采集三次,比较得到的三个电平,进而得到该位可信度更高的值,如图2所示;第二种方法则会将电平的采集点放在每一位的靠近中间的位置,通过计算晶振的最大误差,则可以计算出系统的最大容错能力。设晶振误差5%,频率为40MHz,1/40MHz=25ns,25*0.05=1.25ns,设波特率为4Mbit/s,所以对于40bit一帧的串行数据,累积误差最大会有1.25*40*4*50%=100ns,而比特位宽只有100ns,所以有可能会发生错位。图11 多次采
14、样减小误差示意图部分代码如下(a)422串行发送process (pClock, pReset) -惯组信号源控制主进程 begin if pReset = 1 then ch_ClearBusyFlag = 1; ch_tx = 1; ch_send_reg = 0000000000000000000000000000000000000000; ch_st = 0; ch_clock_fp = 0; elsif (pClock=1) and (pClockevent) then if ch_st = 0 then -监测有无数据发送 if (ch_s_busy_flag = 1) then
15、ch_send_reg = ch_send_buf; -读取要发送的数到寄存器 ch_ClearBusyFlag = 0; -置忙标志清零 ch_bit_counter = 0; ch_clock_fp = 0; ch_st = 1; else ch_st = 0; end if; elsif ch_st = 1 then -串行发送 ch_clock_fp = ch_clock_fp + 1; -0 - 57, 每位57个时钟,共12位,1起始,1停止,2空闲 if ch_clock_fp = 1 then ch_tx = ch_send_reg(39 - ch_bit_counter);
16、elsif ch_clock_fp = 2 then if ch_bit_counter = 39 then ch_tx = 1; ch_st = 0; -跳转到监测busy标志,等待发送下一个数 else ch_bit_counter = ch_bit_counter + 1; end if; elsif ch_clock_fp = 3 then if ch_bit_counter = 5 then ch_ClearBusyFlag = 1; -忙标志清零结束,4个clk,希望前一进程不会监测丢失 end if; end if; end if; end if; end process;(b)
17、 422串行接收*-命令接收主控制进程*异步接收,40位 process (gClock_160, g_reset) -flag=1 时,串并转换完成, begin if g_reset = 1 then flag = 1; elsif (gClock_160=1) and (gClock_160event) then if cnt = 180 then -161到180等待发送进程取走send_buf中的数去发送 flag = 1; elsif rx = 0 then flag = 0; end if; end if; end process; process (gClock_160, g_
18、reset) -160MHz采样40Mbps,每个位采样4个点,40个位cnt计数达到160 begin if g_reset = 1 then soft_reset = 0; cnt = 0; RcvBuf = 0000000000000000000000000000000000000000; tmp_data = 0000000000000000000000000000000000000000; REG_WR_PIPE_ADD = 1111111111111111; REG_ID = 1111111100000001; led_show=1; elsif (gClock_160=1) an
19、d (gClock_160event) then - led_show= not led_show; if flag = 1 then cnt = 0; verify = 0; elsif flag = 0 then cnt = cnt + 1; end if; if cnt = 1 then tmp_data(0)=rx; elsif cnt = 5 or cnt = 9 or cnt = 13 or cnt = 17 or cnt = 21 or cnt = 25 or cnt = 29 or cnt = 33 or cnt = 37 or cnt = 41 or cnt = 45 or
20、cnt = 49 or cnt = 53 or cnt = 57 or cnt = 61 or cnt = 65 or cnt = 69 or cnt = 73 or cnt = 77 or cnt = 81 or cnt = 85 or cnt = 89 or cnt = 93 or cnt = 97 or cnt = 101 or cnt =105 or cnt =109 or cnt =113 or cnt = 117 or cnt =121 or cnt =125 or cnt =129 or cnt =133 or cnt = 137 or cnt = 141 or cnt = 14
21、5 or cnt = 149 or cnt = 153 or cnt = 157 then -先发高位 verify = verify xor rx; tmp_data(0)=rx;for I in 1 to 39 loop tmp_data(I)= tmp_data(I-1); end loop; elsif (cnt = 160) and (tmp_data(39) = 0) and (tmp_data(1) = 1) and (tmp_data(0) = 1) then -判断起始停止位 RcvBuf = tmp_data; wr_ch_add = CONV_INTEGER(REG_WR
22、_PIPE_ADD(2 downto 0); FCA = CONV_INTEGER(tmp_data(36 downto 29); CA = CONV_INTEGER(tmp_data(31 downto 29); RW = tmp_data(28); RA = CONV_INTEGER(tmp_data(27 downto 21); CMD = tmp_data(20 downto 5); elsif (cnt = 161) and (verify = 0) and (RcvBuf(38) = not RcvBuf(4) and (RcvBuf(37) = not RcvBuf(3) the
23、n -接收数据测试用后删除- RcvFlag_change = not RcvFlag_change; RcvFlag= RcvFlag_change;-接收数据翻转 testch=tmp_data(31 downto 29);-接收数据通道显示- led_show= not led_show; if RcvBuf(38) = 0 then -数据流,转发对应管道 if (CONV_INTEGER(REG_WR_PIPE_ADD) 16) and (REG_WR_CH_BUSY(wr_ch_add) = 0) then send_buf(wr_ch_add) = RcvBuf; REG_WR_
24、CH_BUSY(wr_ch_add) = 1; -相应通道置忙,不允许再写入 end if; elsif RcvBuf(38 downto 37) = 11 then -解析命令 if FCA /= 255 then -发送给16个通道的命令 if (CA 16) and (REG_WR_CH_BUSY(CA) = 0) then -如果忙,将丢失此包,否则送给某个端口 send_buf(CA) = RcvBuf; REG_WR_CH_BUSY(CA) when 1 = -立即执行 if CMD=0000000011000000 then -reset soft_reset REG_WR_PI
25、PE_ADD REG_RD_PIPE_ADD if (port_busy = 0) then port_send_buf = 010111111111 & RcvBuf(27 downto 21) & 111100000000111101011; -失败 port_busy - read id if (port_busy = 0) then port_send_buf = 0101111111100000000 & REG_ID & 01011; port_busy when 2 = if (port_busy = 0) then port_send_buf = 010111111110000
26、0010 & REG_WR_PIPE_ADD & 01011; port_busy if (port_busy = 0) then port_send_buf = 0101111111100000011 & REG_RD_PIPE_ADD & 01011; port_busy if (port_busy = 0) then port_send_buf = 0101111111100000100 & REG_WR_CH_BUSY & 01011; port_busy if (port_busy = 0) then port_send_buf = 010111111110 & RcvBuf(27
27、downto 21) & 111101010000101001011; -失败 port_busy = 1; end if; end case; end if; end if; -解析命令完成* end if; elsif cnt 160 then REG_WR_CH_BUSY = REG_WR_CH_BUSY and (00000000 & ClearSndFlag_16ch); -清除16个通道忙标志 port_busy = port_busy and port_ClearBusyFlag; -清除主通道忙标志 end if; end if; end process;仿真结果:图12异步串
28、行通信的发送与接收4、写出PCM通信的发送与接收程序,并分析。PCM脉冲编码调制是将模拟信号转换成二进制数字信号的编码过程。在无线遥测系统中,遥测采编器对多路模拟信号通过特定的顺序(帧结构)进行模数转换采样,然后再将采得的PCM码并串转换,串行送至无线发射机发射。地面站通过无线接收机接收。解码后的PCM码是一个由二进制数构成的串行序列。地面接收设备的主要任务是将串行PCM码中的数据解调出来,这就需要根据PCM码流中特定的同步码确定数据的起始位,在位信号变化时的上升沿(或下降沿)把PCM码流的位同步信号分离出来,再通过串行数据到并行数据的转换把数据并行输出。 PCM码的串并转换分为三步,第一步是
29、提取同步信号,第二步是提取帧同步信号,第三步是根据已得到的位同步和帧同步完成字同步和串并转换。PCM码在发送以及接收(解码)过程中,都会用帧同步和码同步对PCM码进行同步,有些还会用到路同步信号,如图13所示。一般是PCM码接收端发送同步信号(即帧同步、码同步和路同步)。PCM码发送端根据接收到的同步信号输出PCM码,比如在码同步的上升沿或者下降沿给出数据,接收端则根据自己发出的同步信号接收PCM码。在实际数据传输过程中,考虑到信号的延时,一般发送端在码同步上升沿给出PCM数据,接收端在码同步下降沿读取PCM数据,而帧同步一般用作帧复位,路同步用作字节复位,如图14所示。接收端接收到PCM数据
30、后,一般要经过编帧,加上帧头、帧尾以及帧计数,然后上传给计算机。计算机则将数据解包,提取出有用的信息。图13 PCM码接收发送过程中的信号示意图图14 同步信号示意图 部分参考代码:(a)帧同步、路同步、码同步信号的产生 process(gclk, rst)- 分频得到码同步时钟,3.05008us x 2=6.10016us ,要求是6.1035usbegin if rst = 1 thengclk_cnt=0;gclk_3us=60 thengclk_cnt=0;gclk_3us= not gclk_3us;elsegclk_cnt=gclk_cnt+1;end if; end if; e
31、nd process; process(gclk_3us, rst) -帧同步、码同步、路同步信号产生 beginif rst=1 then f_ztb=0; f_ltb=1; f_mtb=0; cnt2=0; cnt1=0; pcm_state -ztb上升沿与mtb下降沿对齐,路同步延迟一个周期后,开始发送码同步 f_ztb=1; f_ltb=0; if cnt1=4 then cnt1=0; pcm_state=pst1; elsecnt1=cnt1+1;pcm_state f_ztb=0; if cnt1=2 then pcm_state=pst2;cnt1=0; elsecnt1=c
32、nt1+1;pcm_state f_ltb=1; if cnt1=7 then pcm_state=pst3; cnt1=0; else cnt1=cnt1+1; pcm_state f_ltb=0; f_mtb=1;-1 pcm_state f_mtb=0; pcm_state f_mtb=1;-2 pcm_state f_mtb=0; pcm_state f_mtb=1;-3 pcm_state f_mtb=0; pcm_state f_mtb=1; -4 pcm_state f_mtb=0; pcm_state f_ltb=1; f_mtb=1; -5 pcm_state f_mtb=0
33、; pcm_state f_mtb=1; -6 pcm_state f_mtb=0; pcm_state f_mtb=1; -7 pcm_state f_mtb=0; pcm_state f_mtb=1; -8 pcm_state f_mtb=0; pcm_state -f_mtb保持低,再产生3个周期的f_ltb f_ltb=0; -第2个f_ltbif cnt1=7 then cnt1=0; pcm_state=pst20;else cnt1=cnt1+1; pcm_state f_ltb=1;if cnt1=7 then cnt1=0; pcm_state=pst21;else cnt1
34、=cnt1+1; pcm_state f_ltb=0; -第3个f_ltbif cnt1=7 then cnt1=0; pcm_state=pst22;else cnt1=cnt1+1; pcm_state f_ltb=1;if cnt1=7 then cnt1=0; if cnt2=127 then -循环128次,产生128路f_mtb cnt2=0; pcm_state=pst0; else cnt2=cnt2+1; pcm_state=pst23; end if;elsecnt1=cnt1+1;pcm_state f_ltb=0;-第4个f_ltbif cnt1=7 then cnt1=0; pcm_state=pst24;else cnt1=cnt1+1; pcm_state f_ltb=1;if cnt1=7 then cnt1=0; pcm_state=pst3;else cnt1=cnt1+1; pcm_state pcm_state
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025江西万通高级技工学校工作人员招聘考试试题
- 2025江苏省南通中等专业学校工作人员招聘考试试题
- 库内拦挡坝施工指导书
- 太阳能光伏板安装专项施工方案
- 地下水控制专项施工方案
- 2026年航空材料创新报告
- 卵石水系施工指导书
- 2026年银发经济智能老年唱戏机高清大屏创新报告
- 高中生借助地理信息系统模拟城市内涝应急疏散跨区域协作方案设计课题报告教学研究课题报告
- 2026年Q1公募基金转债持仓分析:“被动稀释”与“主动调仓”并行
- DB11∕T 637-2024 房屋结构综合安全性鉴定标准
- 地理(江苏南京卷)(考试版)
- 食堂买菜合同协议
- 2025年学前教育宣传月“守护育幼底线成就美好童年”主题活动实施方案
- TCALC 003-2023 手术室患者人文关怀管理规范
- 国家职业技术技能标准 6-25-04-07 广电和通信设备电子装接工 人社厅发20199号
- 投诉法官枉法裁判范本
- DLT 5285-2018 输变电工程架空导线(800mm以下)及地线液压压接工艺规程
- JBT 14581-2024 阀门用弹簧蓄能密封圈(正式版)
- DZ∕T 0368-2021 岩矿石标本物性测量技术规程(正式版)
- 2024年基金从业资格(含三个科目)考试题库(浓缩500题)
评论
0/150
提交评论