module paj_raygentop_hierarchy_no_mem (rgwant_addr, rgwant_data, rgread_ready, rgaddr_ready, rgdata_ready, rgwant_read, rgdatain, rgdataout, rgaddrin, rgCont, rgStat, rgCfgData, rgwant_CfgData, rgCfgData_ready, tm3_sram_data_in, tm3_sram_data_out, tm3_sram_addr, tm3_sram_we, tm3_sram_oe, tm3_sram_adsp, tm3_clk_v0, fbdata, fbdatavalid, fbnextscanline, raygroup01, raygroupvalid01, busy01, raygroup10, raygroupvalid10, busy10, globalreset, rgData, rgAddr, rgWE, rgAddrValid, rgDone, rgResultData, rgResultReady, rgResultSource); output rgwant_addr; wire rgwant_addr; output rgwant_data; wire rgwant_data; output rgread_ready; wire rgread_ready; input rgaddr_ready; input rgdata_ready; input rgwant_read; input[63:0] rgdatain; output[63:0] rgdataout; wire[63:0] rgdataout; input[17:0] rgaddrin; input[31:0] rgCont; output[31:0] rgStat; wire[31:0] rgStat; input[31:0] rgCfgData; output rgwant_CfgData; wire rgwant_CfgData; input rgCfgData_ready; input[63:0] tm3_sram_data_in; wire[63:0] tm3_sram_data_in; output[63:0] tm3_sram_data_out; wire[63:0] tm3_sram_data_out; wire[63:0] tm3_sram_data_xhdl0; output[18:0] tm3_sram_addr; wire[18:0] tm3_sram_addr; output[7:0] tm3_sram_we; wire[7:0] tm3_sram_we; output[1:0] tm3_sram_oe; wire[1:0] tm3_sram_oe; output tm3_sram_adsp; wire tm3_sram_adsp; input tm3_clk_v0; output[63:0] fbdata; wire[63:0] fbdata; output fbdatavalid; wire fbdatavalid; input fbnextscanline; output[1:0] raygroup01; wire[1:0] raygroup01; output raygroupvalid01; wire raygroupvalid01; input busy01; output[1:0] raygroup10; wire[1:0] raygroup10; output raygroupvalid10; wire raygroupvalid10; input busy10; input globalreset; output[31:0] rgData; wire[31:0] rgData; output[3:0] rgAddr; wire[3:0] rgAddr; output[2:0] rgWE; wire[2:0] rgWE; output rgAddrValid; wire rgAddrValid; input rgDone; input[31:0] rgResultData; input rgResultReady; input[1:0] rgResultSource; wire[2:0] statepeek2; wire as01; wire ack01; wire[3:0] addr01; wire[47:0] dir01; wire[47:0] dir; wire[47:0] sramdatal; wire wantDir; wire dirReady; wire dirReadyl; wire[14:0] address; wire[30:0] cyclecounter; wire nas01; wire nas10; wire go; reg page; wire[2:0] statepeekct; // result Signals wire valid01; wire valid10; wire[15:0] id01a; wire[15:0] id01b; wire[15:0] id01c; wire[15:0] id10a; wire[15:0] id10b; wire[15:0] id10c; wire hit01a; wire hit01b; wire hit01c; wire hit10a; wire hit10b; wire hit10c; wire[7:0] u01a; wire[7:0] u01b; wire[7:0] u01c; wire[7:0] v01a; wire[7:0] v01b; wire[7:0] v01c; wire[7:0] u10a; wire[7:0] u10b; wire[7:0] u10c; wire[7:0] v10a; wire[7:0] v10b; wire[7:0] v10c; wire wantwriteback; wire writebackack; wire[63:0] writebackdata; wire[17:0] writebackaddr; wire[17:0] nextaddr01; // Shading Signals wire[63:0] shadedata; wire[15:0] triID; wire wantshadedata; wire shadedataready; // CfgData Signals wire[27:0] origx; wire[27:0] origy; wire[27:0] origz; wire[15:0] m11; wire[15:0] m12; wire[15:0] m13; wire[15:0] m21; wire[15:0] m22; wire[15:0] m23; wire[15:0] m31; wire[15:0] m32; wire[15:0] m33; wire[20:0] bkcolour; // Texture signals wire[20:0] texinfo; wire[3:0] texaddr; wire[63:0] texel; wire[17:0] texeladdr; wire wanttexel; wire texelready; // Frame Buffer Read Signals wire fbpage; // debug signals wire wantcfg; wire debugglobalreset; assign rgwant_CfgData = wantcfg ; onlyonecycle onlyeonecycleinst (rgCont[0], go, globalreset, tm3_clk_v0); always @(posedge tm3_clk_v0) begin if (globalreset == 1'b1) begin page <= 1'b1 ; // Reset to 1 such that first flip sets to 0 end else begin page <= ~page ; end end assign fbpage = ~page ; matmult matmultinst(sramdatal[47:32], sramdatal[31:16], sramdatal[15:0], m11, m12, m13, m21, m22, m23, m31, m32, m33, dir[47:32], dir[31:16], dir[15:0], tm3_clk_v0); delay1x3 dir01delay(dirReady, dirReadyl, tm3_clk_v0); rgconfigmemory ConfigMemoryInst (rgCfgData[31:28], rgCfgData[27:0], rgCfgData_ready, wantcfg, origx, origy, origz, m11, m12, m13, m21, m22, m23, m31, m32, m33, bkcolour, texinfo, globalreset, tm3_clk_v0); rgsramcontroller sramcont (rgwant_addr, rgaddr_ready, rgaddrin, rgwant_data, rgdata_ready, rgdatain, rgwant_read, rgread_ready, rgdataout, dirReady, wantDir, sramdatal, address, wantwriteback, writebackack, writebackdata, writebackaddr, fbdata, fbnextscanline, fbdatavalid, fbpage, shadedata, triID, wantshadedata, shadedataready, texeladdr, texel, wanttexel, texelready, tm3_sram_data_in, tm3_sram_data_out, tm3_sram_addr, tm3_sram_we, tm3_sram_oe, tm3_sram_adsp, globalreset, tm3_clk_v0); raysend raysendinst (as01, ack01, addr01, dir01, origx, origy, origz, rgData, rgAddr, rgWE, rgAddrValid, rgDone, globalreset, tm3_clk_v0, statepeek2); raygencont raygencontinst(go, rgCont[15:1], rgStat[31], cyclecounter, nextaddr01, nas01, nas10, page, dirReadyl, wantDir, dir, address, as01, addr01, ack01, dir01, raygroup01, raygroupvalid01, busy01, raygroup10, raygroupvalid10, busy10, globalreset, tm3_clk_v0, statepeekct); resultrecieve resultrecieveinst (valid01, valid10, id01a, id01b, id01c, id10a, id10b, id10c, hit01a, hit01b, hit01c, hit10a, hit10b, hit10c, u01a, u01b, u01c, v01a, v01b, v01c, u10a, u10b, u10c, v10a, v10b, v10c, rgResultData, rgResultReady, rgResultSource, globalreset, tm3_clk_v0); assign debugglobalreset = globalreset | go ; resultwriter resultwriteinst (valid01, valid10, id01a, id01b, id01c, id10a, id10b, id10c, hit01a, hit01b, hit01c, hit10a, hit10b, hit10c, u01a, u01b, u01c, v01a, v01b, v01c, u10a, u10b, u10c, v10a, v10b, v10c, nextaddr01, nas01, nas10, bkcolour, shadedata, triID, wantshadedata, shadedataready, texinfo, texaddr, texeladdr, texel, wanttexel, texelready, writebackdata, writebackaddr, wantwriteback, writebackack, debugglobalreset, tm3_clk_v0); assign rgStat[30:0] = cyclecounter ; endmodule module delay1x3 (datain, dataout, clk); input datain; output dataout; wire dataout; input clk; reg buff0; reg buff1; reg buff2; assign dataout = buff2 ; always @(posedge clk) begin /* PAJ expanded for loop to hard definition the size of `depth */ buff0 <= datain ; buff1 <= buff0; buff2 <= buff1; end endmodule // A debugging circuit that allows a single cycle pulse to be // generated by through the ports package module onlyonecycle (trigger, output_xhdl0, globalreset, clk); input trigger; output output_xhdl0; reg output_xhdl0; input globalreset; input clk; reg[1:0] state; reg[1:0] next_state; reg count; reg temp_count; always @(posedge clk) begin if (globalreset == 1'b1) begin state <= 0 ; count <= 0 ; end else begin state <= next_state ; count <= temp_count; end end always @(state or trigger or count) begin case (state) 0 : begin output_xhdl0 = 1'b0 ; if (trigger == 1'b1) begin next_state = 1 ; end else begin next_state = 0 ; end temp_count = 1 - 1 ; end 1 : begin output_xhdl0 = 1'b1 ; if (count == 0) begin next_state = 2 ; end else begin next_state = 1 ; end temp_count = count - 1 ; end 2 : begin output_xhdl0 = 1'b0 ; if (trigger == 1'b0) begin next_state = 0 ; end else begin next_state = 2 ; end end endcase end endmodule module matmult (Ax, Ay, Az, m11, m12, m13, m21, m22, m23, m31, m32, m33, Cx, Cy, Cz, clk); input[16 - 1:0] Ax; input[16 - 1:0] Ay; input[16 - 1:0] Az; input[16 - 1:0] m11; input[16 - 1:0] m12; input[16 - 1:0] m13; input[16 - 1:0] m21; input[16 - 1:0] m22; input[16 - 1:0] m23; input[16 - 1:0] m31; input[16 - 1:0] m32; input[16 - 1:0] m33; output[16 - 1:0] Cx; reg[16 - 1:0] Cx; output[16 - 1:0] Cy; reg[16 - 1:0] Cy; output[16 - 1:0] Cz; reg[16 - 1:0] Cz; input clk; reg[16 + 16 - 1:0] am11; reg[16 + 16 - 1:0] am12; reg[16 + 16 - 1:0] am13; reg[16 + 16 - 1:0] am21; reg[16 + 16 - 1:0] am22; reg[16 + 16 - 1:0] am23; reg[16 + 16 - 1:0] am31; reg[16 + 16 - 1:0] am32; reg[16 + 16 - 1:0] am33; always @(posedge clk) begin am11 <= Ax * m11 ; am12 <= Ay * m12 ; am13 <= Az * m13 ; am21 <= Ax * m21 ; am22 <= Ay * m22 ; am23 <= Az * m23 ; am31 <= Ax * m31 ; am32 <= Ay * m32 ; am33 <= Az * m33 ; // Cx <= (am11 + am12 + am13) (`widthA+`widthB-2 downto `widthB-1); // Cy <= (am21 + am22 + am23) (`widthA+`widthB-2 downto `widthB-1); // Cz <= (am31 + am32 + am33) (`widthA+`widthB-2 downto `widthB-1); Cx <= (am11[16+16-2:16-1] + am12[16+16-2:16-1] + am13[16+16-2:16-1]) ; Cy <= (am21[16+16-2:16-1] + am22[16+16-2:16-1] + am23[16+16-2:16-1]); Cz <= (am31[16+16-2:16-1] + am32[16+16-2:16-1] + am33[16+16-2:16-1]) ; end endmodule module rgconfigmemory (CfgAddr, CfgData, CfgData_Ready, want_CfgData, origx, origy, origz, m11, m12, m13, m21, m22, m23, m31, m32, m33, bkcolour, texinfo, globalreset, clk); input[3:0] CfgAddr; input[27:0] CfgData; input CfgData_Ready; output want_CfgData; reg want_CfgData; output[27:0] origx; reg[27:0] origx; output[27:0] origy; reg[27:0] origy; output[27:0] origz; reg[27:0] origz; output[15:0] m11; reg[15:0] m11; output[15:0] m12; reg[15:0] m12; output[15:0] m13; reg[15:0] m13; output[15:0] m21; reg[15:0] m21; output[15:0] m22; reg[15:0] m22; output[15:0] m23; reg[15:0] m23; output[15:0] m31; reg[15:0] m31; output[15:0] m32; reg[15:0] m32; output[15:0] m33; reg[15:0] m33; output[20:0] bkcolour; reg[20:0] bkcolour; output[20:0] texinfo; wire[20:0] texinfo; input globalreset; input clk; reg state; reg next_state; wire we; reg[27:0] temp_origx; reg[27:0] temp_origy; reg[27:0] temp_origz; reg[15:0] temp_m11; reg[15:0] temp_m12; reg[15:0] temp_m13; reg[15:0] temp_m21; reg[15:0] temp_m22; reg[15:0] temp_m23; reg[15:0] temp_m31; reg[15:0] temp_m32; reg[15:0] temp_m33; reg[20:0] temp_bkcolour; // <> Can't find translated component 'spram'. Module name may not match spram21x4 spraminst(we, texinfo, CfgData[20:0], clk); assign we = ((CfgData_Ready == 1'b1) & (CfgAddr == 4'b1110)) ? 1'b1 : 1'b0 ; always @(posedge clk) begin if (globalreset == 1'b1) begin state <= 0 ; origx <= 0; origy <= 0; origz <= 0; m11 <= 1; m12 <= 0; m13 <= 0; m21 <= 0; m22 <= 1; m23 <= 0; m31 <= 0; m32 <= 0; m33 <= 1; bkcolour <= 0; end else begin state <= next_state ; origx <= temp_origx; origy <= temp_origy; origz <= temp_origz; m11 <= temp_m11; m12 <= temp_m12; m13 <= temp_m13; m21 <= temp_m21; m22 <= temp_m22; m23 <= temp_m23; m31 <= temp_m31; m32 <= temp_m32; m33 <= temp_m33; bkcolour <= bkcolour; end end always @(state or CfgData_Ready) begin case (state) 0 : begin want_CfgData = 1'b1 ; if (CfgData_Ready == 1'b1) begin next_state = 1 ; end else begin next_state = 0 ; end if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b0001)) begin temp_origx = CfgData ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b0010)) begin temp_origy = CfgData ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b0011)) begin temp_origz = CfgData ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b0100)) begin temp_m11 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b0101)) begin temp_m12 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b0110)) begin temp_m13 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b0111)) begin temp_m21 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b1000)) begin temp_m22 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b1001)) begin temp_m23 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b1010)) begin temp_m31 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b1011)) begin temp_m32 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b1100)) begin temp_m33 = CfgData[15:0] ; end else if ((CfgData_Ready == 1'b1) && (CfgAddr == 4'b1101)) begin temp_bkcolour = CfgData[20:0] ; end end 1 : begin want_CfgData = 1'b0 ; if (CfgData_Ready == 1'b0) begin next_state = 0 ; end else begin next_state = 1 ; end end endcase end endmodule module spram21x4 (we, dataout, datain, clk); input we; output[21 - 1:0] dataout; wire[21 - 1:0] dataout; input[21 - 1:0] datain; input clk; reg [7:0] addr; always @ (posedge clk) begin addr[0] <= we; addr [1] <= addr[0]; addr [2] <= addr[1]; addr [3] <= addr[2]; addr [4] <= addr[3]; addr [5] <= addr[4]; addr [6] <= addr[5]; addr [7] <= addr[6]; end //changed to odin 2 ram specifications single_port_ram new_ram( .clk (clk), .we(we), .data(datain), .out(dataout), .addr(addr) ); endmodule module rgsramcontroller (want_addr, addr_ready, addrin, want_data, data_ready, datain, want_read, read_ready, dataout, dirReady, wantDir, sramdatal, addr, wantwriteback, writebackack, writebackdata, writebackaddr, fbdata, fbnextscanline, fbdatavalid, fbpage, shadedata, triID, wantshadedata, shadedataready, texeladdr, texel, wanttexel, texelready, tm3_sram_data_in, tm3_sram_data_out, tm3_sram_addr, tm3_sram_we, tm3_sram_oe, tm3_sram_adsp, globalreset, clk); output want_addr; reg want_addr; input addr_ready; input[17:0] addrin; output want_data; reg want_data; input data_ready; input[63:0] datain; input want_read; output read_ready; reg read_ready; output[63:0] dataout; wire[63:0] dataout; output dirReady; reg dirReady; input wantDir; output[47:0] sramdatal; reg[47:0] sramdatal; output[14:0] addr; wire[14:0] addr; input wantwriteback; output writebackack; reg writebackack; input[63:0] writebackdata; input[17:0] writebackaddr; output[63:0] fbdata; reg[63:0] fbdata; input fbnextscanline; output fbdatavalid; reg fbdatavalid; input fbpage; output[63:0] shadedata; wire[63:0] shadedata; input[15:0] triID; input wantshadedata; output shadedataready; reg shadedataready; input[17:0] texeladdr; output[63:0] texel; wire[63:0] texel; input wanttexel; output texelready; reg texelready; input[63:0] tm3_sram_data_in; wire[63:0] tm3_sram_data_in; output[63:0] tm3_sram_data_out; wire[63:0] tm3_sram_data_out; reg[63:0] tm3_sram_data_xhdl0; output[18:0] tm3_sram_addr; reg[18:0] tm3_sram_addr; output[7:0] tm3_sram_we; reg[7:0] tm3_sram_we; output[1:0] tm3_sram_oe; reg[1:0] tm3_sram_oe; output tm3_sram_adsp; reg tm3_sram_adsp; input globalreset; input clk; reg[3:0] state; reg[3:0] next_state; reg[17:0] waddress; reg[14:0] faddress; reg[6:0] fcount; reg fbdatavalidl; reg[17:0] temp_waddress; reg[14:0] temp_faddress; reg[6:0] temp_fcount; reg temp_fbdatavalidl; reg temp_texelready; reg temp_shadedataready; assign tm3_sram_data_out = tm3_sram_data_xhdl0; assign dataout = tm3_sram_data_in ; assign addr = tm3_sram_data_in[62:48] ; assign shadedata = tm3_sram_data_in ; assign texel = tm3_sram_data_in ; always @(posedge clk) begin if (globalreset == 1'b1) begin state <= 0 ; waddress <= 0; faddress <= 0; fcount <= 7'b1101011 ; fbdatavalid <= 1'b0 ; fbdatavalidl <= 1'b0 ; shadedataready <= 1'b0 ; texelready <= 1'b0 ; sramdatal <= 0; fbdata <= 0; end else begin state <= next_state ; sramdatal <= tm3_sram_data_in[47:0] ; fbdata <= tm3_sram_data_in ; fbdatavalid <= fbdatavalidl ; fbdatavalidl <= temp_fbdatavalidl; texelready <= temp_texelready; shadedataready <= temp_shadedataready; fcount <= temp_fcount; faddress <= temp_faddress; waddress <= temp_waddress; end end always @(state or addr_ready or data_ready or waddress or datain or wantDir or want_read or wantwriteback or writebackdata or writebackaddr or fcount or fbpage or faddress or fbnextscanline or triID or wantshadedata or wanttexel or texeladdr) begin case (state) 0 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; tm3_sram_addr = {1'b0, waddress} ; want_addr = 1'b1 ; want_data = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; if (addr_ready == 1'b1) begin next_state = 1 ; end else if (want_read == 1'b1) begin next_state = 2 ; end else if (data_ready == 1'b1) begin next_state = 3 ; end else if (wantDir == 1'b1) begin next_state = 5 ; end else if (wantwriteback == 1'b1) begin next_state = 6 ; end else if (wantshadedata == 1'b1) begin next_state = 9 ; end else if (wanttexel == 1'b1) begin next_state = 10 ; end else if (fcount != 0) begin next_state = 7 ; end else if (fbnextscanline == 1'b1) begin next_state = 8 ; end else begin next_state = 0 ; end temp_fbdatavalidl = 1'b0 ; temp_shadedataready = 1'b0 ; temp_texelready = 1'b0 ; if (addr_ready == 1'b1) begin temp_waddress = addrin ; end end 1 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; tm3_sram_addr = {1'b0, waddress} ; want_data = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; want_addr = 1'b0 ; if (addr_ready == 1'b0) begin next_state = 0 ; end else begin next_state = 1 ; end end 2 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; tm3_sram_addr = {1'b0, waddress} ; want_addr = 1'b1 ; want_data = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; read_ready = 1'b0 ; if (want_read == 1'b0) begin next_state = 0 ; end else begin next_state = 2 ; end temp_fbdatavalidl = 1'b0 ; temp_shadedataready = 1'b0 ; temp_texelready = 1'b0 ; if (want_read == 1'b0) begin temp_waddress = waddress + 1 ; end end 3 : begin tm3_sram_addr = {1'b0, waddress} ; want_addr = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; tm3_sram_data_xhdl0 = datain ; tm3_sram_we = 8'b00000000 ; tm3_sram_oe = 2'b11 ; tm3_sram_adsp = 1'b0 ; want_data = 1'b0 ; next_state = 4 ; temp_fbdatavalidl = 1'b0 ; temp_shadedataready = 1'b0 ; temp_texelready = 1'b0 ; temp_waddress = waddress + 1 ; end 4 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; tm3_sram_addr = {1'b0, waddress} ; want_addr = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; if (data_ready == 1'b0) begin next_state = 0 ; end else begin next_state = 4 ; end want_data = 1'b0 ; end 5 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; tm3_sram_addr = {1'b0, waddress} ; want_addr = 1'b1 ; want_data = 1'b1 ; read_ready = 1'b1 ; writebackack = 1'b0 ; dirReady = 1'b1 ; if (wantDir == 1'b0) begin next_state = 0 ; end else begin next_state = 5 ; end temp_fbdatavalidl = 1'b0 ; temp_shadedataready = 1'b0 ; temp_texelready = 1'b0 ; if (wantDir == 1'b0) begin temp_waddress = waddress + 1 ; end end 6 : begin want_addr = 1'b1 ; want_data = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; tm3_sram_data_xhdl0 = writebackdata ; tm3_sram_we = 8'b00000000 ; tm3_sram_oe = 2'b11 ; tm3_sram_adsp = 1'b0 ; tm3_sram_addr = {1'b0, writebackaddr} ; writebackack = 1'b1 ; next_state = 0 ; end 7 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; want_addr = 1'b1 ; want_data = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; tm3_sram_addr = {3'b011, fbpage, faddress} ; if ((fcount == 1) | (addr_ready == 1'b1) | (want_read == 1'b1) | (data_ready == 1'b1) | (wantDir == 1'b1) | (wantwriteback == 1'b1)) begin next_state = 0 ; end else begin next_state = 7 ; end temp_shadedataready = 1'b0 ; temp_texelready = 1'b0 ; temp_fbdatavalidl = 1'b1 ; if (fcount != 0) begin temp_faddress = faddress + 1 ; temp_fcount = fcount - 1 ; end end 8 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; tm3_sram_addr = {1'b0, waddress} ; want_addr = 1'b1 ; want_data = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; next_state = 7 ; temp_fbdatavalidl = 1'b0 ; temp_shadedataready = 1'b0 ; temp_texelready = 1'b0 ; temp_fcount = 7'b1101011 ; if (faddress == 25680) begin temp_faddress = 0; end end 9 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; want_addr = 1'b1 ; want_data = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; tm3_sram_addr = {3'b010, triID} ; next_state = 0 ; temp_fbdatavalidl = 1'b0 ; temp_texelready = 1'b0 ; temp_shadedataready = 1'b1 ; end 10 : begin tm3_sram_we = 8'b11111111 ; tm3_sram_oe = 2'b01 ; tm3_sram_adsp = 1'b0 ; tm3_sram_data_xhdl0 = 0; want_addr = 1'b1 ; want_data = 1'b1 ; read_ready = 1'b1 ; dirReady = 1'b0 ; writebackack = 1'b0 ; tm3_sram_addr = {1'b0, texeladdr} ; next_state = 0 ; temp_fbdatavalidl = 1'b0 ; temp_shadedataready = 1'b0 ; temp_texelready = 1'b1 ; end endcase end endmodule module raysend (as, ack, addr, dir, origx, origy, origz, rgData, rgAddr, rgWE, rgAddrValid, rgDone, globalreset, clk, statepeek); input as; output ack; reg ack; input[3:0] addr; input[47:0] dir; input[27:0] origx; input[27:0] origy; input[27:0] origz; output[31:0] rgData; reg[31:0] rgData; output[3:0] rgAddr; reg[3:0] rgAddr; output[2:0] rgWE; reg[2:0] rgWE; output rgAddrValid; reg rgAddrValid; input rgDone; input globalreset; input clk; output[2:0] statepeek; reg[2:0] statepeek; reg[3:0] state; reg[3:0] next_state; reg[31:0] temp_rgData; reg[2:0] temp_rgWE; reg temp_rgAddrValid; reg temp_ack; reg[3:0] temp_rgAddr; always @(posedge clk) begin if (globalreset == 1'b1) begin state <= 0 ; ack <= 1'b0 ; rgWE <= 3'b000 ; rgData <= 0; rgAddrValid <= 1'b0 ; rgAddr <= 0; end else begin state <= next_state ; rgData <= temp_rgData; rgWE <= temp_rgWE; rgAddrValid <= temp_rgAddrValid; ack <= temp_ack; rgAddr <= temp_rgAddr; end end always @(state or ack or as or rgDone) begin case (state) 0 : begin if ((as == 1'b1) & (ack == 1'b0)) begin next_state = 1 ; end else begin next_state = 0 ; end statepeek = 3'b001 ; if ((as == 1'b1) & (ack == 1'b0)) begin temp_rgData = {4'b0000, origx} ; temp_rgWE = 3'b001 ; temp_rgAddrValid = 1'b1 ; temp_rgAddr = addr ; end if (as == 1'b0 & ack == 1'b1) begin temp_ack = 1'b0 ; end end 1 : begin if (rgDone == 1'b1) begin next_state = 6 ; end else begin next_state = 1 ; end statepeek = 3'b010 ; if (rgDone == 1'b1) begin temp_rgAddrValid = 1'b0 ; end end 2 : begin if (rgDone == 1'b1) begin next_state = 7 ; end else begin next_state = 2 ; end statepeek = 3'b011 ; if (rgDone == 1'b1) begin temp_rgAddrValid = 1'b0 ; end end 3 : begin if (rgDone == 1'b1) begin next_state = 8 ; end else begin next_state = 3 ; end statepeek = 3'b100 ; if (rgDone == 1'b1) begin temp_rgAddrValid = 1'b0 ; end end 4 : begin if (rgDone == 1'b1) begin next_state = 9 ; end else begin next_state = 4 ; end statepeek = 3'b101 ; if (rgDone == 1'b1) begin temp_rgAddrValid = 1'b0 ; end end 5 : begin if (rgDone == 1'b1) begin next_state = 0 ; end else begin next_state = 5 ; end statepeek = 3'b110 ; temp_ack = 1'b1 ; if (rgDone == 1'b1) begin temp_rgAddrValid = 1'b0 ; end end 6 : begin next_state = 2 ; temp_rgData = {4'b0000, origy} ; temp_rgWE = 3'b010 ; temp_rgAddrValid = 1'b1 ; end 7 : begin next_state = 3 ; temp_rgData = {4'b0000, origz} ; temp_rgWE = 3'b011 ; temp_rgAddrValid = 1'b1 ; end 8 : begin next_state = 4 ; temp_rgData = {dir[31:16], dir[47:32]} ; temp_rgWE = 3'b100 ; temp_rgAddrValid = 1'b1 ; end 9 : begin next_state = 5 ; temp_rgData = {16'b0000000000000000, dir[15:0]} ; temp_rgWE = 3'b101 ; temp_rgAddrValid = 1'b1 ; end endcase end endmodule module raygencont (go, initcount, busyout, cycles, nextaddr, nas0, nas1, page, dirReady, wantDir, dirIn, addrIn, as, addr, ack, dir, raygroup0, raygroupvalid0, busy0, raygroup1, raygroupvalid1, busy1, globalreset, clk, statepeek); input go; input[14:0] initcount; output busyout; wire busyout; reg temp_busyout; output[30:0] cycles; reg[30:0] cycles; output[17:0] nextaddr; wire[17:0] nextaddr; output nas0; wire nas0; reg temp_nas0; output nas1; wire nas1; reg temp_nas1; input page; input dirReady; output wantDir; reg wantDir; input[47:0] dirIn; input[14:0] addrIn; output as; reg as; output[3:0] addr; reg[3:0] addr; input ack; output[47:0] dir; reg[47:0] dir; output[1:0] raygroup0; wire[1:0] raygroup0; output raygroupvalid0; reg raygroupvalid0; input busy0; output[1:0] raygroup1; wire[1:0] raygroup1; output raygroupvalid1; reg raygroupvalid1; input busy1; input globalreset; input clk; output[2:0] statepeek; reg[2:0] statepeek; reg[2:0] state; reg[2:0] next_state; reg[14:0] count; reg first; reg[17:0] destaddr; wire[1:0] busy; reg[1:0] loaded; reg[1:0] groupID; reg active; reg[47:0] temp_dir; reg[30:0] temp_cycles; reg[1:0] temp_addr; reg[1:0] temp_loaded; reg[1:0] temp_groupID; reg[14:0] temp_count; reg temp_active; reg temp_raygroupvalid1; reg temp_raygroupvalid0; assign busy = {busy1, busy0} ; always @(posedge clk) begin if (globalreset == 1'b1) begin state <= 0 ; cycles <= 0; dir <= 0; addr[1:0] <= 2'b00 ; groupID <= 2'b00 ; count <= 0; first <= 1'b0 ; destaddr <= 0; raygroupvalid0 <= 1'b0 ; raygroupvalid1 <= 1'b0 ; loaded <= 2'b00 ; active <= 1'b0 ; end else begin addr[3:2] <= (active == 1'b0) ? {1'b0, groupID[0]} : {1'b1, groupID[1]} ; addr[1:0] <= temp_addr[1:0]; state <= next_state ; dir <= temp_dir; cycles <= temp_cycles; loaded <= temp_loaded; groupID <= temp_groupID; count <= temp_count; active <= temp_active; raygroupvalid0 <= temp_raygroupvalid0; raygroupvalid1 <= temp_raygroupvalid1; end end assign raygroup0 = {1'b0, groupID[0]} ; assign raygroup1 = {1'b1, groupID[1]} ; assign nextaddr = {2'b11, page, addrIn} ; assign busyout = temp_busyout; assign nas0 = temp_nas0; assign nas1 = temp_nas1; always @(state or go or ack or busy or dirReady or addr or count or loaded) begin case (state) 0 : begin as = 1'b0 ; wantDir = 1'b0 ; if (go == 1'b1) begin next_state = 1 ; end else begin next_state = 0 ; end statepeek = 3'b001 ; temp_busyout = 1'b0; temp_nas0 = 1'b0; temp_nas1 = 1'b0; if (go == 1'b1) begin temp_cycles = 0; end temp_addr[1:0] = 2'b00 ; temp_loaded = 2'b00 ; temp_groupID = 2'b00 ; temp_count = initcount ; temp_active = 1'b0 ; end 1 : begin as = dirReady ; wantDir = 1'b1 ; if (dirReady == 1'b1) begin next_state = 2 ; end else begin next_state = 1 ; end statepeek = 3'b010 ; temp_busyout = 1'b1; if (addr[1:0] == 2'b00 & dirReady == 1'b1 & active == 1'b0) begin temp_nas0 = 1'b1; temp_nas1 = 1'b1; end temp_dir = dirIn ; if (dirReady == 1'b1 & addr[1:0] == 2'b10) begin if (active == 1'b0) begin temp_loaded[0] = 1'b1 ; end else begin temp_loaded[1] = 1'b1 ; end end temp_cycles = cycles + 1 ; end 2 : begin wantDir = 1'b0 ; as = 1'b1 ; if ((ack == 1'b1) & (addr[1:0] != 2'b10)) begin next_state = 1 ; end else if (ack == 1'b1) begin if ((loaded[0]) == 1'b1 & (busy[0]) == 1'b0) begin next_state = 3 ; end else if ((loaded[1]) == 1'b1 & (busy[1]) == 1'b0) begin next_state = 4 ; end else if (loaded != 2'b11) begin next_state = 1 ; end else begin next_state = 2 ; end end else begin next_state = 2 ; end statepeek = 3'b011 ; temp_busyout = 1'b1; temp_nas0 = 1'b0; temp_nas1 = 1'b0; if ((ack == 1'b1) & (addr[1:0] != 2'b10)) begin temp_addr[1:0] = addr[1:0] + 2'b01 ; end else if ((ack == 1'b1) & addr[1:0] == 2'b10) begin if ((loaded[0]) == 1'b1 & (busy[0]) == 1'b0) begin temp_raygroupvalid0 = 1'b1 ; end else if ((loaded[1]) == 1'b1 & (busy[1]) == 1'b0) begin temp_raygroupvalid1 = 1'b1 ; end else if ((loaded[0]) == 1'b0) begin temp_active = 1'b0 ; temp_addr[1:0] = 2'b00 ; end else if ((loaded[1]) == 1'b0) begin temp_active = 1'b1 ; temp_addr[1:0] = 2'b00 ; end end temp_cycles = cycles + 1 ; end 4 : begin if ((busy[1]) == 1'b0) begin next_state = 4 ; end else if ((loaded[0]) == 1'b1 & (busy[0]) == 1'b0) begin next_state = 3 ; end else if (count > 0) begin next_state = 1 ; end else begin next_state = 0 ; end statepeek = 3'b101 ; temp_busyout = 1'b1; temp_nas0 = 1'b0; temp_nas1 = 1'b0; if ((busy[1]) == 1'b1) begin temp_groupID[1] = ~groupID[1] ; temp_raygroupvalid1 = 1'b0 ; temp_count = count - 1 ; if ((loaded[0]) == 1'b1 & (busy[0]) == 1'b0) begin temp_raygroupvalid0 = 1'b1 ; end else if ((loaded[0]) == 1'b0) begin temp_active = 1'b0 ; end else begin temp_active = 1'b1 ; end end temp_loaded[1] = 1'b0 ; temp_addr[1:0] = 2'b00 ; temp_cycles = cycles + 1 ; end 3 : begin if ((busy[0]) == 1'b0) begin next_state = 3 ; end else if ((loaded[1]) == 1'b1 & (busy[1]) == 1'b0) begin next_state = 4 ; end else if (count > 0) begin next_state = 1 ; end else begin next_state = 0 ; end statepeek = 3'b100 ; temp_busyout = 1'b1; temp_nas0 = 1'b0; temp_nas1 = 1'b0; if ((busy[0]) == 1'b1) begin temp_groupID[0] = ~groupID[0] ; temp_raygroupvalid0 = 1'b0 ; temp_count = count - 1 ; if ((loaded[1]) == 1'b1 & (busy[1]) == 1'b0) begin temp_raygroupvalid1 = 1'b1 ; end else if ((loaded[1]) == 1'b0) begin temp_active = 1'b1 ; end else begin temp_active = 1'b0 ; end end temp_loaded[0] = 1'b0 ; temp_addr[1:0] = 2'b00 ; temp_cycles = cycles + 1 ; end endcase end endmodule module resultrecieve (valid01, valid10, id01a, id01b, id01c, id10a, id10b, id10c, hit01a, hit01b, hit01c, hit10a, hit10b, hit10c, u01a, u01b, u01c, v01a, v01b, v01c, u10a, u10b, u10c, v10a, v10b, v10c, rgResultData, rgResultReady, rgResultSource, globalreset, clk); output valid01; reg valid01; output valid10; reg valid10; output[15:0] id01a; reg[15:0] id01a; output[15:0] id01b; reg[15:0] id01b; output[15:0] id01c; reg[15:0] id01c; output[15:0] id10a; reg[15:0] id10a; output[15:0] id10b; reg[15:0] id10b; output[15:0] id10c; reg[15:0] id10c; output hit01a; reg hit01a; output hit01b; reg hit01b; output hit01c; reg hit01c; output hit10a; reg hit10a; output hit10b; reg hit10b; output hit10c; reg hit10c; output[7:0] u01a; reg[7:0] u01a; output[7:0] u01b; reg[7:0] u01b; output[7:0] u01c; reg[7:0] u01c; output[7:0] v01a; reg[7:0] v01a; output[7:0] v01b; reg[7:0] v01b; output[7:0] v01c; reg[7:0] v01c; output[7:0] u10a; reg[7:0] u10a; output[7:0] u10b; reg[7:0] u10b; output[7:0] u10c; reg[7:0] u10c; output[7:0] v10a; reg[7:0] v10a; output[7:0] v10b; reg[7:0] v10b; output[7:0] v10c; reg[7:0] v10c; input[31:0] rgResultData; input rgResultReady; input[1:0] rgResultSource; input globalreset; input clk; reg temp_valid01; reg temp_valid10; reg[15:0] temp_id01a; reg[15:0] temp_id01b; reg[15:0] temp_id01c; reg[15:0] temp_id10a; reg[15:0] temp_id10b; reg[15:0] temp_id10c; reg temp_hit01a; reg temp_hit01b; reg temp_hit01c; reg temp_hit10a; reg temp_hit10b; reg temp_hit10c; reg[7:0] temp_u01a; reg[7:0] temp_u01b; reg[7:0] temp_u01c; reg[7:0] temp_v01a; reg[7:0] temp_v01b; reg[7:0] temp_v01c; reg[7:0] temp_u10a; reg[7:0] temp_u10b; reg[7:0] temp_u10c; reg[7:0] temp_v10a; reg[7:0] temp_v10b; reg[7:0] temp_v10c; reg[2:0] state; reg[2:0] next_state; always @(posedge clk) begin if (globalreset == 1'b1) begin state <= 0 ; valid01 <= 1'b0 ; valid10 <= 1'b0 ; hit01a <= 1'b0 ; hit01b <= 1'b0 ; hit01c <= 1'b0 ; hit10a <= 1'b0 ; hit10b <= 1'b0 ; hit10c <= 1'b0 ; id01a <= 0; id01b <= 0; id01c <= 0; id10a <= 0; id10b <= 0; id10c <= 0; u01a <= 0; u01b <= 0; u01c <= 0; v01a <= 0; v01b <= 0; v01c <= 0; u10a <= 0; u10b <= 0; u10c <= 0; v10a <= 0; v10b <= 0; v10c <= 0; end else begin state <= next_state ; valid01 <= temp_valid01; valid10 <= temp_valid10; id01a <= temp_id01a; id01b <= temp_id01b; id01c <= temp_id01c; hit01a <= temp_hit01a; hit01b <= temp_hit01b; hit01c <= temp_hit01c; u01a <= temp_u01a; u01b <= temp_u01b; u01c <= temp_u01c; u10a <= temp_u10a; u10b <= temp_u10b; u10c <= temp_u10c; v01a <= temp_v01a; v01b <= temp_v01b; v01c <= temp_v01c; v10a <= temp_v10a; v10b <= temp_v10b; v10c <= temp_v10c; hit10a <= temp_hit10a; hit10b <= temp_hit10b; hit10c <= temp_hit10c; end end always @(state or rgResultReady or rgResultSource) begin case (state) 0 : begin if (rgResultReady == 1'b1 & rgResultSource == 2'b01) begin next_state = 1 ; end else if (rgResultReady == 1'b1 & rgResultSource == 2'b10) begin next_state = 4 ; end else begin next_state = 0 ; end temp_valid01 = 1'b0 ; temp_valid10 = 1'b0 ; if (rgResultReady == 1'b1 & rgResultSource == 2'b01) begin temp_id01a = rgResultData[31:16] ; temp_id01b = rgResultData[15:0] ; end else if (rgResultReady == 1'b1 & rgResultSource == 2'b10) begin temp_id10a = rgResultData[31:16] ; temp_id10b = rgResultData[15:0] ; end end 1 : begin next_state = 2 ; temp_valid01 = 1'b0 ; temp_valid10 = 1'b0 ; temp_id01c = rgResultData[15:0] ; temp_hit01a = rgResultData[18] ; temp_hit01b = rgResultData[17] ; temp_hit01c = rgResultData[16] ; end 2 : begin next_state = 3 ; temp_valid01 = 1'b0 ; temp_valid10 = 1'b0 ; temp_u01a = rgResultData[23:16] ; temp_u01b = rgResultData[15:8] ; temp_u01c = rgResultData[7:0] ; end 3 : begin next_state = 0 ; temp_valid10 = 1'b0 ; temp_v01a = rgResultData[23:16] ; temp_v01b = rgResultData[15:8] ; temp_v01c = rgResultData[7:0] ; temp_valid01 = 1'b1 ; end 4 : begin next_state = 5 ; temp_valid01 = 1'b0 ; temp_valid10 = 1'b0 ; temp_id10c = rgResultData[15:0] ; temp_hit10a = rgResultData[18] ; temp_hit10b = rgResultData[17] ; temp_hit10c = rgResultData[16] ; end 5 : begin next_state = 6 ; temp_valid01 = 1'b0 ; temp_valid10 = 1'b0 ; temp_u10a = rgResultData[23:16] ; temp_u10b = rgResultData[15:8] ; temp_u10c = rgResultData[7:0] ; end 6 : begin next_state = 0 ; temp_valid01 = 1'b0 ; temp_v10a = rgResultData[23:16] ; temp_v10b = rgResultData[15:8] ; temp_v10c = rgResultData[7:0] ; temp_valid10 = 1'b1 ; end endcase end endmodule module resultwriter (valid01, valid10, id01a, id01b, id01c, id10a, id10b, id10c, hit01a, hit01b, hit01c, hit10a, hit10b, hit10c, u01a, u01b, u01c, v01a, v01b, v01c, u10a, u10b, u10c, v10a, v10b, v10c, addr, as01, as10, bkcolour, shadedata, triID, wantshadedata, shadedataready, texinfo, texaddr, texeladdr, texel, wanttexel, texelready, dataout, addrout, write, ack, globalreset, clk); input valid01; input valid10; input[15:0] id01a; input[15:0] id01b; input[15:0] id01c; input[15:0] id10a; input[15:0] id10b; input[15:0] id10c; input hit01a; input hit01b; input hit01c; input hit10a; input hit10b; input hit10c; input[7:0] u01a; input[7:0] u01b; input[7:0] u01c; input[7:0] v01a; input[7:0] v01b; input[7:0] v01c; input[7:0] u10a; input[7:0] u10b; input[7:0] u10c; input[7:0] v10a; input[7:0] v10b; input[7:0] v10c; input[17:0] addr; input as01; input as10; input[20:0] bkcolour; input[63:0] shadedata; output[15:0] triID; reg[15:0] triID; output wantshadedata; reg wantshadedata; input shadedataready; input[20:0] texinfo; output[3:0] texaddr; wire[3:0] texaddr; output[17:0] texeladdr; wire[17:0] texeladdr; input[63:0] texel; output wanttexel; reg wanttexel; input texelready; output[63:0] dataout; // PAJ see lower note wire[63:0] dataout; reg[63:0] dataout; output[17:0] addrout; wire[17:0] addrout; output write; wire write; reg temp_write; input ack; input globalreset; input clk; reg[3:0] state; reg[3:0] next_state; reg pending01; reg pending10; reg process01; wire[17:0] addrout01; wire[17:0] addrout10; wire shiften01; wire shiften10; reg temp_shiften01; reg temp_shiften10; reg[20:0] shadedataa; reg[20:0] shadedatab; reg[20:0] shadedatac; wire hita; wire hitb; wire hitc; reg[2:0] selectuv; wire[6:0] blr; wire[6:0] blg; wire[6:0] blb; reg texmap; reg lmenable; wire[1:0] texelselect; wire[6:0] texelr; wire[6:0] texelg; wire[6:0] texelb; reg[20:0] texinfol; reg temp_pending01; reg temp_pending10; reg temp_process01; reg temp_texmap; reg[20:0] temp_texinfol; reg[20:0] temp_shadedataa; reg[20:0] temp_shadedatab; reg[20:0] temp_shadedatac; col16to21 col16to21inst (texel, texelselect, texelr, texelg, texelb); linearmap linearmapinst (blb, blg, texinfol[17:0], texeladdr, texelselect, texinfol[20:18], lmenable, clk); bilinearintrp bilinearimp (u01a, u01b, u01c, v01a, v01b, v01c, u10a, u10b, u10c, v10a, v10b, v10c, selectuv, shadedata[41:35], shadedata[62:56], shadedata[20:14], shadedata[34:28], shadedata[55:49], shadedata[13:7], shadedata[27:21], shadedata[48:42], shadedata[6:0], blr, blg, blb, clk); fifo3 fifo3insta (addr, as01, addrout01, shiften01, globalreset, clk); fifo3 fifo3instb (addr, as10, addrout10, shiften10, globalreset, clk); assign hita = (hit01a & process01) | (hit10a & ~process01) ; assign hitb = (hit01b & process01) | (hit10b & ~process01) ; assign hitc = (hit01c & process01) | (hit10c & ~process01) ; assign texaddr = shadedata[59:56] ; assign shiften01 = temp_shiften01; assign shiften10 = temp_shiften10; assign write = temp_write; always @(posedge clk) begin if (globalreset == 1'b1) begin state <= 0 ; pending01 <= 1'b0 ; pending10 <= 1'b0 ; shadedataa <= 0; shadedatab <= 0; shadedatac <= 0; process01 <= 1'b0 ; texmap <= 1'b0 ; texinfol <= 0; end else begin state <= next_state ; process01 <= temp_process01; pending01 <= temp_pending01; pending10 <= temp_pending10; texmap <= temp_texmap; texinfol <= temp_texinfol; shadedataa <= temp_shadedataa; shadedatab <= temp_shadedatab; shadedatac <= temp_shadedatac; dataout <= {1'b0, shadedataa[20], shadedataa[19], shadedataa[18], shadedataa[17], shadedataa[16], shadedataa[15], shadedataa[14], shadedataa[13], shadedataa[12], shadedataa[11], shadedataa[10], shadedataa[9], shadedataa[8], shadedataa[7], shadedataa[6], shadedataa[5], shadedataa[4], shadedataa[3], shadedataa[2], shadedataa[1], shadedataa[0], shadedatab[20], shadedatab[19], shadedatab[18], shadedatab[17], shadedatab[16], shadedatab[15], shadedatab[14], shadedatab[13], shadedatab[12], shadedatab[11], shadedatab[10], shadedatab[9], shadedatab[8], shadedatab[7], shadedatab[6], shadedatab[5], shadedatab[4], shadedatab[3], shadedatab[2], shadedatab[1], shadedatab[0], shadedatac[20], shadedatac[19], shadedatac[18], shadedatac[17], shadedatac[16], shadedatac[15], shadedatac[14], shadedatac[13], shadedatac[12], shadedatac[11], shadedatac[10], shadedatac[9], shadedatac[8], shadedatac[7], shadedatac[6], shadedatac[5], shadedatac[4], shadedatac[3], shadedatac[2], shadedatac[1], shadedatac[0]} ; end // end // PAJ used to be assign, but weird error, so added as register assign dataout = {1'b0, end assign addrout = (process01 == 1'b1) ? addrout01 : addrout10 ; always @(state or process01 or pending10 or ack or shadedataready or id01a or id01b or id01c or id10a or id10b or id10c or selectuv or hita or hitb or hitc or shadedata or pending01 or texmap or texelready) begin case (state) 0 : begin wantshadedata = 1'b0 ; triID = 0; selectuv = 0; lmenable = 1'b0 ; wanttexel = 1'b0 ; if (pending01 == 1'b1 | pending10 == 1'b1) begin next_state = 2 ; end else begin next_state = 0 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_process01 = pending01 ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 2 : begin lmenable = 1'b0 ; wanttexel = 1'b0 ; wantshadedata = 1'b1 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b00 ; if (process01 == 1'b1) begin triID = id01a ; end else begin triID = id10a ; end if (shadedataready == 1'b1) begin if (hita == 1'b1 & ((shadedata[63]) == 1'b1 | shadedata[63:62] == 2'b01)) begin next_state = 3 ; end else begin next_state = 4 ; end end else begin next_state = 2 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end if (hita == 1'b1) begin temp_shadedataa = shadedata[20:0] ; temp_texmap = (~shadedata[63]) & shadedata[62] ; end else begin temp_shadedataa = bkcolour ; end temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 3 : begin wantshadedata = 1'b0 ; triID = 0; lmenable = 1'b0 ; wanttexel = 1'b0 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b00 ; next_state = 8 ; if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_texinfol = texinfo ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 8 : begin wantshadedata = 1'b0 ; triID = 0; wanttexel = 1'b0 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b00 ; lmenable = 1'b1 ; if (texmap == 1'b1) begin next_state = 11 ; end else begin next_state = 4 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_shadedataa[6:0] = blb ; temp_shadedataa[13:7] = blg ; temp_shadedataa[20:14] = blr ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 11 : begin wantshadedata = 1'b0 ; triID = 0; selectuv = 0; lmenable = 1'b0 ; wanttexel = 1'b1 ; if (texelready == 1'b1) begin next_state = 4 ; end else begin next_state = 11 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_shadedataa[6:0] = texelb ; temp_shadedataa[13:7] = texelg ; temp_shadedataa[20:14] = texelr ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 12 : begin wantshadedata = 1'b0 ; triID = 0; selectuv = 0; lmenable = 1'b0 ; wanttexel = 1'b1 ; if (texelready == 1'b1) begin next_state = 5 ; end else begin next_state = 12 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_shadedatab[6:0] = texelb ; temp_shadedatab[13:7] = texelg ; temp_shadedatab[20:14] = texelr ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 13 : begin wantshadedata = 1'b0 ; triID = 0; selectuv = 0; lmenable = 1'b0 ; wanttexel = 1'b1 ; if (texelready == 1'b1) begin next_state = 1 ; end else begin next_state = 13 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_shadedatac[6:0] = texelb ; temp_shadedatac[13:7] = texelg ; temp_shadedatac[20:14] = texelr ; end 6 : begin wantshadedata = 1'b0 ; triID = 0; lmenable = 1'b0 ; wanttexel = 1'b0 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b01 ; next_state = 9 ; if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_texinfol = texinfo ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 9 : begin wantshadedata = 1'b0 ; triID = 0; wanttexel = 1'b0 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b01 ; lmenable = 1'b1 ; if (texmap == 1'b1) begin next_state = 12 ; end else begin next_state = 5 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_shadedatab[6:0] = blb ; temp_shadedatab[13:7] = blg ; temp_shadedatab[20:14] = blr ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 7 : begin wantshadedata = 1'b0 ; triID = 0; lmenable = 1'b0 ; wanttexel = 1'b0 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b10 ; next_state = 10 ; if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_texinfol = texinfo ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 10 : begin wantshadedata = 1'b0 ; triID = 0; wanttexel = 1'b0 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b10 ; if (texmap == 1'b1) begin next_state = 13 ; end else begin next_state = 1 ; end lmenable = 1'b1 ; if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end temp_shadedatac[6:0] = blb ; temp_shadedatac[13:7] = blg ; temp_shadedatac[20:14] = blr ; temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 4 : begin wantshadedata = 1'b0 ; lmenable = 1'b0 ; wanttexel = 1'b0 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b01 ; if (process01 == 1'b1) begin triID = id01b ; end else begin triID = id10b ; end if (shadedataready == 1'b1) begin if (hitb == 1'b1 & ((shadedata[63]) == 1'b1 | shadedata[63:62] == 2'b01)) begin next_state = 6 ; end else begin next_state = 5 ; end end else begin next_state = 4 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end if (hitb == 1'b1) begin temp_shadedatab = shadedata[20:0] ; temp_texmap = (~shadedata[63]) & shadedata[62] ; end else begin temp_shadedatab = bkcolour ; end temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 5 : begin lmenable = 1'b0 ; wanttexel = 1'b0 ; wantshadedata = 1'b1 ; selectuv[2] = ~process01 ; selectuv[1:0] = 2'b10 ; if (process01 == 1'b1) begin triID = id01c ; end else begin triID = id10c ; end if (shadedataready == 1'b1) begin if (hitc == 1'b1 & ((shadedata[63]) == 1'b1 | shadedata[63:62] == 2'b01)) begin next_state = 7 ; end else begin next_state = 1 ; end end else begin next_state = 5 ; end if (valid01 == 1'b1) begin temp_pending01 = 1'b1 ; end if (valid10 == 1'b1) begin temp_pending10 = 1'b1 ; end if (hitc == 1'b1) begin temp_shadedatac = shadedata[20:0] ; temp_texmap = (~shadedata[63]) & shadedata[62] ; end else begin temp_shadedatac = bkcolour ; end temp_shiften01 = 1'b0; temp_shiften10 = 1'b0; temp_write = 1'b0; end 1 : begin wantshadedata = 1'b0 ; triID = 0; selectuv = 0; lmenable = 1'b0 ; wanttexel = 1'b0 ; if (ack == 1'b1) begin next_state = 0 ; end else begin next_state = 1 ; end if (ack == 1'b1 & process01 == 1'b1) begin temp_pending01 = 1'b0 ; end else if (ack == 1'b1 & process01 == 1'b0) begin temp_pending10 = 1'b0 ; end if (process01 == 1'b1 & ack == 1'b1) begin temp_shiften01 = 1'b1; temp_shiften10 = 1'b1; end temp_write = 1'b1; end endcase end endmodule ////////////////////////////////////////////////////////////////////////////////////////////// // // Verilog file generated by X-HDL - Revision 3.2.38 Jan. 9, 2004 // Sun Feb 8 14:14:35 2004 // // Input file : G:/jamieson/VERILOG_BENCHMARKS/RAYTRACE/col16to21.vhd // Design name : col16to21 // Author : // Company : // // Description : // // ////////////////////////////////////////////////////////////////////////////////////////////// // module col16to21 (dataline, texelselect, r, g, b); input[63:0] dataline; input[1:0] texelselect; output[6:0] r; wire[6:0] r; output[6:0] g; wire[6:0] g; output[6:0] b; wire[6:0] b; reg[15:0] col16; always @(dataline or texelselect) begin case (texelselect) 2'b00 : begin col16 = dataline[15:0] ; end 2'b01 : begin col16 = dataline[31:16] ; end 2'b10 : begin col16 = dataline[47:32] ; end 2'b11 : begin col16 = dataline[63:48] ; end endcase end assign r = {col16[15:10], 1'b0} ; assign g = {col16[9:5], 2'b00} ; assign b = {col16[4:0], 2'b00} ; endmodule module linearmap (u, v, start, addr, texelselect, factor, enable, clk); input[6:0] u; input[6:0] v; input[17:0] start; output[17:0] addr; reg[17:0] addr; output[1:0] texelselect; wire[1:0] texelselect; input[2:0] factor; input enable; input clk; reg[6:0] ul; reg[6:0] vl; assign texelselect = ul[1:0] ; always @(posedge clk) begin if (enable == 1'b1) begin ul <= u ; vl <= v ; end else begin ul <= ul ; vl <= vl ; end case (factor) 3'b000 : begin addr <= start + ({13'b0000000000000, ul[6:2]}) + ({11'b00000000000, vl}) ; end 3'b001 : begin addr <= start + ({13'b0000000000000, ul[6:2]}) + ({10'b0000000000, vl, 1'b0}) ; end 3'b010 : begin addr <= start + ({13'b0000000000000, ul[6:2]}) + ({9'b000000000, vl, 2'b00}) ; end 3'b011 : begin addr <= start + ({13'b0000000000000, ul[6:2]}) + ({8'b00000000, vl, 3'b000}) ; end 3'b100 : begin addr <= start + ({13'b0000000000000, ul[6:2]}) + ({7'b0000000, vl, 4'b0000}) ; end 3'b101 : begin addr <= start + ({13'b0000000000000, ul[6:2]}) + ({6'b000000, vl, 5'b00000}) ; end 3'b110 : begin addr <= start + ({13'b0000000000000, ul[6:2]}) + ({5'b00000, vl, 6'b000000}) ; end 3'b111 : begin addr <= start + ({13'b0000000000000, ul[6:2]}) + ({4'b0000, vl, 7'b0000000}) ; end endcase end endmodule module bilinearintrp (u01a, u01b, u01c, v01a, v01b, v01c, u10a, u10b, u10c, v10a, v10b, v10c, selectuv, ru, rv, rw, gu, gv, gw, bu, bv, bw, r, g, b, clk); input[7:0] u01a; input[7:0] u01b; input[7:0] u01c; input[7:0] v01a; input[7:0] v01b; input[7:0] v01c; input[7:0] u10a; input[7:0] u10b; input[7:0] u10c; input[7:0] v10a; input[7:0] v10b; input[7:0] v10c; input[2:0] selectuv; input[6:0] ru; input[6:0] rv; input[6:0] rw; input[6:0] gu; input[6:0] gv; input[6:0] gw; input[6:0] bu; input[6:0] bv; input[6:0] bw; output[6:0] r; wire[6:0] r; output[6:0] g; wire[6:0] g; output[6:0] b; wire[6:0] b; input clk; reg[7:0] u; reg[7:0] v; reg[7:0] ul; reg[7:0] vl; reg[7:0] wl; reg[14:0] i1b; reg[14:0] i2b; reg[14:0] i3b; reg[14:0] i1g; reg[14:0] i2g; reg[14:0] i3g; reg[14:0] i1r; reg[14:0] i2r; reg[14:0] i3r; reg[6:0] rul; reg[6:0] rvl; reg[6:0] rwl; reg[6:0] gul; reg[6:0] gvl; reg[6:0] gwl; reg[6:0] bul; reg[6:0] bvl; reg[6:0] bwl; always @(selectuv or u01a or u01b or u01c or v01a or v01b or v01c or u10a or u10b or u10c or v10a or v10b or v10c) begin case (selectuv) 3'b000 : begin u = u01a ; v = v01a ; end 3'b001 : begin u = u01b ; v = v01b ; end 3'b010 : begin u = u01c ; v = v01c ; end 3'b100 : begin u = u10a ; v = v10a ; end 3'b101 : begin u = u10b ; v = v10b ; end 3'b110 : begin u = u10c ; v = v10c ; end default : begin u = 0; v = 0; end endcase end always @(posedge clk) begin wl <= 8'b11111111 - u - v ; ul <= u ; vl <= v ; rul <= ru ; rvl <= rv ; rwl <= rw ; gul <= gu ; gvl <= gv ; gwl <= gw ; bul <= bu ; bvl <= bv ; bwl <= bw ; i1r <= ul * rul ; i2r <= vl * rvl ; i3r <= wl * rwl ; i1g <= ul * gul ; i2g <= vl * gvl ; i3g <= wl * gwl ; i1b <= ul * bul ; i2b <= vl * bvl ; i3b <= wl * bwl ; end assign r = (i1r + i2r + i3r) ; assign g = (i1g + i2g + i3g) ; assign b = (i1b + i2b + i3b) ; endmodule module fifo3 (datain, writeen, dataout, shiften, globalreset, clk); input[18 - 1:0] datain; input writeen; output[18 - 1:0] dataout; wire[18 - 1:0] dataout; input shiften; input globalreset; input clk; reg[18 - 1:0] data0; reg[18 - 1:0] data1; reg[18 - 1:0] data2; reg[1:0] pos; assign dataout = data0 ; always @(posedge clk) begin if (globalreset == 1'b1) begin pos <= 2'b00 ; data0 <= 0 ; data1 <= 0 ; data2 <= 0 ; end else begin if (writeen == 1'b1 & shiften == 1'b1) begin case (pos) 2'b00 : begin data0 <= 0 ; data1 <= 0 ; data2 <= 0 ; end 2'b01 : begin data0 <= datain ; data1 <= 0 ; data2 <= 0 ; end 2'b10 : begin data0 <= data1 ; data1 <= datain ; data2 <= 0 ; end 2'b11 : begin data0 <= data1 ; data1 <= data2 ; data2 <= datain ; end endcase end else if (shiften == 1'b1) begin data0 <= data1 ; data1 <= data2 ; pos <= pos - 1 ; end else if (writeen == 1'b1) begin case (pos) 2'b00 : begin data0 <= datain ; end 2'b01 : begin data1 <= datain ; end 2'b10 : begin data2 <= datain ; end endcase pos <= pos + 1 ; end end end endmodule //--------------------------------------- // A single-port 256x21bit RAM // This module is tuned for VTR's benchmarks //--------------------------------------- module single_port_ram ( input clk, input we, input [7:0] addr, input [20:0] data, output [20:0] out ); reg [20:0] ram[255:0]; reg [20:0] internal; assign out = internal; always @(posedge clk) begin if(wen) begin ram[addr] <= data; end if(ren) begin internal <= ram[addr]; end end endmodule