OpenCores
URL https://opencores.org/ocsvn/pdp1/pdp1/trunk

Subversion Repositories pdp1

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /pdp1
    from Rev 4 to Rev 5
    Reverse comparison

Rev 4 → Rev 5

/trunk/rtl/verilog/vector2scanline.v
1,6 → 1,5
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: Yann Vernier
//
// Create Date: 21:37:32 02/19/2011
13,29 → 12,44
//
// Dependencies:
//
// Revision: $Id$
// $Log$
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
 
module vector2scanline(
input clk, // clock
clk_i, // clock
 
input strobe, // new exposed pixel trigger
input [9:0] x, // column of exposed pixel
input [9:0] y, // row of exposed pixel
strobe_i, // new exposed pixel trigger
x_i, // column of exposed pixel
y_i, // row of exposed pixel
 
// Video output interface
input [9:0] xout, // current pixel column
input [9:0] yout, // current pixel row
input newline, // line buffer swap signal
input newframe, // new frame signal
output [7:0] pixel // output pixel intensity
);
xout_i, // current pixel column
yout_i, // current pixel row
newline_i, // line buffer swap signal
newframe_i, // new frame signal
pixel_o // output pixel intensity
/*AUTOARG*/);
 
// TODO: figure out how to apply parameters to the port sizes above
 
parameter X_WIDTH = 10; // bit width of column coordinate
parameter Y_WIDTH = 10; // bit width of row coordinate
parameter HIST_WIDTH = 10; // log2 of maximum lit pixels (exposure buffer)
parameter AGE_WIDTH = 8; // width of exposure age counter
input clk_i;
input strobe_i;
input [X_WIDTH-1:0] x_i;
input [Y_WIDTH-1:0] y_i;
 
input [X_WIDTH-1:0] xout_i;
input [Y_WIDTH-1:0] yout_i;
input newline_i, newframe_i;
output [AGE_WIDTH-1:0] pixel_o;
 
// positions and age of lit pixels
reg [X_WIDTH+Y_WIDTH+AGE_WIDTH-1:0] exposures [(2**HIST_WIDTH)-1:0];
// output register of exposed pixels buffer
43,12 → 57,14
// data for next pixel to store in exposure buffer
wire [X_WIDTH-1:0] expx;
wire [Y_WIDTH-1:0] expy;
wire [7:0] expi;
wire [AGE_WIDTH-1:0] expi;
// whether this pixel needs to be stored back in exposure buffer
wire exposed;
// whether this pixel belongs to the next (backbuffer) scanline
wire rowmatch;
// addresses for exposure buffer read and write ports
reg [HIST_WIDTH-1:0] exprptr=0, expwptr=0;
 
// scanline pixel buffers, store intensity
// double-buffered; one gets wiped as it is displayed
// the other gets filled in with current exposures
60,9 → 76,9
reg bufsel = 0;
// address lines for scanline buffers
wire [X_WIDTH-1:0] sl0w, sl1w;
 
// RAM read out of exposure buffer
always @(posedge clk) begin
always @(posedge clk_i) begin
expr<=exposures[exprptr];
if (!strobe) begin
// do not skip current read position if strobe inserts a new pixel
71,40 → 87,50
end
 
// decode and mux: split fields from exposure buffer, or collect new at strobe
assign expx = strobe?x:expr[X_WIDTH+Y_WIDTH+AGE_WIDTH-1:Y_WIDTH+AGE_WIDTH];
assign expy = strobe?y:expr[Y_WIDTH+AGE_WIDTH-1:AGE_WIDTH];
assign expi = strobe?(2**AGE_WIDTH)-1:expr[AGE_WIDTH-1:0];
assign expx = strobe_i?x_i:expr[X_WIDTH+Y_WIDTH+AGE_WIDTH-1:Y_WIDTH+AGE_WIDTH];
assign expy = strobe_i?y_i:expr[Y_WIDTH+AGE_WIDTH-1:AGE_WIDTH];
assign expi = strobe_i?(2**AGE_WIDTH)-1:expr[AGE_WIDTH-1:0];
// detect whether pixel even needs to be stored back
assign exposed = expi!=0;
// detect whether pixel applies to current backbuffer
// TODO: use a next line input port, this incrementer won't work for
// line 0 (which is unused in display.vhd) and could be shared.
assign rowmatch=(expy==y_i+1);
always @(posedge clk) begin
always @(posedge clk_i) begin
// Feed incoming exposures into exposure buffer
if (exposed) begin
exposures[expwptr] <= {expx, expy, expy==yout?expi-1:expi};
exposures[expwptr] <= {expx, expy, expy==yout_i?expi-1:expi};
expwptr <= expwptr+1;
end
end
// scanline buffers switch output or expose roles based on bufsel
assign sl0w=bufsel?expx:xout_i;
assign sl1w=bufsel?xout_i:expx;
 
// scanline buffers switch output or expose roles based on bufsel
assign sl0w=bufsel?expx:xout;
assign sl1w=bufsel?xout:expx;
always @(posedge clk) begin
always @(posedge clk_i) begin
// Read out front buffer
pixelout <= bufsel?scanline1[sl1w]:scanline0[sl0w];
// TODO: use a next line input port, this incrementer won't work for
// line 0 (which is unused in display.vhd) and could be shared.
if (expy==(y+1)) begin
// Store exposures for current scanline and wipe front buffer
scanline0[sl0w] <= bufsel?expi:0;
scanline1[sl1w] <= bufsel?0:expi;
pixelout <= bufsel?scanline1[xout_i]:scanline0[xout_i];
 
// Store exposures for next scanline and wipe front buffer
if (bufsel) begin
if (rowmatch)
scanline0[sl0w] <= expi;
scanline1[sl1w] <= 0;
end else begin
if (rowmatch)
scanline1[sl1w] <= expi;
scanline0[sl0w] <= 0;
end
 
// swap buffers when signaled
if (newline) begin
if (newline_i) begin
bufsel <= ~bufsel;
end
end
// output pixel intensity
assign pixel_o = pixelout;
 
// output pixel intensity
assign pixel = pixelout;
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.