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

Subversion Repositories ncore

[/] [ncore/] [web_uploads/] [nCore.v] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 root
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Module Name:    nCore 
4
// Author: STEFAN, Istvan
5
// Published under GPL
6
//////////////////////////////////////////////////////////////////////////////////
7
module nCore(IP, DP, In, data_out, data_in, clkin);
8
        parameter inst_mvA=4'd0;
9
        parameter inst_mvB=4'd1;
10
        parameter inst_shl=4'd2;
11
        parameter inst_shr=4'd3;
12
        parameter inst_and=4'd4;
13
        parameter inst_orr=4'd5;
14
        parameter inst_xor=4'd6;
15
        parameter inst_add=4'd7;
16
        parameter inst_sub=4'd8;
17
        parameter inst_Fmv=4'd9;
18
        parameter inst_mvD=4'd10;
19
        parameter inst_coB=4'd11;
20
        parameter inst_mvP=4'd12;
21
        parameter inst_jmp=4'd13;
22
        parameter inst_coA=4'd14;
23
        parameter inst_Dmv=4'd15;
24
 
25
//buswidth constants    
26
parameter dw=15;
27
parameter maxaddrbits=10;
28
parameter Dmaxaddrbits=10;
29
 
30
        output [maxaddrbits:0] IP;
31
        output [Dmaxaddrbits:0] DP;
32
        input [7:0] In;
33
        output [dw:0] data_out;
34
        input [dw:0] data_in;
35
        input clkin;
36
 
37
//Instructions
38
        wire [7:0] In;
39
//Sign of the clock
40
        wire clk;
41
//Instruction pointer
42
        reg [maxaddrbits:0] IP=0;//init to 0
43
//Data pointer
44
        reg [Dmaxaddrbits:0] DP=0;//init to 0
45
        //Contact with the data memory
46
        wire [dw:0] data_in;
47
        wire [dw:0] data_out;
48
 
49
//Source registers
50
        reg [dw:0] a=0;
51
        reg [dw:0] b=0;
52
//General registers
53
        reg [dw:0] regs [15:0];
54
//Flag register
55
        reg [4:0] FLAG=0;//init to 0
56
        wire [4:0] FLAG_new;
57
        wire F_pre_add,F_pre_sub,F_pre_shl,F_pre_shr;
58
//Wire of results
59
        wire [dw:0] t;
60
//Temp reg of results
61
        reg [dw:0] c;
62
//The wires of part results
63
        wire [dw:0] w_add;
64
        wire [dw:0] w_sub;
65
        wire [dw:0] w_shl;//shift to left
66
        wire [dw:0] w_shr;//shift to right
67
        wire [dw:0] w_and;
68
        wire [dw:0] w_orr;
69
        wire [dw:0] w_xor;
70
        wire [dw:0] w_con;//load constant
71
//Begin of ALU
72
        wire F_zero;
73
assign F_zero=(t==16'h0000);
74
assign FLAG_new[0]=((In[7:4]==inst_and)||(In[7:4]==inst_orr)||
75
        (In[7:4]==inst_xor)||(In[7:4]==inst_and)||
76
        (In[7:4]==inst_sub)||(In[7:4]==inst_shl)||
77
        (In[7:4]==inst_shr))?F_zero:FLAG[0];
78
 
79
assign {F_pre_add,w_add}=a+b;
80
assign {F_pre_sub,w_sub}=a-b;
81
assign {F_pre_shl,w_shl}=a<<b[3:0];
82
assign {w_shr,F_pre_shr}=a>>b[3:0];
83
 
84
assign w_and=a&b;
85
assign w_orr=a|b;
86
assign w_xor=a^b;
87
assign w_con={12'h000,In[3:0]};
88
//End of ALU
89
 
90
//Instruction pointer
91
always @(negedge clk)
92
        if ((In[7:4]==inst_jmp)&&(a[0]))
93
                IP=regs[In[3:0]];
94
        else
95
                IP=IP+1;
96
 
97
wire i_mvP;
98
assign i_mvP=((In[7:4]==inst_mvP)&&~clk);
99
 
100
//Data pointer
101
always @(posedge i_mvP)
102
        DP=t;
103
 
104
//Contact with the data memory
105
wire i_mvD;
106
assign i_mvD=(In[7:4]==inst_mvD)&&~clk;
107
        assign data_out=(i_mvD)?t:data_in;
108
 
109
//Evaluation of the instructions
110
        assign t=(In[7:4]==inst_mvA)?regs[In[3:0]]:16'hzzzz;
111
        assign t=(In[7:4]==inst_mvB)?regs[In[3:0]]:16'hzzzz;
112
        assign t=(In[7:4]==inst_shl)?w_shl:16'hzzzz;
113
                assign FLAG_new[3]=(In[7:4]==inst_shl)?F_pre_shl:FLAG[3];
114
        assign t=(In[7:4]==inst_shr)?w_shr:16'hzzzz;
115
                assign FLAG_new[4]=(In[7:4]==inst_shr)?F_pre_shr:FLAG[4];
116
        assign t=(In[7:4]==inst_and)?w_and:16'hzzzz;
117
        assign t=(In[7:4]==inst_orr)?w_orr:16'hzzzz;
118
        assign t=(In[7:4]==inst_xor)?w_xor:16'hzzzz;
119
        assign t=(In[7:4]==inst_add)?w_add:16'hzzzz;
120
                assign FLAG_new[1]=(In[7:4]==inst_add)?F_pre_add:FLAG[1];
121
        assign t=(In[7:4]==inst_sub)?w_sub:16'hzzzz;
122
                assign FLAG_new[2]=(In[7:4]==inst_sub)?F_pre_sub:FLAG[2];
123
        assign t=(In[7:4]==inst_Dmv)?data_in:16'hzzzz;
124
        assign t=(In[7:4]==inst_Fmv)?FLAG:16'hzzzz;
125
        assign t=(In[7:4]==inst_mvD)?regs[In[3:0]]:16'hzzzz;
126
        assign t=(In[7:4]==inst_coB)?w_con:16'hzzzz;
127
        assign t=(In[7:4]==inst_coA)?w_con:16'hzzzz;
128
        assign t=(In[7:4]==inst_mvP)?regs[In[3:0]]:16'hzzzz;
129
 
130
//Implementation of the registres
131
wire i_mvA;
132
wire i_mvB;
133
wire i_mvR;
134
assign i_mvA=((In[7:4]==inst_mvA)||(In[7:4]==inst_coA))&&clk;
135
assign i_mvB=((In[7:4]==inst_mvB)||(In[7:4]==inst_coB))&&clk;
136
assign i_mvR=((In[7:4]==inst_Dmv)
137
        ||(In[7:4]==inst_and)||(In[7:4]==inst_orr)
138
        ||(In[7:4]==inst_xor)||(In[7:4]==inst_add)
139
        ||(In[7:4]==inst_shr)||(In[7:4]==inst_shl)
140
        ||(In[7:4]==inst_sub)||(In[7:4]==inst_Fmv))&&clk;
141
 
142
//First source register
143
always @(negedge i_mvA)
144
        a=c;
145
 
146
//Second source register
147
always @(negedge i_mvB)
148
        b=c;
149
 
150
//Keep the result
151
always @(negedge clk)
152
        c=t;
153
 
154
always @(posedge clk)
155
        FLAG=FLAG_new;
156
 
157
always @(negedge i_mvR)
158
        regs[In[3:0]]=c;
159
 
160
BUFGP U1 (.I(clkin),.O(clk));
161
 
162
 
163
endmodule

powered by: WebSVN 2.1.0

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