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] ==