1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
//
// Copyright 2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
module cpld_model
(input aux_clk, input start, input mode, input done,
output dout, output reg sclk, output detached);
reg [7:0] rom[0:65535];
reg [15:0] addr;
reg [7:0] data;
assign dout = data[7];
reg [2:0] state, bitcnt;
localparam IDLE = 3'd0;
localparam READ = 3'd1;
localparam BIT1 = 3'd2;
localparam BIT2 = 3'd3;
localparam DONE = 3'd4;
localparam DETACHED = 3'd5;
localparam ERROR = 3'd7;
integer i;
reg [1023:0] ROMFile;
initial begin
for (i=0;i<65536;i=i+1) begin
rom[i] <= 32'h0;
end
if ( !$value$plusargs( "rom=%s", ROMFile ) )
begin
$display( "Using default ROM file, 'flash.rom'" );
ROMFile = "flash.rom";
end
else
$display( "Using %s as ROM file.", ROMFile);
#1 $readmemh( ROMFile,rom );
end
initial addr = 16'd0;
initial data = 8'd0;
initial state = IDLE;
initial bitcnt = 3'd0;
initial sclk = 1'b0;
always @(posedge aux_clk)
case(state)
IDLE :
if(start)
if(~mode)
state <= READ;
else
state <= ERROR;
READ :
if(done)
state <= DONE;
else
begin
data <= rom[addr];
addr <= addr + 1;
bitcnt <= 3'd0;
if(addr==16'hFFFF)
state <= ERROR;
else
state <= BIT1;
end // else: !if(start)
BIT1 :
begin
sclk <= 1'b1;
state <= BIT2;
end
BIT2 :
begin
sclk <= 1'b0;
data <= {data[6:0],1'b0};
bitcnt <= bitcnt + 1;
if(bitcnt==7)
state <= READ;
else
state <=BIT1;
end
DONE :
begin
if(start)
state <= ERROR;
else
state <= DETACHED;
end
DETACHED :
if(start)
state <= ERROR;
endcase // case(state)
assign detached = (state == DETACHED) || (state == IDLE);
endmodule // cpld_model
|