reg [5:0] cnter; always @(posedge clk) begin if (rst) begin cnter <= 6'd0; endelsebegin cnter <= cnter + 6'd1; end end
// Suppose the data signal remains unchanged each time // the valid signal is raised always @(posedge clk) begin if (rst) begin valid <= 1'b0; endelsebegin if (cnter == 6'd46) begin valid <= 1'b1; endelsebegin valid <= 1'b0; end end end
reg [11:0] data_buf; always @(posedge clk) begin if (rst) begin data_buf <= 12'd0; data <= 12'd0; endelsebegin if (cnter == 6'd47) begin data_buf <= data; data <= 12'd0; endelseif (cnter == 6'd63) begin data_buf <= data_buf; data <= data_buf + 12'd1; end end end
reg [7:0] virtual_dual_ram_waddr; wire [7:0] virtual_dual_ram_raddr; always @(posedge clk) begin if (rst) begin virtual_dual_ram_waddr <= 18'd0; endelsebegin virtual_dual_ram_waddr <= virtual_dual_ram_waddr + 18'd1; end end
addsub0808 addsub0808_inst ( .ADD ( 1'b0 ), // 1 - add, 0 - sub .A ( virtual_dual_ram_waddr ), // input [7:0] A .B ( delay ), // input [7:0] B .S ( virtual_dual_ram_raddr ) // output [7:0] S );
// 1. update state always @(posedge clk) begin if (rst) begin delay_wr_state <= 2'd0; endelsebegin delay_wr_state <= delay_wr_next_state; end end
// 2. update next_state reg virtual_dual_ram_din_valid_d1; always @(posedge clk) begin if (rst) begin virtual_dual_ram_din_valid_d1 <= 1'b0; endelsebegin virtual_dual_ram_din_valid_d1 <= virtual_dual_ram_din_valid; end end
always @(*) begin case (delay_wr_state) 2'd0: begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin delay_wr_next_state = 2'd1; endelsebegin delay_wr_next_state = 2'd0; end end 2'd1: begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin delay_wr_next_state = 2'd2; endelsebegin delay_wr_next_state = 2'd1; end end 2'd2: begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin delay_wr_next_state = 2'd3; endelsebegin delay_wr_next_state = 2'd2; end end 2'd3: begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin delay_wr_next_state = 2'd0; endelsebegin delay_wr_next_state = 2'd3; end end endcase end
// 3. Write virtual dual RAM always @(posedge clk) begin case (delay_wr_state) 2'd0: begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin virtual_dual_ram_00 <= virtual_dual_ram_din[11:0]; delay_raddr_real_00 <= virtual_dual_ram_waddr; endelsebegin virtual_dual_ram_00 <= virtual_dual_ram_00; delay_raddr_real_00 <= delay_raddr_real_00; end end 2'd1: begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin virtual_dual_ram_01 <= virtual_dual_ram_din[11:0]; delay_raddr_real_01 <= virtual_dual_ram_waddr; endelsebegin virtual_dual_ram_01 <= virtual_dual_ram_01; delay_raddr_real_01 <= delay_raddr_real_01; end end 2'd2: begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin virtual_dual_ram_02 <= virtual_dual_ram_din[11:0]; delay_raddr_real_02 <= virtual_dual_ram_waddr; endelsebegin virtual_dual_ram_02 <= virtual_dual_ram_02; delay_raddr_real_02 <= delay_raddr_real_02; end end 2'd3: begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin virtual_dual_ram_03 <= virtual_dual_ram_din[11:0]; delay_raddr_real_03 <= virtual_dual_ram_waddr; endelsebegin virtual_dual_ram_03 <= virtual_dual_ram_03; delay_raddr_real_03 <= delay_raddr_real_03; end end endcase end
// 3. Write virtual dual RAM reg [3:0] virtual_dual_bram_data_flag = 4'b0000; always @(posedge clk) begin if (virtual_dual_ram_din_valid & ~virtual_dual_ram_din_valid_d1) begin case (delay_wr_state) 2'd0: begin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag | 4'b0001; end 2'd1: begin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag | 4'b0010; end 2'd2: begin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag | 4'b0100; end 2'd3: begin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag | 4'b1000; end endcase endelsebegin if (virtual_dual_ram_raddr == delay_raddr_real_00 && virtual_dual_bram_data_flag[0]) begin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag & 4'b1110; endelseif (virtual_dual_ram_raddr == delay_raddr_real_01 && virtual_dual_bram_data_flag[1]) begin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag & 4'b1101; endelseif (virtual_dual_ram_raddr == delay_raddr_real_02 && virtual_dual_bram_data_flag[2]) begin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag & 4'b1011; endelseif (virtual_dual_ram_raddr == delay_raddr_real_03 && virtual_dual_bram_data_flag[3]) begin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag & 4'b0111; endelsebegin virtual_dual_bram_data_flag <= virtual_dual_bram_data_flag & 4'b1111; end end end
// 3. Read virtual dual RAM always @(posedge clk) begin if (rst) begin virtual_dual_ram_dout <= 12'd0; virtual_dual_ram_dout_valid <= 1'b0; endelseif (virtual_dual_ram_raddr + 8'd1 == delay_raddr_real_00 && virtual_dual_bram_data_flag[0]) begin virtual_dual_ram_dout <= virtual_dual_ram_00; virtual_dual_ram_dout_valid <= 1'b1; endelseif (virtual_dual_ram_raddr + 8'd1 == delay_raddr_real_01 && virtual_dual_bram_data_flag[1]) begin virtual_dual_ram_dout <= virtual_dual_ram_01; virtual_dual_ram_dout_valid <= 1'b1; endelseif (virtual_dual_ram_raddr + 8'd1 == delay_raddr_real_02 && virtual_dual_bram_data_flag[2]) begin virtual_dual_ram_dout <= virtual_dual_ram_02; virtual_dual_ram_dout_valid <= 1'b1; endelseif (virtual_dual_ram_raddr + 8'd1 == delay_raddr_real_03 && virtual_dual_bram_data_flag[3]) begin virtual_dual_ram_dout <= virtual_dual_ram_03; virtual_dual_ram_dout_valid <= 1'b1; endelsebegin virtual_dual_ram_dout <= virtual_dual_ram_dout; virtual_dual_ram_dout_valid <= 1'b0; end end