简易数字信号分析仪中的曼彻斯特码同步

来源:互联网 发布:我的世界 mod 知乎 编辑:程序博客网 时间:2024/05/16 16:07

上篇所转载的简易数字信号分析仪中从曼彻斯特码提取同步信号的代码我试了。烧到板子上,用示波器查看时波形有误。

这是难点之所在(补出脉冲信号),采用的办法是应用计数器。采用一计数器counter和一个寄存器value,counter在系统时钟clk下计数,当clk_1 = 1时,也即遇到clk_1的高电平时,将counter的当前值与value进行比较,如果counter的当前值大于value,将counter当前值赋于value,之后counter清零,再次计数,当counter的当前值等于value/2时,这时,应该补出一个脉冲信号。

基本思路不变。

经过修改后:代码如下:

module bitSyn_v4(clk_1 , clk,clk_6);inputclk,clk_1;//clk是50MHz时钟,clk_1为提取的跳变沿脉冲output clk_6;   //clk_6是提取出的同步信号 //counter16位计数器,用于记录clk_1脉冲的低电平次数,之所以初始化,主要是考虑到modulesim仿真时观察它的变化,//寄存器value用于存入保持时间为T时的计数次数。reg [15:0]counter=0;reg [15:0] value;reg state,flag1,flag2,clk_2=0,clk_3,clk_4;wire clk_5,clk_6;wire clk_1;always@(posedge clk)begin    counter <= counter + 1;    if(clk_1) begincase(state)  0:  begin value <= counter - 1; state <= 1; counter <= 0;  end  1:  begin if(value < counter) beginflag1 = 1;value <= counter; end if(value > counter) beginflag2 <= 1; end state <= 1; counter <= 0;  endendcase end//我修改的主要是后半部分value/2不用减一。 //第一个if主要用于在 T/2处补出一个脉冲,clk_2一发生变化,则clk_6发生变化(assign语句的特性) if((counter == value/2 )&&((flag1 == 1)||(flag2 == 1))) begin clk_2 <= ~clk_2; end//第二个if 则是将clk_2由高电平变为低电平,以方便在下一个T/2处补出一个脉冲。  if(counter == value) begin clk_2 <= ~clk_2; endendassign clk_6 = clk_1|clk_2;//补出一个脉冲 endmodule

___博主写完分析之后贴出。。如果有人急着用的话,请留言。