verilog_decode
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//接收端的解码模块(可综合)
//在信号接收的刚开始发送端发送的是10个1信号,
//即10个+M序列,所以我们在开始时每接收到一个信号做一次累加运算
//当出现正的高峰时则认为达到同步,进入同步解调过程(mainbody)。
//也就是从此每进入一个信号就进行相应的相乘相加,
//在解接收到31个信号后进行一次判断,大于0认为接收到1,小于0认为接收到0。
`timescale 1ns/1ns
module decoder( clk_31, //输入时钟
indata, //接收到的m序列
outdata, //解码以后的序列
rst,
en,
sum);
input clk_31,en,rst;
input [2:0] i ndata;
output [8:0] s um;
output outdata;
reg [8:0] i,j,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,
i11,i12,i13,i14,i15,i16,i17,i18,i19,
i20,i21,i22,i23,i24,i25,i26,i27,i28,i29,i30;
reg enable;
reg [30:0] flag; //叠加使能控制信号
reg [2:0] i ndata_buf;
reg [1:0] s tate;
reg outdata;
reg [8:0] s um;
wire [30:0] m;
parameterfind_head=2'b01, //找发送头信号111111110
main_body =2'b10; //找到头信号之后的同步解码过程
assign m = 31'b 1010011000001110010001010111101;
//与发射端协调好的解调M序列
reg [8:0] s um0, //加法结果寄存器
sum1, //理论上我们是在每进入一个信号后就立即对已有的31个信号进行乘加运算,
sum2, //这是一个31位的加法,即使采用流水线算法也需要5个并行加法器。
sum3, //所以在实际实现的时候,我们为了提高处理速度,将这个运算转化为
sum4, //31个加法寄存器,将每次进来的信号与不同的31位M序列进行叠加,
sum5, //再存入不同的原有寄存器中,不同存器在寄进行了31次加法后进行一次判断,
sum6, //如果大于阈值则认为达到同步,进入同步判断状态(state<=main_body)sum7,
sum8, //这组加法寄存器的初始值为50,进行31次乘法加法运算之后,选取的阈值为75
sum9,
sum10,
sum11,
sum12,
sum13,
sum14,
sum15,
sum16,
sum17,
sum18,
sum19,
sum20,
sum21,
sum22,
sum23,
sum24,
sum25,
sum26,
sum27,
sum28,
sum29,
sum30;
always@(posedge clk_31)
begin
if(!rst)
flag <=31'd1;
if(en)
begin
indata_buf <=indata;
case(i)
1: flag[1] <=1'b1;
2: flag[2] <=1'b1;
3: flag[3] <=1'b1;
4: flag[4] <=1'b1;
5: flag[5] <=1'b1;
6: flag[6] <=1'b1;
7: flag[7] <=1'b1;
8: flag[8] <=1'b1;
9: flag[9] <=1'b1;
11: flag[11]<=1'b1;
12: flag[12]<=1'b1;
13: flag[13]<=1'b1;
14: flag[14]<=1'b1;
15: flag[15]<=1'b1;
16: flag[16]<=1'b1;
17: flag[17]<=1'b1;
18: flag[18]<=1'b1;
19: flag[19]<=1'b1;
20: flag[20]<=1'b1;
21: flag[21]<=1'b1;
22: flag[22]<=1'b1;
23: flag[23]<=1'b1;
24: flag[24]<=1'b1;
25: flag[25]<=1'b1;
26: flag[26]<=1'b1;
27: flag[27]<=1'b1;
28: flag[28]<=1'b1;
29: flag[29]<=1'b1;
30: flag[30]<=1'b1;
endcase
end
end
always@(posedge clk_31) begin
if(!rst)
begin
i <=9'd0;
j <=9'd0;
sum0 <=9'd50;
sum1 <=9'd50;
sum2 <=9'd50;
sum3 <=9'd50;
sum4 <=9'd50;
sum5 <=9'd50;
sum6 <=9'd50;
sum7 <=9'd50;
sum8 <=9'd50;
sum9 <=9'd50;
sum10 <=9'd50;
sum11 <=9'd50;
sum13 <=9'd50;
sum14 <=9'd50;
sum15 <=9'd50;
sum16 <=9'd50;
sum17 <=9'd50;
sum18 <=9'd50;
sum19 <=9'd50;
sum20 <=9'd50;
sum21 <=9'd50;
sum22 <=9'd50;
sum23 <=9'd50;
sum24 <=9'd50;
sum25 <=9'd50;
sum26 <=9'd50;
sum27 <=9'd50;
sum28 <=9'd50;
sum29 <=9'd50;
sum30 <=9'd50;
sum <=9'd50;
enable <=1'b0;
state <=find_head;
end
else
if(en)
begin
case(state)
find_head:
begin
if(!enable)
enable <=1'b1;
else
begin
if(flag[0])
begin
i1 <=i;
if(indata[2]==m[i])
sum0 <=sum0+{((indata[2]^indata[1])||((indata[2]
&&indata[1])&&(!indata[0]))),indata[0]};
else
sum0 <=sum0-{((indata[2]^indata[1])||((indata[2]
&&indata[1])&&(!indata[0]))),indata[0]};
if(i==30)
begin
if(sum0>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
else
i <=i+1;
end
if(flag[1])
begin
i2 <=i1;
if(indata[2]==m[i1])
sum1 <=sum1+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum1 <=sum1-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i1==30)
begin
i1 <=9'd0;
if(sum1>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[2])
begin
i3 <=i2;
if(indata[2]==m[i2])
sum2 <=sum2+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum2 <=sum2-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i2==30)
begin
if(sum2>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[3])
begin
i4 <=i3;
if(indata[2]==m[i3])
sum3 <=sum3+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum3 <=sum3-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i3==30)
begin
i3 <=9'd0;
if(sum3>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[4])
begin
i5 <=i4;
if(indata[2]==m[i4])
sum4 <=sum4+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum4 <=sum4-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i1==30)
begin
i4 <=9'd0;
if(sum2>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[5])
begin
i6 <=i5;
if(indata[2]==m[i5])
sum5 <=sum5+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum5 <=sum5-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i5==30)
begin
i5 <=9'd0;
if(sum5>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[6])
begin
i7 <=i6;
if(indata[2]==m[i6])
sum6 <=sum6+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum6 <=sum6-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i6==30)
begin
i6 <=9'd0;
if(sum6>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[7])
begin
i8 <=i7;
if(indata[2]==m[i7])
sum7 <=sum7+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum7 <=sum7-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i7==30)
begin
i7 <=9'd0;
if(sum7>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[8])
begin
i9 <=i8;
if(indata[2]==m[i8])
sum8 <=sum8+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum8 <=sum8-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i8==30)
begin
i8 <=9'd0;
if(sum8>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[9])
begin
i10 <=i9;
if(indata[2]==m[i9])
sum9 <=sum9+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum9 <=sum9-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i9==30)
begin
i9 <=9'd0;
if(sum9>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[10])
begin
i11 <=i10;
if(indata[2]==m[i10])
sum10 <=sum10+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum10 <=sum10-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i10==30)
begin
i10 <=9'd0;
if(sum10>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[11])
begin
i12 <=i11;
if(indata[2]==m[i11])
sum11 <=sum11+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum11 <=sum11-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i11==30)
begin
i11 <=9'd0;
if(sum11>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[12])
begin
i13 <=i12;
if(indata[2]==m[i12])
sum12 <=sum12+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum12 <=sum12-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i12==30)
begin
i12 <=9'd0;
if(sum12>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[13])
begin
i14 <=i13;
if(indata[2]==m[i13])
sum13 <=sum13+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum13 <=sum13-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i13==30)
begin
i13 <=9'd0;
if(sum13>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[14])
begin
i15 <=i14;
if(indata[2]==m[i14])
sum14 <=sum14+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum14 <=sum14-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i14==30)
begin
i14 <=9'd0;
if(sum14>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[15])
begin
i16 <=i15;
if(indata[2]==m[i15])
sum15 <=sum15+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum15 <=sum15-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i15==30)
begin
i15 <=9'd0;
if(sum15>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[16])
begin
i17 <=i16;
if(indata[2]==m[i16])
sum16 <=sum16+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum16 <=sum16-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i16==30)
begin
i16 <=9'd0;
if(sum16>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[17])
begin
i18 <=i17;
if(indata[2]==m[i17])
sum17 <=sum17+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum17 <=sum17-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i17==30)
begin
i17 <=9'd0;
if(sum17>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[18])
begin
i19 <=i18;
if(indata[2]==m[i18])
sum18 <=sum18+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum18 <=sum18-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i18==30)
begin
i18 <=9'd0;
if(sum18>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[19])
begin
i20 <=i19;
if(indata[2]==m[i19])
sum19 <=sum19+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum19 <=sum19-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i19==30)
begin
i19 <=9'd0;
if(sum19>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[20])
begin
i21 <=i20;
if(indata[2]==m[i20])
sum20 <=sum20+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum20 <=sum20-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i20==30)
begin
i20 <=9'd0;
if(sum20>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[21])
begin
i22 <=i21;
if(indata[2]==m[i21])
sum21 <=sum21+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum21 <=sum21-{((indata[2]^indata[1])||((indata[2]
&&indata[1])&&(!indata[0]))),indata[0]};
if(i21==30)
begin
i21 <=9'd0;
if(sum21>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[22])
begin
i23 <=i22;
if(indata[2]==m[i22])
sum22 <=sum22+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum22 <=sum22-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i22==30)
begin
i22 <=9'd0;
if(sum22>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[23])
begin
i24 <=i23;
if(indata[2]==m[i23])
sum23 <=sum23+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum23 <=sum23-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i23==30)
begin
i23 <=9'd0;
if(sum23>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[24])
begin
i25 <=i24;
if(indata[2]==m[i24])
sum24 <=sum24+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum24 <=sum24-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i24==30)
begin
i24 <=9'd0;
if(sum24>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[25])
begin
i26 <=i25;
if(indata[2]==m[i25])
sum25 <=sum25+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum25 <=sum25-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i25==30)
begin
i25 <=9'd0;
if(sum25>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[26])
begin
i27 <=i26;
if(indata[2]==m[i26])
sum26 <=sum26+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum26 <=sum26-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i26==30)
begin
i26 <=9'd0;
if(sum26>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[27])
begin
i28 <=i27;
if(indata[2]==m[i27])
sum27 <=sum27+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum27 <=sum27-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i27==30)
begin
i27 <=9'd0;
if(sum27>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[28])
begin
i29 <=i28;
if(indata[2]==m[i28])
sum28 <=sum28+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum28 <=sum28-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i28==30)
begin
i28 <=9'd0;
if(sum28>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[29])
begin
i30 <=i29;
if(indata[2]==m[i29])
sum29 <=sum29+{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
else
sum29 <=sum29-{((indata[2]^indata[1])||((indata[2] &&indata[1])&&(!indata[0]))),indata[0]};
if(i29==30)
begin
i29 <=9'd0;
if(sum22>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
if(flag[30])
begin
if(indata[2]==m[i30])
sum30 <=sum30+{((indata[2]^indata[1])||((indata[2]
&&indata[1])&&(!indata[0]))),indata[0]};
else
sum30 <=sum30-{((indata[2]^indata[1])||((indata[2]
&&indata[1])&&(!indata[0]))),indata[0]};
if(i30==30)
begin
i30 <=9'd0;
if(sum30>=75)
begin
outdata <=1'b1;
state <=main_body;
end
else
state <=find_head;
end
end
end
end
main_body:
begin
if(j!=30)
begin
if(indata[2]==m[j])
sum <=sum+{((indata[2]^indata[1])||((indata[2]
&&indata[1])&&(!indata[0]))),indata[0]};
//推算出来的3位2进制带符号数与原有m序列相乘的公式else
sum <=sum-{((indata[2]^indata[1])||((indata[2]
&&indata[1])&&(!indata[0]))),indata[0]};
j <=j+1;
end
else
begin
if(sum>50)
outdata <=1;
else
outdata <=0;
j <=0;
if(indata[2]==m[0])
sum <=9'd50+{((indata[2]^indata[1])||((indata[2]&&indata[1])
&&(!indata[0]))),indata[0]};
else
sum <=9'd50-{((indata[2]^indata[1])||((indata[2]&&indata[1])
&&(!indata[0]))),indata[0]};
end
end
endcase
end
end
endmodule。