2[11:0];//通道a输出的数据
44 //assign data_chb[11:0] = conv_res[26:15];//通道b输出的数据
45 //系数本身是16bit带符号的,由于FIR滤波器的系数之和为1,则16bits带符号的所有系数之和是32768,
46 //因此需要将滤波结果右移15bit,所以取结果的26:15。但由于DA参考电压为2.048V,小于AD的3.3V因此滤波结果还是略小。
47 //assign data_chb[11:0] = data_out[14:3];//通道b输出累加结果开方
48 assign data_chb[11:0] = acc_out[28:17];//通道b输出64个点能量累加结果
49 //assign data_chb[11:0] = pow_sig[20:9];//通道b输出交流信号的平方
50 //assign data_chb[11:0] = acc_sum[26:15];//通道b输出滤波/卷积结果
51 //assign data_chb[11:0] = conv_res1[26:15];//通道b输出的数据
52
53 /////以下系数配置中用到的连线/////
54 wire rdy_work;//配置完成信号,高电平表示配置完成
55 wire[7:0] wr_blk_addr;//向后级系数blk配置的地址
56 wire[15:0] data_bank;//向各级系数blk配置的数据
57 wire csh0,csh1,csh2,csh3;//每一节配置的系数blk的选通线
58 PLL20_100 i_pll20_100(//例化PLL产生时钟
59 .inclk0(iclk20),
60 .c0(clk)//pll输出的100M工作时钟
61 );
62
63 always @ (posedge clk or negedge rdy_work)
64 begin
65 if(!rdy_work)
66 begin
67 start <= 1'd0;
68 cnt[15:0] <= 16'd0;
69 tst_data[11:0] <= 12'd0; //用作测试的计数器
70 end
71 else begin
72 //////////维护周期计数器///////////
73 if(cnt < CNT_NUM-1) begin
74 cnt[15:0] <= cnt[15:0] + 16'd1;
75 tst_data[11:0] <= tst_data[11:0];
76 end
77 else begin
78 cnt[15:0] <= 16'd0;
79 tst_data[11:0] <= tst_data[11:0] + 12'd1; //用作测试的计数器
80 end
81
82 ////////产生启动信号/////
83 if((cnt > 102)&(cnt <= 105))//在第105个clk产生启动信号
84 start <= 1'D1;//启动MCP4822输出状态机
85 else
86 start <= 1'D0;
87 end
88 end
89
90 init_coe_blk i_init_coe_blk(//例化系数配置模块,起到从系数池中读取系数并向系数blk中配置数据的作用,只在复位后的开始阶段有效,通过ready信号控制后续模块
91 .clk(clk),
92 .rst_n(rst_n),//整体复位信号
93 .ready(rdy_work),//配置完成信号,高电平表示配置完成
94 .wr_blk_addr(wr_blk_addr),//向后级系数blk配置的地址
95 .data_bank(data_bank),//向各级系数blk配置的数据
96 .csh0(csh0),//第一节配置的系数blk的选通线
97 .csh1(csh1),//第二节配置的系数blk的选通线
98 .csh2(csh2),//第三节配置的系数blk的选通线
99 .csh3(csh3)//第四节配置的系数blk的选通线
100 );
101
102 CONV_SER16 i_conv_ser16_I(//例化第一个16阶卷积/fir电路
103 .clk(clk),
104 .a({4'd0,ad_data}),//AD转换结果作为数据输入
105 //.a({4'd0,tst_data[11:0]}),//AD转换结果作为数据输入
106 .en(rdy_work),//系数配置完成后才能使能
107 .coe_data_in16(data_bank),//初始化系数的数据输入端
108 .wr_coe_addr(~wr_blk_addr[3:0]),//初始化系数的地址输入端
109 ////!!!特别注意这里,乘加时数据从大地址进入乘加操作,因此地址要求补码,将系数翻转过来。相当于:fliplr();!!!!!//
110 .wr_coe_clk(clk),//初始化系数写入时钟
111 .wr_coe_en(csh0),//系数配置的使能端,由初始化模块地址译码产生,方便不同系数blk的选通
112 .start(start),//输入的启动卷积和fir的控制端
113 //.shft_out_dp_data(),
114 .shft_out_dp_data(shft_data1[15:0]),
115 //.s_latch(conv_res)
116 .s_latch(conv_res1[39:0])
117 );
118 CONV_SER16 i_conv_ser16_II(//例化第二个16阶卷积/fir电路
119 .clk(clk),
120 .a(shft_data1[15:0]),//由级联的第一节移出的数据
121 .en(rdy_work),//系数配置完成后才能使能
122 .coe_data_in16(data_bank),//初始化系数的数据输入端
123 .wr_coe_addr(~wr_blk_addr[3:0]),//初始化系数的地址输入端
124 ////!!!特别注意这里,乘加时数据从大地址进入乘加操作,因此地址要求补码,将系数翻转过来。相当于:fliplr();!!!!!//
125 .wr_coe_clk(clk),//初始化系数写入时钟
126 .wr_coe_en(csh1),//系数配置的使能端,由初始化模块地址译码产生,方便不同系数blk的选通
127 .start(start),//输入的启动卷积和fir的控制端
128 .shft_out_dp_data(shft_data2[15:0]),
129 .s_latch(conv_res2[39:0])
130 );
131 CONV_SER16 i_conv_ser16_III(//例化第3个16阶卷积/fir电路
132 .clk(clk),
133 .a(shft_data2[15:0]),//由级联的第一节移出的数据
134 .en(rdy_work),//系数配置完成后才能使能
135 .c |