序列检测器仿真结果
1,序列发生器
设计了一个码型长度为256的8位宽度的伪随机序列。反馈方程为:f(x)=x8+x3+X2+X1+1;
在程序设计中,用shift_reg[6:0]表示这8位宽度,用shift_reg[7]表示输出,并将反馈函数通过移位操作送进下一个时钟的移位寄存器中。其中,反馈函数的值为:feedback = Shift_reg[0]^Shift_reg[1]^Shift_reg[2]^Shift_reg[7];即对应着上面反馈函数中的:x8+x3+X2+X1。
如图,使用modelsim仿真可以得到,红色的曲线输出的就是随机序列。
2,误码插入
设计了一个长度为256的计数器,用来控制对特定输出的系列信号进行取反操作。由于使用了时钟触发,故而输出比输入的序列延迟一个时钟。
核心代码如下:
process(clk) begin if rising_edge(clk)then case cnt_m is-----取反12位 when 11 =>m_o<=not m_i; when 33 =>m_o<=not m_i when 55=>m_o<=not m_i; when 88 => m_o<=not m_i; when 111 =>m_o<=not m_i; when 133 =>m_o<=not m_i; when 155 =>m_o<=not m_i; when 166 =>m_o<=not m_i; when 199 =>m_o<=not m_i; when 211 =>m_o<=not m_i; when 233 =>m_o<=not m_i; when 245 =>m_o<=not m_i; when others=>m_o<=m_i; end case; end if; end process; |
modelsim的仿真结果:
从图中也能看出,正常情况下,输出m_o比输入M_i延迟一个时钟,当cnt_m为11,33时,输出的信号m_O是输入信号m_i的取反信号。
3,误码统计单元
该单元用来统计每接收到的256个经过模拟信道的输出码中,通过和标准码进行对比,来统计其中有多少个错误码。
核心代码如下:
process(clk,rst,start) begin if rst='0'then m<=0; cnt<=1; elsif rising_edge(clk)then if start='0' then m<=0; cnt<=1; else--同步成功使能有效时 if cnt>=255 then--循环255个时钟周期内,对比接收和本地M序列,统计误码数 err_cnt<=m; cnt<=1; m<=0; else cnt<=cnt+1; end if; if m_1 /= m_loc then--对比不相同,误码数+1 m<=m+1; end if; end if; end if; end process; |
如图,modelsim下的仿真如图所示:当计数满255时,将误码统计数进行锁存输出,如图,此次统计到的256个错误码中有12个错误码,符合我们上面模块插入错误码的数量。
4,同步模块
在将经过模拟信道输出的序列信号和标准码进行比较前,需要先将输出码和标准码进行同步,同步通过状态机进行设计。
St0表示起始状态,st1是用来计数,当接收到连续15个序列码中错误码不超过3个时,表示码同步成功,进入状态st2,进行错误码数量的统计。若连续15个序列码中错误码超过3个时,进入st3状态,表示同步未成功。对本地码进行暂停一个周期,从新进入状态st0重新同步。直到同步成功,状态维持在st2,此时start信号有效,进行错误码数量的统计。
5,显示模块
显示模块分为数字解码模块和显示驱动模块。
数字解码模块将一个10进制的数的各个位分解出来,用于显示模块使用。
显示模块实现对数码管的动态扫描。依次显示刷新解码出的10进制的各个位。
6,顶层电路设计
将各个子模块例化到顶层模块,生成下列的方块图:
syn_reset_inst:用于产生同步复位信号。
sim_channel_inst:用于模拟通信信道。实际操作为生成m序列码并插入错误码。
local_m_sequence_inst:本地序列码生成器。用于和信道输出码进行比较,用于统计错误码的数量。
Code_Sync_inst:码同步模块。用于把本地码和模拟信道输出码进行同步。
Error_Code_Counter_inst:错误码计数模块。用于统计错误码的数量。
err_cnt_display_inst:错误码数量显示模块。