OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [rtl/] [src_peripheral/] [Other/] [gcd_ip.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
// synthesis translate_off
2
`timescale 1ns / 1ps
3
// synthesis translate_on
4
 
5
 
6
module gcd_ip#(
7
    parameter GCDw=32,
8
    parameter Dw =GCDw,
9
    parameter Aw =5,
10
    parameter TAGw =3,
11
    parameter SELw =4
12
)
13
(
14
    clk,
15
    reset,
16
    //wishbone bus interface
17
    s_dat_i,
18
    s_sel_i,
19
    s_addr_i,
20
    s_tag_i,
21
    s_stb_i,
22
    s_cyc_i,
23
    s_we_i,
24
    s_dat_o,
25
    s_ack_o,
26
    s_err_o,
27
    s_rty_o
28
 
29
);
30
    input                  clk;
31
    input                  reset;
32
 
33
    //wishbone bus interface
34
    input       [Dw-1       :   0]      s_dat_i;
35
    input       [SELw-1     :   0]      s_sel_i;
36
    input       [Aw-1       :   0]      s_addr_i;
37
    input       [TAGw-1     :   0]      s_tag_i;
38
    input                               s_stb_i;
39
    input                               s_cyc_i;
40
    input                               s_we_i;
41
 
42
    output      [Dw-1       :   0]      s_dat_o;
43
    output   reg                        s_ack_o;
44
    output                              s_err_o;
45
    output                              s_rty_o;
46
 
47
 //Wishbone bus registers address
48
     localparam DONE_REG_ADDR=0;
49
     localparam IN_1_REG_ADDR=1;
50
     localparam IN_2_REG_ADDR=2;
51
     localparam GCD_REG_ADDR=3;
52
 
53
    assign s_err_o        =   1'b0;
54
    assign s_rty_o        =   1'b0;
55
 
56
    wire[GCDw-1 :0] gcd;
57
    reg [GCDw-1 :0] readdata,in1,in2;
58
    wire done;
59
 
60
    assign s_dat_o =readdata;
61
 
62
    always @ (posedge clk or posedge reset) begin
63
        if(reset) begin
64
            s_ack_o   <=  1'b0;
65
        end else begin
66
            s_ack_o   <=   (s_stb_i & ~s_ack_o);
67
        end //reset
68
    end//always
69
 
70
    always @ (posedge clk or posedge reset) begin
71
        if(reset) begin
72
            readdata <= 0;
73
            in1 <= 0;
74
            in2 <= 0;
75
        end else begin
76
            if(s_stb_i && s_we_i) begin  //write regiters
77
                if(s_addr_i==IN_1_REG_ADDR[Aw-1: 0]) in1 <= s_dat_i;
78
                else if(s_addr_i==IN_2_REG_ADDR[Aw-1: 0]) in2 <= s_dat_i;
79
            end //sa_stb_i && sa_we_i
80
            else begin //read registers
81
                if (s_addr_i==DONE_REG_ADDR) readdata<={{GCDw{1'b0}},done};
82
                if (s_addr_i==GCD_REG_ADDR)  readdata<=gcd;
83
            end
84
        end //reset
85
    end//always
86
 
87
    // start gcd calculation by writiing on in2 register    
88
    wire start=(s_stb_i && s_we_i && (s_addr_i==IN_2_REG_ADDR[Aw-1: 0]));
89
    reg ps,ns;
90
    reg gcd_reset,gcd_reset_next;
91
    reg gcd_en,gcd_en_next;
92
 
93
    always @ (posedge clk or posedge reset) begin
94
        if(reset) begin
95
            ps<=1'b0;
96
            gcd_reset<=1'b1;
97
            gcd_en<=1'b0;
98
        end else begin
99
            ps<=ns;
100
            gcd_en<=gcd_en_next;
101
            gcd_reset<=gcd_reset_next;
102
        end
103
    end
104
 
105
    always @(*)begin
106
        gcd_reset_next=1'b0;
107
        gcd_en_next=1'b0;
108
        ns=ps;
109
        case(ps)
110
            1'b0:begin
111
                if(start) begin
112
                    ns=1'b1;
113
                    gcd_reset_next=1'b1;
114
                end
115
            end
116
            1'b1:begin
117
                gcd_en_next=1'b1;
118
                ns=1'b0;
119
            end
120
        endcase
121
    end
122
 
123
 
124
        gcd #(
125
                .GCDw(GCDw)
126
        ) the_gcd
127
        (
128
        .clk (clk),
129
        .reset (gcd_reset),
130
        .enable (gcd_en),
131
        .in1 (in1),
132
        .in2 (in2),
133
        .done (done),
134
        .gcd (gcd)
135
     );
136
 
137
endmodule
138
 

powered by: WebSVN 2.1.0

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