input xsign, ysign,
output reg [12:0] out,
output reg sign,
- output reg [1:0] ovf);
+ output reg ovf);
always @(posedge clk)
begin
{ovf,out} <=
(((y[12] ? (x ) : 0) +
(y[11] ? (x >> 1) : 0) +
- (y[10] ? (x >> 2) : 0) +
- (y[9] ? (x >> 3) : 0)) +
- ((y[8] ? (x >> 4) : 0) +
- (y[7] ? (x >> 5) : 0) +
- (y[6] ? (x >> 6) : 0)))+
+ (y[10] ? (x >> 2) : 0)) +
+ (((y[9] ? (x >> 3) : 0) +
+ (y[8] ? (x >> 4) : 0))+
+ ((y[7] ? (x >> 5) : 0) +
+ (y[6] ? (x >> 6) : 0))))+
+
(((y[5] ? (x >> 7) : 0) +
- (y[4] ? (x >> 8) : 0) +
+ (y[4] ? (x >> 8) : 0)+
(y[3] ? (x >> 9) : 0)) +
- ((y[2] ? (x >> 10): 0) +
+ ((y[2] ? (x >> 10): 0) +
(y[1] ? (x >> 11): 0) +
(y[0] ? (x >> 12): 0)));
sign <= xsign ^ ysign;
input xsign, ysign,
output wire [12:0] out,
output wire sign,
- output wire [1:0] overflow);
+ output wire overflow);
NaiveMultiplier nm(clk, x, y, xsign, ysign, out, sign, overflow);
endmodule
+// Yuq.
module MandelUnit(
input clk,
input [12:0] x, y,
reg [2:0] state = 3'b001; // One-hot encoded state.
- // On pixclk = 1,
- // A new value to be loaded comes in, and a value in need of loopback comes out.
- // On pixclk = 0,
- // A new value in need of loopback comes in, and a completed value comes out.
-
assign initx = state[0] ? rx :
state[1] ? stagex[1] :
stagex[2];
state[1] ? stageb[1] :
stageb[2];
assign initci = state[0] ? 8'b00000000 :
- state[1] ? stageb[1] :
- stageb[2];
+ state[1] ? stageci[1] :
+ stageci[2];
reg [7:0] out;
- reg typethea = 0; // Whether we have typed the A.
- reg statekick = 0; // State needs to be kicked back to 3'b010 on the next mclk.
-
- // This is guaranteed to converge after two pixclks.
- //always @(negedge mclk)
- // if (pixclk && !typethea) begin
- // typethea <= 1;
- // statekick <= 1;
- // end else if (typethea) begin // This is the edge of the falling anus.
- // typethea <= 0;
- // statekick <= 0;
- // end
+
+ // We detect when the state should be poked by a high negedge followed
+ // by a high posedge -- if that happens, then we're guaranteed that the
+ // state following the current state will be 3'b100.
+ reg lastneg;
+ always @(negedge mclk)
+ lastneg <= pixclk;
always @(posedge mclk)
begin
+ if (lastneg && pixclk) // If a pixclk has happened, the state should be reset.
+ state <= 3'b100;
+ else // Otherwise, just poke it forward.
+ state <= {state[1], state[0], state[2]};
+
// Data output handling
if (state[0]) begin
{red, green, blue} <= {out[0],out[3],out[6],out[1],out[4],out[7],out[2],out[5]};
end
- if (state[2]) begin
+ if (state[1]) begin
out <= ~mb[`MAXOUTN] + colorofs;
end
- if (state[1]) begin // PnR0 in, PnR2 out
+ if (state[0]) begin // PnR0 in, PnR2 out
stagex[2] <= xprop[`MAXOUTN];
stagey[2] <= yprop[`MAXOUTN];
stager[2] <= mr[`MAXOUTN];
stageci[2] <= curiter[`MAXOUTN];
end
- if (state[0]) begin // PnR2 in, PnR1 out
+ if (state[2]) begin // PnR2 in, PnR1 out
stagex[1] <= xprop[`MAXOUTN];
stagey[1] <= yprop[`MAXOUTN];
stager[1] <= mr[`MAXOUTN];
stageb[1] <= mb[`MAXOUTN];
stageci[1] <= curiter[`MAXOUTN];
end
-
- if (statekick) // If a pixclk has happened, the state should be reset.
- state <= 3'b010;
- else // Otherwise, just poke it forward.
- state <= {state[1], state[0], state[2]};
end
MandelUnit mu0(