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

Subversion Repositories i650

Compare Revisions

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

Rev 4 → Rev 5

/rtl/timing.v
0,0 → 1,247
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// IBM 650 Reconstruction in Verilog (i650)
//
// This file is part of the IBM 650 Reconstruction in Verilog (i650) project
// http:////www.opencores.org/project,i650
//
// Description: 650 Timing.
//
// Additional Comments: See US 2959351, Fig. 53, 54 and 55. Additional index
// counters provided to address general storage and register RAMs.
//
// Copyright (c) 2015 Robert Abeles
//
// This source file is free software; you can redistribute it
// and/or modify it under the terms of the GNU Lesser General
// Public License as published by the Free Software Foundation;
// either version 2.1 of the License, or (at your option) any
// later version.
//
// This source is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the GNU Lesser General Public License for more
// details.
//
// You should have received a copy of the GNU Lesser General
// Public License along with this source; if not, download it
// from http://www.opencores.org/lgpl.shtml
//////////////////////////////////////////////////////////////////////////////////
module timing (
input clk,
input rst,
output reg ap, bp, cp, dp,
output reg dx, d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10,
output reg d1_d5, d5_dx, d5_d10, d1_dx, d5_d9, d10_d1_d5,
//output reg dxcu_d1cu, d10cl_d0cu,
output dxl, dxu, d0l, d0u, d1l, d1u, d2l, d10u,
output reg w0, w1, w2, w3, w4, w5, w6, w7, w8, w9,
output reg wl, wu, ewl,
output reg s0, s1, s2, s3, s4,
output reg hp,
output reg[0:9] digit_idx,
output reg[0:3] early_idx, ontime_idx
);
 
reg[0:3] digit_ctr;
reg[0:3] word_ctr;
reg[0:2] sector_ctr;
assign dxl = dx & wl;
assign dxu = dx & wu;
assign d0l = d0 & wl;
assign d0u = d0 & wu;
assign d1l = d1 & wl;
assign d1u = d1 & wu;
assign d2l = d2 & wl;
assign d10u = d10 & wu;
//-----------------------------------------------------------------------------
// 650 four-phase clock
//-----------------------------------------------------------------------------
always @(posedge rst, posedge clk) begin
if (rst) begin
ap <= 1;
bp <= 0;
cp <= 0;
dp <= 0;
end else begin
ap <= dp;
bp <= ap;
cp <= bp;
dp <= cp;
end;
end;
//-----------------------------------------------------------------------------
// Counter-based timing signals
//-----------------------------------------------------------------------------
always @(posedge rst, posedge dp) begin
if (rst) begin
dx <= 0;
d0 <= 0;
d1 <= 0;
d2 <= 0;
d3 <= 0;
d4 <= 0;
d5 <= 0;
d6 <= 0;
d7 <= 0;
d8 <= 0;
d9 <= 0;
d10 <= 0;
d1_d5 <= 0;
d5_dx <= 0;
d5_d10 <= 0;
d1_dx <= 0;
d5_d9 <= 0;
d10_d1_d5 <= 0;
w0 <= 0;
w1 <= 0;
w2 <= 0;
w3 <= 0;
w4 <= 0;
w5 <= 0;
w6 <= 0;
w7 <= 0;
w8 <= 0;
w9 <= 0;
wu <= 0;
wl <= 0;
ewl <= 0;
s0 <= 0;
s1 <= 0;
s2 <= 0;
s3 <= 0;
s4 <= 0;
hp <= 0;
digit_ctr <= 4'd0;
word_ctr <= 4'd0;
sector_ctr <= 4'd0;
digit_idx <= 10'd599;
early_idx <= 4'd10;
ontime_idx <= 4'd11;
end else begin
digit_idx <= (digit_idx + 1) % 600;
early_idx <= (early_idx + 1) % 12;
ontime_idx <= (ontime_idx + 1) % 12;
digit_ctr <= (digit_ctr + 1) % 12;
if (digit_ctr == 4'd11) begin
word_ctr <= (word_ctr + 1) % 10;
if (word_ctr == 9) begin
sector_ctr <= (sector_ctr + 1) % 5;
end;
end;
case (digit_ctr)
4'd0: begin
d10 <= 0; dx <= 1;
d5_dx <= 0;
d1_dx <= 0;
d10_d1_d5 <= 0;
wl <= ~word_ctr[3];
wu <= word_ctr[3];
case (word_ctr)
4'd0: begin
w9 <= 0; w0 <= 1;
case (sector_ctr)
3'd0: begin
s4 <= 0; s0 <= 1;
hp <= 1;
end
3'd1: begin
s0 <= 0; s1 <= 1;
end
3'd2: begin
s1 <= 0; s2 <= 1;
end
3'd3: begin
s2 <= 0; s3 <= 1;
end
3'd4: begin
s3 <= 0; s4 <= 1;
end
endcase;
end
4'd1: begin
w0 <= 0; w1 <= 1;
end
4'd2: begin
w1 <= 0; w2 <= 1;
end
4'd3: begin
w2 <= 0; w3 <= 1;
end
4'd4: begin
w3 <= 0; w4 <= 1;
end
4'd5: begin
w4 <= 0; w5 <= 1;
end
4'd6: begin
w5 <= 0; w6 <= 1;
end
4'd7: begin
w6 <= 0; w7 <= 1;
end
4'd8: begin
w7 <= 0; w8 <= 1;
end
4'd9: begin
w8 <= 0; w9 <= 1;
end
endcase;
end
4'd1: begin
dx <= 0; d0 <= 1;
hp <= 0;
end
4'd2: begin
d0 <= 0; d1 <= 1;
d1_d5 <= 1;
end
4'd3: begin
d1 <= 0; d2 <= 1;
d1_dx <= 1;
d10_d1_d5 <= 1;
end
4'd4: begin
d2 <= 0; d3 <= 1;
end
4'd5: begin
d3 <= 0; d4 <= 1;
ewl <= wu;
end
4'd6: begin
d4 <= 0; d5 <= 1;
d1_d5 <= 0;
d10_d1_d5 <= 0;
d5_dx <= 1;
d5_d10 <= 1;
d5_d9 <= 1;
end
4'd7: begin
d5 <= 0; d6 <= 1;
end
4'd8: begin
d6 <= 0; d7 <= 1;
end
4'd9: begin
d7 <= 0; d8 <= 1;
end
4'd10: begin
d8 <= 0; d9 <= 1;
d5_d9 <= 0;
end
4'd11: begin
d9 <= 0; d10 <= 1;
d5_d10 <= 0;
d10_d1_d5 <= 1;
end
endcase;
end;
end;
endmodule

powered by: WebSVN 2.1.0

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