1
0
mirror of https://github.com/aap/pdp6.git synced 2026-01-13 15:27:46 +00:00
aap.pdp6/verilog/modules.v
2016-12-11 17:23:06 +01:00

304 lines
5.1 KiB
Verilog

// input 100mhz, output ~60hz
module clk60hz(
input wire clk,
output wire outclk
);
reg [21:0] cnt = 0;
assign outclk = cnt == 1666666;
always @(posedge clk)
if(outclk)
cnt <= 0;
else
cnt <= cnt + 22'b1;
endmodule
module pg(
input clk,
input reset,
input in,
output p
);
reg [1:0] x;
always @(posedge clk or posedge reset)
if(reset)
x <= 0;
else
x <= { x[0], in };
assign p = x[0] & !x[1];
endmodule
module pa(input clk, input reset, input in, output reg p);
always @(posedge clk or posedge reset)
if(reset)
p <= 0;
else
p <= in;
endmodule
/* "bus driver", 40ns delayed pulse */
module bd(input clk, input reset, input in, output p);
reg [2:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 3'b1;
if(in)
r <= 1;
end
end
assign p = r == 4;
endmodule
/* Same as above but with longer pulse. Used to pulse mb
* because one more clock cycle is needed to get the data
* after the pulse has been synchronized. */
module bd2(input clk, input reset, input in, output p);
reg [2:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 3'b1;
if(in)
r <= 1;
end
end
assign p = r == 4 || r == 5 || r == 6 || r == 7;
endmodule
module dly50ns(input clk, input reset, input in, output p);
reg [2:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 3'b1;
if(in)
r <= 1;
end
end
assign p = r == 7;
endmodule
module dly70ns(input clk, input reset, input in, output p);
reg [3:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 4'b1;
if(in)
r <= 1;
end
end
assign p = r == 9;
endmodule
module dly100ns(input clk, input reset, input in, output p);
reg [3:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 4'b1;
if(in)
r <= 1;
end
end
assign p = r == 12;
endmodule
module dly150ns(input clk, input reset, input in, output p);
reg [4:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 5'b1;
if(in)
r <= 1;
end
end
assign p = r == 17;
endmodule
module dly200ns(input clk, input reset, input in, output p);
reg [4:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 5'b1;
if(in)
r <= 1;
end
end
assign p = r == 22;
endmodule
module dly250ns(input clk, input reset, input in, output p);
reg [4:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 5'b1;
if(in)
r <= 1;
end
end
assign p = r == 27;
endmodule
module dly400ns(input clk, input reset, input in, output p);
reg [5:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 6'b1;
if(in)
r <= 1;
end
end
assign p = r == 42;
endmodule
module dly800ns(input clk, input reset, input in, output p);
reg [6:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 7'b1;
if(in)
r <= 1;
end
end
assign p = r == 82;
endmodule
module dly1us(input clk, input reset, input in, output p);
reg [6:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 7'b1;
if(in)
r <= 1;
end
end
assign p = r == 102;
endmodule
module ldly1us(input clk, input reset, input in, output p, output reg l);
reg [6:0] r;
always @(posedge clk or posedge reset) begin
if(reset) begin
l <= 0;
r <= 0;
end else begin
if(r)
r <= r + 7'b1;
if(in) begin
l <= 1;
r <= 1;
end
if(r == 101) begin
l <= 0;
//r <= 0;
end
end
end
assign p = r == 102;
endmodule
module ldly1_5us(input clk, input reset, input in, output p, output reg l);
reg [7:0] r;
always @(posedge clk or posedge reset) begin
if(reset) begin
l <= 0;
r <= 0;
end else begin
if(r)
r <= r + 8'b1;
if(in) begin
l <= 1;
r <= 1;
end
if(r == 151) begin
l <= 0;
//r <= 0;
end
end
end
assign p = r == 152;
endmodule
module ldly2us(input clk, input reset, input in, output p, output reg l);
reg [7:0] r;
always @(posedge clk or posedge reset) begin
if(reset) begin
l <= 0;
r <= 0;
end else begin
if(r)
r <= r + 8'b1;
if(in) begin
l <= 1;
r <= 1;
end
if(r == 201) begin
l <= 0;
//r <= 0;
end
end
end
assign p = r == 202;
endmodule
module dly100us(input clk, input reset, input in, output p);
reg [15:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 16'b1;
if(in)
r <= 1;
end
end
assign p = r == 10002;
endmodule
module ldly100us(input clk, input reset, input in, output p, output l);
reg [15:0] r;
always @(posedge clk or posedge reset) begin
if(reset)
r <= 0;
else begin
if(r)
r <= r + 16'b1;
if(in)
r <= 1;
end
end
assign p = r == 10002;
assign l = r != 0 && r < 10002;
endmodule