集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1002|回复: 2

RISC CPU-状态控制器

[复制链接]
fpga_feixiang 发表于 2020-9-3 20:46:50 | 显示全部楼层 |阅读模式
module machinectl( ena, fetch, rst);
3 output ena;
4 input fetch, rst;
5 reg ena;
6 always @(posedge fetch or posedge rst)
7
8
9 begin
10     if(rst)
11         ena<=0;
12     else
13         ena<=1;
14 end
15 endmodule

module machine( inc_pc, load_acc, load_pc, rd,wr, load_ir,
  3 datactl_ena, halt, clk1, zero, ena, opcode );
  4 output inc_pc, load_acc, load_pc, rd, wr, load_ir;
  5 output datactl_ena, halt;
  6 input clk1, zero, ena;
  7 input [2:0] opcode;
  8 reg inc_pc, load_acc, load_pc, rd, wr, load_ir;
  9 reg datactl_ena, halt;
10 reg [2:0] state;
11
12 parameter HLT = 3 'b000,
13     SKZ = 3 'b001,
14     ADD = 3 'b010,
15     ANDD = 3 'b011,
16     XORR = 3 'b100,
17     LDA = 3 'b101,
18     STO = 3 'b110,
19     JMP = 3 'b111;
20
21 always @( negedge clk1 )
22     begin
23         if ( !ena ) //接收到复位信号RST,进行复位操作
24             begin
25                 state<=3'b000;
26                 {inc_pc,load_acc,load_pc,rd}<=4'b0000;
27                 {wr,load_ir,datactl_ena,halt}<=4'b0000;
28             end
29         else
30             ctl_cycle;
31     end
32 //-----------------begin of task ctl_cycle---------
33 task ctl_cycle;
34 begin
35     casex(state)
36         3’b000: //load high 8bits in struction
37             begin
38                 {inc_pc,load_acc,load_pc,rd}<=4'b0001;
39                 {wr,load_ir,datactl_ena,halt}<=4'b0100;
40                 state<=3’b001;
41             end
42         3’b001: //pc increased by one then load low 8bits instruction
43             begin
44                 {inc_pc,load_acc,load_pc,rd}<=4'b1001;
45                 {wr,load_ir,datactl_ena,halt}<=4'b0100;
46                 state<=3’b010;
47             end
48         3’b010: //idle
49             begin
50                 {inc_pc,load_acc,load_pc,rd}<=4'b0000;
51                 {wr,load_ir,datactl_ena,halt}<=4'b0000;
52                 state<=3’b011;
53             end
54         3’b011: //next instruction address setup 分析指令从这里开始
55             begin
56                 if(opcode==HLT) //指令为暂停HLT
57                     begin
58                         {inc_pc,load_acc,load_pc,rd}<=4'b1000;
59                         {wr,load_ir,datactl_ena,halt}<=4'b0001;
60                     end
61                 else
62                     begin
63                         {inc_pc,load_acc,load_pc,rd}<=4'b1000;
64                         {wr,load_ir,datactl_ena,halt}<=4'b0000;
65                     end
66                 state<=3’b100;
67             end
68         3’b100: //fetch oprand
69             begin
70                 if(opcode==JMP)
71                     begin
72                         {inc_pc,load_acc,load_pc,rd}<=4'b0010;
73                         {wr,load_ir,datactl_ena,halt}<=4'b0000;
74                     end
75                 else
76                 if( opcode==ADD || opcode==ANDD ||
77                     opcode==XORR || opcode==LDA)
78                         begin
79                             {inc_pc,load_acc,load_pc,rd}<=4'b0001;
80                             {wr,load_ir,datactl_ena,halt}<=4'b0000;
81                         end
82                 else
83                     if(opcode==STO)
84                         begin
85                             {inc_pc,load_acc,load_pc,rd}<=4'b0000;
86                             {wr,load_ir,datactl_ena,halt}<=4'b0010;
87                         end
88                 else
89                     begin
90                         {inc_pc,load_acc,load_pc,rd}<=4'b0000;
91                         {wr,load_ir,datactl_ena,halt}<=4'b0000;
92                 end
93                 state<=3’b101;
94             end
95         3’b101: //operation
96             begin
97                 if ( opcode==ADD||opcode==ANDD||opcode==XORR||opcode==LDA )
98                     begin //过一个时钟后与累加器的内容进行运算
99                         {inc_pc,load_acc,load_pc,rd}<=4'b0101;
100                         {wr,load_ir,datactl_ena,halt}<=4'b0000;
101                     end
102                 else
103                     if( opcode==SKZ && zero==1)
104                         begin
105                             {inc_pc,load_acc,load_pc,rd}<=4'b1000;
106                             {wr,load_ir,datactl_ena,halt}<=4'b0000;
107                         end
108                 else
109                     if(opcode==JMP)
110                         begin
111                             {inc_pc,load_acc,load_pc,rd}<=4'b1010;
112                             {wr,load_ir,datactl_ena,halt}<=4'b0000;
113                         end
114                 else
115                     if(opcode==STO)
116                         begin
117                             //过一个时钟后把wr变1就可写到RAM中
118                             {inc_pc,load_acc,load_pc,rd}<=4'b0000;
119                             {wr,load_ir,datactl_ena,halt}<=4'b1010;
120                         end
121                 else
122                     begin
123                         {inc_pc,load_acc,load_pc,rd}<=4'b0000;
124                         {wr,load_ir,datactl_ena,halt}<=4'b0000;
125                     end
126                 state<=3’b110;
127             end
128     3’b110: //idle
129         begin
130             if ( opcode==STO )
131                 begin
132                     {inc_pc,load_acc,load_pc,rd}<=4'b0000;
133                     {wr,load_ir,datactl_ena,halt}<=4'b0010;
134                 end
135             else
136                 if ( opcode==ADD||opcode==ANDD||opcode==XORR||opcode==LDA)
137                     begin
138                         {inc_pc,load_acc,load_pc,rd}<=4'b0001;
139                         {wr,load_ir,datactl_ena,halt}<=4'b0000;
140                     end
141             else
142                 begin
143                     {inc_pc,load_acc,load_pc,rd}<=4'b0000;
144                     {wr,load_ir,datactl_ena,halt}<=4'b0000;
145                 end
146         state<=3’b111;
147         end
148     3’b111: //
149         begin
150             if( opcode==SKZ && zero==1 )
151                 begin
152                     {inc_pc,load_acc,load_pc,rd}<=4'b1000;
153                     {wr,load_ir,datactl_ena,halt}<=4'b0000;
154                 end
155             else
156                 begin
157                     {inc_pc,load_acc,load_pc,rd}<=4'b0000;
158                     {wr,load_ir,datactl_ena,halt}<=4'b0000;
159                 end
160             state<=3’b000;
161         end
162     default:
163         begin
164             {inc_pc,load_acc,load_pc,rd}<=4'b0000;
165             {wr,load_ir,datactl_ena,halt}<=4'b0000;
166             state<=3’b000;
167         end
168     endcase
169 end
170 endtask
171 //-----------------end of task ctl_cycle---------
172 endmodule
173 //------------------------------------------------------------------------------
zhangyukun 发表于 2020-9-4 10:04:38 | 显示全部楼层
RISC CPU-状态控制器
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-20 03:34 , Processed in 0.058289 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表