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

Subversion Repositories jt51

[/] [jt51/] [trunk/] [jt51/] [jt51_pm.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 gryzor
/*  This file is part of JT51.
2
 
3
    JT51 is free software: you can redistribute it and/or modify
4
    it under the terms of the GNU General Public License as published by
5
    the Free Software Foundation, either version 3 of the License, or
6
    (at your option) any later version.
7
 
8
    JT51 is distributed in the hope that it will be useful,
9
    but WITHOUT ANY WARRANTY; without even the implied warranty of
10
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
    GNU General Public License for more details.
12
 
13
    You should have received a copy of the GNU General Public License
14
    along with JT51.  If not, see <http://www.gnu.org/licenses/>.
15
 
16
        Author: Jose Tejada Gomez. Twitter: @topapate
17
        Version: 1.0
18
        Date: 27-10-2016
19
        */
20
 
21
`timescale 1ns / 1ps
22
 
23
module jt51_pm(
24
        input   [6:0]    kc,
25
    input       [5:0]    kf,
26
    input       [8:0]    mod,
27
    input                       add,
28
    output      reg [12:0] kcex
29
);
30
 
31
reg [9:0] lim;
32
reg [13:0] kcex0, kcex1;
33
reg [1:0] extra;
34
 
35
reg [6:0] kcin;
36
reg carry;
37
 
38
always @(*) begin: kc_input_cleaner
39
        { carry, kcin } <= kc[1:0]==3'd3 ? { 1'b0, kc } + 8'd1 : {1'b0,kc};
40
end
41
 
42
always @(*) begin : addition
43
        lim <= { 1'd0, mod } +  { 4'd0, kf };
44
    case( kcin[3:0] )
45
                default:
46
                if( lim>=10'd448 ) extra <= 2'd2;
47
            else if( lim>=10'd256 ) extra <= 2'd1;
48
            else extra <= 2'd0;
49
         4'd1,4'd5,4'd9,4'd13:
50
                if( lim>=10'd384 ) extra <= 2'd2;
51
            else if( lim>=10'd192 ) extra <= 2'd1;
52
            else extra <= 2'd0;
53
         4'd2,4'd6,4'd10,4'd14:
54
                if( lim>=10'd512 ) extra <= 2'd3;
55
                else if( lim>=10'd320 ) extra <= 2'd2;
56
            else if( lim>=10'd128 ) extra <= 2'd1;
57
            else extra <= 2'd0;
58
    endcase
59
    kcex0 <= {1'b0,kcin,kf} + { 4'd0, extra, 6'd0 } + { 1'd0, mod };
60
    kcex1 <= kcex0[7:6]==2'd3 ? kcex0 + 14'd64 : kcex0;
61
end
62
 
63
reg signed [9:0] slim;
64
reg [1:0] sextra;
65
reg [13:0] skcex0, skcex1;
66
 
67
always @(*) begin : subtraction
68
        slim <= { 1'd0, mod } - { 4'd0, kf };
69
    case( kcin[3:0] )
70
                default:
71
                if( slim>=10'sd449 ) sextra <= 2'd3;
72
                else if( slim>=10'sd257 ) sextra <= 2'd2;
73
            else if( slim>=10'sd65 ) sextra <= 2'd1;
74
            else sextra <= 2'd0;
75
         4'd1,4'd5,4'd9,4'd13:
76
                if( slim>=10'sd321 ) sextra <= 2'd2;
77
            else if( slim>=10'sd129 ) sextra <= 2'd1;
78
            else sextra <= 2'd0;
79
         4'd2,4'd6,4'd10,4'd14:
80
                if( slim>=10'sd385 ) sextra <= 2'd2;
81
            else if( slim>=10'sd193 ) sextra <= 2'd1;
82
            else sextra <= 2'd0;
83
    endcase
84
    skcex0 <= {1'b0,kcin,kf} - { 4'd0, sextra, 6'd0 } - { 1'd0, mod };
85
    skcex1 <= skcex0[7:6]==2'd3 ? skcex0 - 14'd64 : skcex0;
86
end
87
 
88
always @(*) begin : mux
89
        if ( add )
90
            kcex  <= kcex1[13] | carry ? {3'd7, 4'd14, 6'd63} : kcex1[12:0];
91
    else
92
            kcex  <= carry ? {3'd7, 4'd14, 6'd63} : (skcex1[13] ? 13'd0 : skcex1[12:0]);
93
end
94
 
95
endmodule

powered by: WebSVN 2.1.0

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