设为首页 加入收藏

TOP

目标反射回波检测算法及其FPGA实现 之二:互相关/卷积/FIR电路的实现(四)
2019-08-24 00:06:57 】 浏览:276
Tags:目标 反射 检测 算法 及其 FPGA 实现 之二 相关 卷积 /FIR 电路
rom_addr ),//本模块自己产生的读系数地址 61 .rdclock ( clk & flag ),//本模块自己的读时钟 62 .wraddress ( wr_coe_addr ),//外部配置模块产生的写入地址 63 .wrclock ( wr_coe_clk ),//外部配置模块产生的写系数时钟 64 .wren ( wr_coe_en ),//外部配置模块产生的写使能,由配置模块的高地址译码产生 65 .q ( coe_value )//本模块读取的系数值 66 ); 67 latch_40 i_latch_40(//例化40位锁存器,用以使计算结果在整个周期内保持不变 68 .din(s), 69 .dout(s_latch), 70 .clk(start) 71 ); 72 endmodule View Code

    由于代码中由详细注释,这里就不再一一解释了。

五、系数初始化器的设计

    完成卷积节的设计后,可以将其例化为L个卷积节,并通过逐一级联它们来实现更高阶的卷积/互相关/FIR滤波功能。但我发现一个很不方便的地方:例化产生的所有实例的系数存储器具有相通的内容,无法分别赋值。苦恼多时之后,终于一咬牙决定再写一个系数初始化模块来实现系数的初始化。这也就有了前面所说的,将每个卷积节中的系数存储器配置为可写入的双口RAM的事情。如果有朋友有更好的办法解决这个问题烦请告知,欢迎交流。

    系数初始化模块由控制逻辑、系数池ROM和译码电路三部分组成。其中系数池ROM负责存储所有的卷积/互相关模板h[k]或M[k]系数,FPGA上电后,控制逻辑部分会先阻止卷积部分电路的工作,先进行系数配置。系数配置时,控制电路会从系数池ROM中依次读出每个卷积节所需的系数,并在译码电路的控制下将其写入每个卷积节中的系数存储器中(双口RAM,结构如图3所示)。系数初始化模块的Verilog-HDL代码如下所示。

 1 module init_coe_blk(clk,rst_n,ready,wr_blk_addr,data_bank,csh0,csh1,csh2,csh3);//,rd_blk_add2,blk_data2);
 2 input clk;
 3 input rst_n;//总的复位信号
 4 output ready;//配置完成信号,高电平表示配置完成
 5 output[7:0] wr_blk_addr;//系数blk的地址,比cnt_bank_addr延迟了一个时钟周期
 6 output[15:0] data_bank;//从系数池读出的数据
 7 output csh0,csh1,csh2,csh3;//用高电平选同各个系数blk
 8 wire[7:0] cnt_bank_addr;//系数池地址
 9 coe_init_addr i_coe_init_addr(//例化地址生成模块
10     .rst_n(rst_n),
11     .clk(clk),
12     .ready(ready),
13     .cnt_bank_addr(cnt_bank_addr),//给系数池的地址
14     .wr_blk_addr(wr_blk_addr)//给系数blk的地址,比cnt_bank_addr晚一个时钟。原因是系数池ROM有一个周期的读出延迟
15     );
16 encode i_encode(//例化地址译码模块
17     .encode_adder(wr_blk_addr),//被译码的地址是经过延迟的地址,因为这个译码是为写入进行译码
18     .csh0(csh0),
19     .csh1(csh1),
20     .csh2(csh2),
21     .csh3(csh3)
22     );
23 coe_bank_rom    i_coe_bank_rom (//例化输出数据配置数据的rom bank
24     .address ( cnt_bank_addr ),//由计数器产生的地址
25     .clken ( rst_n ),
26     .clock ( clk ),//时钟
27     .q ( data_bank )//系数池读出的数据
28     );
29 endmodule
30 
31 module coe_init_addr(rst_n,clk,ready,cnt_bank_addr,wr_blk_addr);
32 input rst_n,clk;
33 output ready;//配置完成信号
34 output[7:0] cnt_bank_addr;//读系数池的地址信号
35 output[7:0] wr_blk_addr;//向被配置系数blk发送的地址信号,由于系数池有读出延迟,wr_blk_addr比cnt_bank_addr要多延迟一个周期,由级联的D触发器实现
36 reg ready;
37 reg[9:0] cnt_bank_addr10;//10位的计数器,其实只需要第8位,多余的位为更大的系数池预留的
38 reg[7:0] wr_blk_addr;
39 assign cnt_bank_addr[7:0] = cnt_bank_addr10[7:0];
40 always @ (posedge clk or negedge rst_n)
41 begin
42     if(!rst_n)
43     begin
44         cnt_bank_addr10[9:0] <= 10'd0;
45         ready <= 1'b0;
46     end
47     else begin
48         if(cnt_bank_addr10[9:0] < 10'hff)
49         begin
50             cnt_bank_addr10[9:0] <= cnt_bank_addr10[9:0] + 10'd1;
51             ready <= 1'b0;
52         end
53         else begin
54             cnt_bank_addr10[9:0] <= cnt_bank_addr10[9:0];
55             ready <= 1'b1;
56         end        
57     end
58 end
59 //加一级D触发器,对地址延迟一个时钟周期,以对消系数池读取的延迟
60 always @ (posedge clk or negedge rst_n)
61 if(!rst_n)
62 begin
63     wr_blk_addr[7:0] <= 8'd0;
64 end
65 else begin
66     wr_blk_addr[7:0] <= cnt_bank_addr[7:0];
67 end
68 endmodule
69 module encode(encode_adder,csh0,csh1,csh2,csh3);//地址译码模块,用于产生每个coe模块所需的片选信号,注意可以增加译码结果片选信号
70 input[7:0] encode_adder;//被译码地址,有8位,高4位参与译码
71 output csh0,csh1,csh2,csh3;//片选信号,注意,是高电平有效。
72 assign csh0=(encode_adder[7:4] == 4'd0)? 1'b1:1'b0;
73 assign csh1=(encode_adder[7:4] ==
首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇利用ZYNQ SOC快速打开算法验证通.. 下一篇接口与协议学习笔记-USB协议_USB2..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目