Files

427 lines
16 KiB
Verilog

`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/18 23:18:07
// Design Name:
// Module Name: CN_PRO
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module CN_PRO
#(
parameter WIDTH = 4'd8
)
(
input clk,
input rst_CN,
input start_CN, //模块启动信号,高脉冲
//VN数据输出,H阵第1行
input [WIDTH-1:0] VN1_dout_01_00,
input [WIDTH-1:0] VN1_dout_02_00, //后面的00代表H阵原模图的IM
input [WIDTH-1:0] VN1_dout_02_01, //后面的01代表H阵原模图的II1
//VN数据输出,H阵第2行
input [WIDTH-1:0] VN2_dout_01_00,
input [WIDTH-1:0] VN2_dout_02_00,
input [WIDTH-1:0] VN2_dout_03_00,
input [WIDTH-1:0] VN2_dout_04_02, //后面的02代表H阵原模图的II2
input [WIDTH-1:0] VN2_dout_04_03, //后面的03代表H阵原模图的II3
input [WIDTH-1:0] VN2_dout_04_04, //后面的04代表H阵原模图的II4
//VN数据输出,H阵第3行
input [WIDTH-1:0] VN3_dout_01_00,
input [WIDTH-1:0] VN3_dout_02_05, //后面的05代表H阵原模图的II5
input [WIDTH-1:0] VN3_dout_02_06, //后面的06代表H阵原模图的II6
input [WIDTH-1:0] VN3_dout_03_07, //后面的07代表H阵原模图的II7
input [WIDTH-1:0] VN3_dout_03_08, //后面的08代表H阵原模图的II8
input [WIDTH-1:0] VN3_dout_04_00,
//VN读地址,H阵第1行
output reg [8:0] VN1_addr_rd_01_00=9'd511,
output reg [9:0] VN1_addr_rd_02_00=10'd1023,
output reg [9:0] VN1_addr_rd_02_01=10'd511,
//VN读地址,H阵第2行
output reg [8:0] VN2_addr_rd_01_00=9'd511,
output reg [8:0] VN2_addr_rd_02_00=9'd511,
output reg [8:0] VN2_addr_rd_03_00=9'd511,
output reg [9:0] VN2_addr_rd_04_02=10'd1023,
output reg [9:0] VN2_addr_rd_04_03=10'd511,
output reg [8:0] VN2_addr_rd_04_04=9'd511,
//VN读地址,H阵第3行
output reg [8:0] VN3_addr_rd_01_00=9'd511,
output reg [9:0] VN3_addr_rd_02_05=10'd1023,
output reg [9:0] VN3_addr_rd_02_06=10'd511,
output reg [9:0] VN3_addr_rd_03_07=10'd1023,
output reg [9:0] VN3_addr_rd_03_08=10'd511,
output reg [8:0] VN3_addr_rd_04_00=9'd511,
//CN写使能
output reg [0:0] CN_wea=1'd0,
//CN写地址,H阵第1行
output reg [8:0] CN1_addr_wr_01_00=9'd511,
output reg [9:0] CN1_addr_wr_02_00=10'd1023,
output reg [9:0] CN1_addr_wr_02_01=10'd511,
//CN写地址,H阵第2行
output reg [8:0] CN2_addr_wr_01_00=9'd511,
output reg [8:0] CN2_addr_wr_02_00=9'd511,
output reg [8:0] CN2_addr_wr_03_00=9'd511,
output reg [9:0] CN2_addr_wr_04_02=10'd1023,
output reg [9:0] CN2_addr_wr_04_03=10'd511,
output reg [8:0] CN2_addr_wr_04_04=9'd511,
//CN写地址,H阵第3行
output reg [8:0] CN3_addr_wr_01_00=9'd511,
output reg [9:0] CN3_addr_wr_02_05=10'd1023,
output reg [9:0] CN3_addr_wr_02_06=10'd511,
output reg [9:0] CN3_addr_wr_03_07=10'd1023,
output reg [9:0] CN3_addr_wr_03_08=10'd511,
output reg [8:0] CN3_addr_wr_04_00=9'd511,
//CN写数据,H阵第1行
output reg [WIDTH-1:0] CN1_din_01_00=8'd0,
output reg [WIDTH-1:0] CN1_din_02_00=8'd0,
output reg [WIDTH-1:0] CN1_din_02_01=8'd0,
//CN写数据,H阵第2行
output reg [WIDTH-1:0] CN2_din_01_00=8'd0,
output reg [WIDTH-1:0] CN2_din_02_00=8'd0,
output reg [WIDTH-1:0] CN2_din_03_00=8'd0,
output reg [WIDTH-1:0] CN2_din_04_02=8'd0,
output reg [WIDTH-1:0] CN2_din_04_03=8'd0,
output reg [WIDTH-1:0] CN2_din_04_04=8'd0,
//CN写数据,H阵第3行
output reg [WIDTH-1:0] CN3_din_01_00=8'd0,
output reg [WIDTH-1:0] CN3_din_02_05=8'd0,
output reg [WIDTH-1:0] CN3_din_02_06=8'd0,
output reg [WIDTH-1:0] CN3_din_03_07=8'd0,
output reg [WIDTH-1:0] CN3_din_03_08=8'd0,
output reg [WIDTH-1:0] CN3_din_04_00=8'd0,
output end_CN //模块结束标志,高脉冲
);
reg [10:0] cnt_CN=11'd0;
reg flag_CN=1'd0;
// 产生该模块的计数基准
always @ (posedge clk) begin
if(rst_CN) begin
cnt_CN <= 11'd0;
flag_CN <= 1'b0;
end else begin
if(start_CN) begin
flag_CN <= 1'b1;
cnt_CN <= 11'd0;
end else begin
if(flag_CN) begin
if(cnt_CN<11'd560)begin
flag_CN <= flag_CN;
cnt_CN <= cnt_CN + 11'd1;
end else begin
cnt_CN <= cnt_CN;
flag_CN<= 1'b0;
end
end else begin
cnt_CN <= cnt_CN;
end
end
end
end
// 对VN地址操作
always @ (posedge clk) begin
if (rst_CN) begin
VN1_addr_rd_01_00 <= 9'd511;
VN1_addr_rd_02_00 <= 10'd1023;
VN2_addr_rd_01_00 <= 9'd511;
VN2_addr_rd_02_00 <= 9'd511;
VN2_addr_rd_03_00 <= 9'd511;
VN3_addr_rd_01_00 <= 9'd511;
VN3_addr_rd_04_00 <= 9'd511;
VN1_addr_rd_02_01 <= 10'd511;
VN2_addr_rd_04_02 <= 10'd1023;
VN2_addr_rd_04_03 <= 10'd511;
VN2_addr_rd_04_04 <= 9'd511;
VN3_addr_rd_02_05 <= 10'd1023;
VN3_addr_rd_02_06 <= 10'd511;
VN3_addr_rd_03_07 <= 10'd1023;
VN3_addr_rd_03_08 <= 10'd511;
end else begin
if (cnt_CN >= 11'd1 && cnt_CN <= 11'd512) begin
VN1_addr_rd_01_00 <= VN1_addr_rd_01_00 + 9'd1;
VN1_addr_rd_02_00 <= VN1_addr_rd_02_00 + 9'd1;
VN2_addr_rd_01_00 <= VN2_addr_rd_01_00 + 9'd1;
VN2_addr_rd_02_00 <= VN2_addr_rd_02_00 + 9'd1;
VN2_addr_rd_03_00 <= VN2_addr_rd_03_00 + 9'd1;
VN3_addr_rd_01_00 <= VN3_addr_rd_01_00 + 9'd1;
VN3_addr_rd_04_00 <= VN3_addr_rd_04_00 + 9'd1;
VN1_addr_rd_02_01 <= VN1_addr_rd_02_01 + 10'd1;
VN2_addr_rd_04_02 <= VN2_addr_rd_04_02 + 10'd1;
VN2_addr_rd_04_03 <= VN2_addr_rd_04_03 + 10'd1;
VN2_addr_rd_04_04 <= VN2_addr_rd_04_04 + 9'd1;
VN3_addr_rd_02_05 <= VN3_addr_rd_02_05 + 10'd1;
VN3_addr_rd_02_06 <= VN3_addr_rd_02_06 + 10'd1;
VN3_addr_rd_03_07 <= VN3_addr_rd_03_07 + 10'd1;
VN3_addr_rd_03_08 <= VN3_addr_rd_03_08 + 10'd1;
end else begin
VN1_addr_rd_01_00 <= 9'd511;
VN1_addr_rd_02_00 <= 10'd1023;
VN2_addr_rd_01_00 <= 9'd511;
VN2_addr_rd_02_00 <= 9'd511;
VN2_addr_rd_03_00 <= 9'd511;
VN3_addr_rd_01_00 <= 9'd511;
VN3_addr_rd_04_00 <= 9'd511;
VN1_addr_rd_02_01 <= 10'd511;
VN2_addr_rd_04_02 <= 10'd1023;
VN2_addr_rd_04_03 <= 10'd511;
VN2_addr_rd_04_04 <= 9'd511;
VN3_addr_rd_02_05 <= 10'd1023;
VN3_addr_rd_02_06 <= 10'd511;
VN3_addr_rd_03_07 <= 10'd1023;
VN3_addr_rd_03_08 <= 10'd511;
end
end
end
wire [WIDTH-1:0] din01_VN_RU01;
wire [WIDTH-1:0] din02_VN_RU01;
wire [WIDTH-1:0] din03_VN_RU01;
wire [WIDTH-1:0] dout01_RU01 ;
wire [WIDTH-1:0] dout02_RU01 ;
wire [WIDTH-1:0] dout03_RU01 ;
wire [WIDTH-1:0] din01_VN_RU02;
wire [WIDTH-1:0] din02_VN_RU02;
wire [WIDTH-1:0] din03_VN_RU02;
wire [WIDTH-1:0] din04_VN_RU02;
wire [WIDTH-1:0] din05_VN_RU02;
wire [WIDTH-1:0] din06_VN_RU02;
wire [WIDTH-1:0] dout01_RU02 ;
wire [WIDTH-1:0] dout02_RU02 ;
wire [WIDTH-1:0] dout03_RU02 ;
wire [WIDTH-1:0] dout04_RU02 ;
wire [WIDTH-1:0] dout05_RU02 ;
wire [WIDTH-1:0] dout06_RU02 ;
wire [WIDTH-1:0] din01_VN_RU03;
wire [WIDTH-1:0] din02_VN_RU03;
wire [WIDTH-1:0] din03_VN_RU03;
wire [WIDTH-1:0] din04_VN_RU03;
wire [WIDTH-1:0] din05_VN_RU03;
wire [WIDTH-1:0] din06_VN_RU03;
wire [WIDTH-1:0] dout01_RU03 ;
wire [WIDTH-1:0] dout02_RU03 ;
wire [WIDTH-1:0] dout03_RU03 ;
wire [WIDTH-1:0] dout04_RU03 ;
wire [WIDTH-1:0] dout05_RU03 ;
wire [WIDTH-1:0] dout06_RU03 ;
CNU_3din #(.WIDTH(WIDTH)) RU_01 (
.clk(clk),
.din01_VN_RU(din01_VN_RU01),
.din02_VN_RU(din02_VN_RU01),
.din03_VN_RU(din03_VN_RU01),
.dout01_RU(dout01_RU01),
.dout02_RU(dout02_RU01),
.dout03_RU(dout03_RU01)
);
CNU_6din #(.WIDTH(WIDTH)) RU_02 (
.clk(clk),
.din01_VN_RU(din01_VN_RU02),
.din02_VN_RU(din02_VN_RU02),
.din03_VN_RU(din03_VN_RU02),
.din04_VN_RU(din04_VN_RU02),
.din05_VN_RU(din05_VN_RU02),
.din06_VN_RU(din06_VN_RU02),
.dout01_RU(dout01_RU02),
.dout02_RU(dout02_RU02),
.dout03_RU(dout03_RU02),
.dout04_RU(dout04_RU02),
.dout05_RU(dout05_RU02),
.dout06_RU(dout06_RU02)
);
CNU_6din #(.WIDTH(WIDTH)) RU_03 (
.clk(clk),
.din01_VN_RU(din01_VN_RU03),
.din02_VN_RU(din02_VN_RU03),
.din03_VN_RU(din03_VN_RU03),
.din04_VN_RU(din04_VN_RU03),
.din05_VN_RU(din05_VN_RU03),
.din06_VN_RU(din06_VN_RU03),
.dout01_RU(dout01_RU03),
.dout02_RU(dout02_RU03),
.dout03_RU(dout03_RU03),
.dout04_RU(dout04_RU03),
.dout05_RU(dout05_RU03),
.dout06_RU(dout06_RU03)
);
// 设置读操作的时延
parameter DELAY_RD = 11'd6;
// RU模块的输入
assign din01_VN_RU01 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN1_dout_01_00 : 8'd0;
assign din02_VN_RU01 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN1_dout_02_00 : 8'd0;
assign din03_VN_RU01 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN1_dout_02_01 : 8'd0;
assign din01_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_01_00 : 8'd0;
assign din02_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_02_00 : 8'd0;
assign din03_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_03_00 : 8'd0;
assign din04_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_04_02 : 8'd0;
assign din05_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_04_03 : 8'd0;
assign din06_VN_RU02 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN2_dout_04_04 : 8'd0;
assign din01_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_01_00 : 8'd0;
assign din02_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_02_05 : 8'd0;
assign din03_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_02_06 : 8'd0;
assign din04_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_03_07 : 8'd0;
assign din05_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_03_08 : 8'd0;
assign din06_VN_RU03 = (cnt_CN >= 11'd1+DELAY_RD && cnt_CN<=11'd512+DELAY_RD) ? VN3_dout_04_00 : 8'd0;
// 设置写操作的时延
parameter DELAY_WR = 11'd15;
// 控制CN的写使能
always @ (posedge clk) begin
if(rst_CN) begin
CN_wea <= 1'd0;
end else begin
if (cnt_CN >= 11'd1 + DELAY_WR && cnt_CN <= 11'd512 + DELAY_WR)
CN_wea <= 1'd1;
else
CN_wea <= 1'd0;
end
end
// 控制CN存储的写地址
always @ (posedge clk) begin
if (rst_CN) begin
CN1_addr_wr_01_00 <= 9'd511;
CN1_addr_wr_02_00 <= 10'd1023;
CN2_addr_wr_01_00 <= 9'd511;
CN2_addr_wr_02_00 <= 9'd511;
CN2_addr_wr_03_00 <= 9'd511;
CN3_addr_wr_01_00 <= 9'd511;
CN3_addr_wr_04_00 <= 9'd511;
CN1_addr_wr_02_01 <= 10'd511;
CN2_addr_wr_04_02 <= 10'd1023;
CN2_addr_wr_04_03 <= 10'd511;
CN2_addr_wr_04_04 <= 9'd511;
CN3_addr_wr_02_05 <= 10'd1023;
CN3_addr_wr_02_06 <= 10'd511;
CN3_addr_wr_03_07 <= 10'd1023;
CN3_addr_wr_03_08 <= 10'd511;
end else begin
if (cnt_CN >= 11'd1 + DELAY_WR && cnt_CN <= 11'd512 + DELAY_WR) begin
CN1_addr_wr_01_00 <= CN1_addr_wr_01_00 + 9'd1;
CN1_addr_wr_02_00 <= CN1_addr_wr_02_00 + 9'd1;
CN2_addr_wr_01_00 <= CN2_addr_wr_01_00 + 9'd1;
CN2_addr_wr_02_00 <= CN2_addr_wr_02_00 + 9'd1;
CN2_addr_wr_03_00 <= CN2_addr_wr_03_00 + 9'd1;
CN3_addr_wr_01_00 <= CN3_addr_wr_01_00 + 9'd1;
CN3_addr_wr_04_00 <= CN3_addr_wr_04_00 + 9'd1;
CN1_addr_wr_02_01 <= CN1_addr_wr_02_01 + 10'd1;
CN2_addr_wr_04_02 <= CN2_addr_wr_04_02 + 10'd1;
CN2_addr_wr_04_03 <= CN2_addr_wr_04_03 + 10'd1;
CN2_addr_wr_04_04 <= CN2_addr_wr_04_04 + 9'd1;
CN3_addr_wr_02_05 <= CN3_addr_wr_02_05 + 10'd1;
CN3_addr_wr_02_06 <= CN3_addr_wr_02_06 + 10'd1;
CN3_addr_wr_03_07 <= CN3_addr_wr_03_07 + 10'd1;
CN3_addr_wr_03_08 <= CN3_addr_wr_03_08 + 10'd1;
end else begin
CN1_addr_wr_01_00 <= 9'd511;
CN1_addr_wr_02_00 <= 10'd1023;
CN2_addr_wr_01_00 <= 9'd511;
CN2_addr_wr_02_00 <= 9'd511;
CN2_addr_wr_03_00 <= 9'd511;
CN3_addr_wr_01_00 <= 9'd511;
CN3_addr_wr_04_00 <= 9'd511;
CN1_addr_wr_02_01 <= 10'd511;
CN2_addr_wr_04_02 <= 10'd1023;
CN2_addr_wr_04_03 <= 10'd511;
CN2_addr_wr_04_04 <= 9'd511;
CN3_addr_wr_02_05 <= 10'd1023;
CN3_addr_wr_02_06 <= 10'd511;
CN3_addr_wr_03_07 <= 10'd1023;
CN3_addr_wr_03_08 <= 10'd511;
end
end
end
// 控制CN的写数据
always @ (posedge clk) begin
if (rst_CN) begin
CN1_din_01_00 <= 8'd0;
CN1_din_02_00 <= 8'd0;
CN2_din_01_00 <= 8'd0;
CN2_din_02_00 <= 8'd0;
CN2_din_03_00 <= 8'd0;
CN3_din_01_00 <= 8'd0;
CN3_din_04_00 <= 8'd0;
CN1_din_02_01 <= 8'd0;
CN2_din_04_02 <= 8'd0;
CN2_din_04_03 <= 8'd0;
CN2_din_04_04 <= 8'd0;
CN3_din_02_05 <= 8'd0;
CN3_din_02_06 <= 8'd0;
CN3_din_03_07 <= 8'd0;
CN3_din_03_08 <= 8'd0;
end else begin
if (cnt_CN >= 11'd1 + DELAY_WR && cnt_CN <= 11'd512 + DELAY_WR) begin
CN1_din_01_00 <= dout01_RU01;
CN1_din_02_00 <= dout02_RU01;
CN2_din_01_00 <= dout01_RU02;
CN2_din_02_00 <= dout02_RU02;
CN2_din_03_00 <= dout03_RU02;
CN3_din_01_00 <= dout01_RU03;
CN3_din_04_00 <= dout06_RU03;
CN1_din_02_01 <= dout03_RU01;
CN2_din_04_02 <= dout04_RU02;
CN2_din_04_03 <= dout05_RU02;
CN2_din_04_04 <= dout06_RU02;
CN3_din_02_05 <= dout02_RU03;
CN3_din_02_06 <= dout03_RU03;
CN3_din_03_07 <= dout04_RU03;
CN3_din_03_08 <= dout05_RU03;
end else begin
CN1_din_01_00 <= 8'd0;
CN1_din_02_00 <= 8'd0;
CN2_din_01_00 <= 8'd0;
CN2_din_02_00 <= 8'd0;
CN2_din_03_00 <= 8'd0;
CN3_din_01_00 <= 8'd0;
CN3_din_04_00 <= 8'd0;
CN1_din_02_01 <= 8'd0;
CN2_din_04_02 <= 8'd0;
CN2_din_04_03 <= 8'd0;
CN2_din_04_04 <= 8'd0;
CN3_din_02_05 <= 8'd0;
CN3_din_02_06 <= 8'd0;
CN3_din_03_07 <= 8'd0;
CN3_din_03_08 <= 8'd0;
end
end
end
//状态指示
assign end_CN = (cnt_CN == 11'd512 + DELAY_WR + 11'd2) ? 1'd1 : 1'd0;
endmodule