3227|4

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

cpu代码的控制器部分查错 [复制链接]

module control(clk,rst,empty,opcode,da,in_reg,rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,
               load_pc,inc_pc,inc_ptr,dec_ptr,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s);
input clk,rst,empty;
input [7:0]opcode,da,in_reg;
output rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
       inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1;
output [2:0]s;
reg rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,inc_pc,
    datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1;
reg [2:0]s;
reg [3:0]state;

parameter LDA=8'b0000_0001,     ADD=8'b0000_0000,     SUB=8'b0000_0010,     OUT=8'b0000_0011,    JMP=8'b0000_0100,     JZ=8'b0000_0101,      JN=8'b0000_0110,
          DATX=8'b0000_0111,    IN=8'b0000_1000,      STR=8'b0000_1001,     SDAN=8'b0000_1010,   STPK=8'b0000_1011,    JK=8'b0000_1100,     XTDA=8'b0000_1101,
          INC=8'b00001_110,     DEC=8'b00001_111,     ZERO=8'b00010_000,    INP=8'b00010_001,    STRP=8'b00010_010,   JEND=8'b00010_011,     LNOT=8'b00010_100,
          LAND=8'b00010_101,    LOR=8'b00010_110,     MULT=8'b00010_111,    DIVI=8'b00011_000,   STP=8'b00011_001;
parameter CLK1=4'b0000,  CLK2=4'b0001,  CLK3=4'b0010,  CLK4=4'b0011,
          CLK5=4'b0100,  CLK6=4'b0101,  CLK7=4'b0110,  CLK8=4'b0111;
     
always @(posedge clk or posedge rst)
if(rst) state<=4'b0000;
else
  begin
   {rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
   inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s}<=26'b0;
    case(state)
     CLK1:  begin
             fetch<=1;  rd<=1;  iram_sel<=1;  ir_ena<=1;  state<=CLK2;
            end
     CLK2:  begin
             fetch<=1;  rd<=1;  iram_sel<=1;  ir_ena<=1;  inc_pc<=1;  state<=CLK3;
            end
     CLK3:  case(opcode)
               LDA: state<=CLK4;      ADD: state<=CLK4;      SUB: state<=CLK4;     OUT: state<=CLK4;     IN: state<=CLK4;    STR: state<=CLK4;   
               SDAN: state<=CLK4;     LAND: state<=CLK4;     LOR: state<=CLK4;     MULT: state<=CLK4;    DIVI: state<=CLK4;   JZ: state<=CLK4;
               JN: state<=CLK4;       JMP: state<=CLK4;      JK: state<=CLK4;      JEND: state<=CLK4;
               INC: begin
                      inc_ptr<=1;  state<=CLK4;
                    end
               DEC: begin
                      dec_ptr<=1;  state<=CLK4;
                    end
               ZERO: begin
                      s<=3'b000;   da_ena<=1;   state<=CLK4;
                     end
               INP: begin
                      ld_ir_ptr<=1;  state<=CLK4;
                    end
               STRP: begin
                      datactl_ena<=1;  wr<=1;  dram_sel<=1;  load_ptr<=1;  state<=CLK4;
                     end
               LNOT: begin
                      ld_a<=1;  state<=CLK4;
                     end
               STPK:
                     begin
                       halt<=1;  state<=CLK4;
                     end
               DATX: begin
                       ld_da_x<=1;  state<=CLK4;
                     end
               XTDA: begin
                       s<=3'b010; da_ena<=1;  state<=CLK4;
                     end
               STP: begin
                       stop<=1;  state<=CLK1;
                    end                     
               default:
                begin
                 state<=CLK4;
                  {rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
                  inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s}<=26'b0;
                end
             endcase
     CLK4:   begin
              inc_pc<=1;
              case(opcode)
               LDA: state<=CLK5;     ADD: state<=CLK5;    SUB: state<=CLK5;    OUT: state<=CLK5;     IN:  state<=CLK5;     STR: state<=CLK5;
               LAND: state<=CLK5;    LOR: state<=CLK5;    MULT: state<=CLK5;   DIVI: state<=CLK5;    INP: state<=CLK5;     STP: state<=CLK5;
               INC: state<=CLK1;     DEC: state<=CLK1;    STRP: state<=CLK1;   DATX: state<=CLK1;    XTDA: state<=CLK1;    ZERO: state<=CLK1;
               JMP:
                 begin
                   load_pc<=1;   state<=CLK1;
                 end
               JZ:
                 if(da==8'b0)
                  begin
                    load_pc<=1;  state<=CLK1;
                  end
                 else state<=CLK1;
               JN:
                 if(da<0)
                  begin
                    load_pc<=1;  state<=CLK1;
                  end
                 else state<=CLK1;
               JEND:
                 if(in_reg==8'h80)
                   begin
                     load_pc<=1;  state<=CLK1;
                   end         
                 else  state<=CLK1;
               SDAN:
                   begin
                     s<=3'b100;   da_ena<=1;   state<=CLK1;
                   end
               LNOT:
                 begin
                    alu_ena<=1;  s<=3'b001;  da_ena<=1;  state<=CLK1;
                 end
               STPK:
                   state<=CLK5;
               JK:
                  if(empty==1)
                    begin
                      load_pc<=1;  state<=CLK1;
                    end
                  else state<=CLK1;
               default:
                begin
                 state<=CLK5;
                  {rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
                  inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s}<=26'b0;
               end
              endcase
           end  
    CLK5:  
       begin
        case(opcode)
           LDA:
             begin
               rd<=1;  dram_sel<=1;  s<=3'b011;  da_ena<=1;  state<=CLK1;
             end
           ADD:
             begin
               ld_b<=1;  state<=CLK6;
             end
           SUB:
             begin
               ld_b<=1;  state<=CLK6;
             end
           OUT:
             begin
               rd<=1;  dram_sel<=1;  dr_o<=1;  state<=CLK1;
             end
           IN:
            begin
               ld_in<=1;  wr<=1;  dram_sel<=1;  state<=CLK1;
             end
           STR:
             begin
               datactl_ena<=1;  wr<=1;  dram_sel<=1;  state<=CLK1;
             end
           INP:
             begin
               ld_in<=1;  wr<=1;  state<=CLK1;
             end
           LAND:
             begin
               ld_b<=1;  state<=CLK6;
             end
           LOR:
             begin
               ld_b<=1;  state<=CLK6;
             end   
           MULT:
             begin
               ld_b<=1;  state<=CLK6;
             end
           DIVI:
             begin
               ld_b<=1;  state<=CLK6;
             end
           JMP: state<=CLK1;    JZ: state<=CLK1;    JN: state<=CLK1;    STR: state<=CLK1;    SDAN: state<=CLK1;     INC: state<=CLK1;
           DEC: state<=CLK1;    ZERO: state<=CLK1;  JEND: state<=CLK1;  LNOT: state<=CLK1;   JK: state<=CLK1;       DATX: state<=CLK1;
           XTDA: state<=CLK1;   STP: state<=CLK1;   STPK:  state<=CLK6;        
          default:
           begin
            state<=CLK6;
             {rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
             inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s}<=26'b0;
          end
         endcase
      end
    CLK6:  
     begin
      case(opcode)
           ADD:
              begin
                 ld_a<=1;  state<=CLK7;
              end
           SUB:
              begin
                 ld_a<=1; state<=CLK7;
              end
           LAND:
              begin
                 ld_a<=1;  state<=CLK7;
              end
           LOR:
              begin
                 ld_a<=1;  state<=CLK7;
              end
           MULT:
              begin  
                 ld_a<=1;  state<=CLK7;
              end
           DIVI:
              begin
                 ld_a<=1;  state<=CLK7;
              end
           STPK: state<=CLK7;
           JMP: state<=CLK1;    JZ: state<=CLK1;    JN: state<=CLK1;    STR: state<=CLK1;    SDAN: state<=CLK1;     INC: state<=CLK1;  IN: state<=CLK1;
           DEC: state<=CLK1;    ZERO: state<=CLK1;  JEND: state<=CLK1;  LNOT: state<=CLK1;   JK: state<=CLK1;       DATX: state<=CLK1;
           XTDA: state<=CLK1;   STP: state<=CLK1;   INP: state<=CLK1;   STR: state<=CLK1;    OUT: state<=CLK1;      LDA: state<=CLK1;
           default:
           begin
             state<=CLK7;
              {rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
               inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s}<=26'b0;
          end
         endcase
      end
    CLK7: begin
          case(opcode)
           ADD:
             begin  
               alu_ena<=1;   s<=3'b001;  da_ena<=1;   state<=CLK1;
             end
           SUB:
             begin
               alu_ena<=1;   s<=3'b001;  da_ena<=1;   state<=CLK1;
             end
           LAND:   
             begin
               alu_ena<=1;   s<=3'b001;  da_ena<=1;   state<=CLK1;
             end   
           LOR:
             begin
               alu_ena<=1;   s<=3'b001;   da_ena<=1;   state<=CLK1;
             end
           MULT:
             begin
               alu_ena<=1;   s<=3'b001;   da_ena<=1;   state<=CLK8;
             end
           DIVI:
             begin
               alu_ena<=1;   s<=3'b001;   da_ena<=1;   state<=CLK8;  
             end
           STPK: state<=CLK8;
           JMP: state<=CLK1;    JZ: state<=CLK1;    JN: state<=CLK1;    STR: state<=CLK1;    SDAN: state<=CLK1;     INC: state<=CLK1;  IN: state<=CLK1;
           DEC: state<=CLK1;    ZERO: state<=CLK1;  JEND: state<=CLK1;  LNOT: state<=CLK1;   JK: state<=CLK1;       DATX: state<=CLK1;
           XTDA: state<=CLK1;   STP: state<=CLK1;   INP: state<=CLK1;   STR: state<=CLK1;    OUT: state<=CLK1;      LDA: state<=CLK1;
           default:
             begin
               state<=CLK8;
                {rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
                inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s}<=26'b0;
            end
          endcase
        end
    CLK8:  
       begin
        case(opcode)
             MULT:
               begin
                 ld_s1<=1;  state<=CLK1;
               end
             DIVI:
               begin
                 ld_s1<=1;  state<=CLK1;
               end  
             JMP: state<=CLK1;    JZ: state<=CLK1;    JN: state<=CLK1;    STR: state<=CLK1;    SDAN: state<=CLK1;     INC: state<=CLK1;  
             DEC: state<=CLK1;    ZERO: state<=CLK1;  JEND: state<=CLK1;  LNOT: state<=CLK1;   JK: state<=CLK1;       DATX: state<=CLK1;
             XTDA: state<=CLK1;   STP: state<=CLK1;   INP: state<=CLK1;   STRP: state<=CLK1;    OUT: state<=CLK1;      LDA: state<=CLK1;              
             IN: state<=CLK1;     ADD: state<=CLK1;   SUB: state<=CLK1;   LAND: state<=CLK1;   LOR: state<=CLK1;      STPK: state<=CLK1;
             default:
               begin
               state<=CLK1;
                {rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
                inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s}<=26'b0;
               end
           endcase
        end
   default:   begin
               {rd,wr,fetch,alu_ena,ir_ena,da_ena,ld_da_x,ld_ir_ptr,load_ptr,load_pc,inc_ptr,dec_ptr,
                inc_pc,datactl_ena,ld_a,ld_b,halt,stop,dr_o,ld_in,iram_sel,dram_sel,ld_s1,s}<=26'b0;     
               state<=CLK1;
              end
  endcase
end
endmodule
此帖出自FPGA/CPLD论坛

最新回复

我把你的程序功能仿真了,大体上看没有错误。CLK5,CLK6,CLK7里面有STR被重复定义两次,估计是黏贴时没注意。。仿真波形看了几个周期,也不知道你的一些功能到底是做什么的也没具体看,大体功能应该是对的吧。 另外,建议你用8个周期完成这些功能再回去取指令,不要一完成某些功能就跳回CLK1,这样感觉好混乱,看波形看的很累。  详情 回复 发表于 2011-11-28 19:31
点赞 关注
 

回复
举报

281

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
行外人 真是看不懂啊。。
此帖出自FPGA/CPLD论坛
个人签名[url=http://www.51great.org/]嵌入式培训[/url
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这样的命令执行起来会不会有错误?
此帖出自FPGA/CPLD论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
请各位用modelsim帮忙查查错,谢谢
此帖出自FPGA/CPLD论坛
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

5
 
我把你的程序功能仿真了,大体上看没有错误。CLK5,CLK6,CLK7里面有STR被重复定义两次,估计是黏贴时没注意。。仿真波形看了几个周期,也不知道你的一些功能到底是做什么的也没具体看,大体功能应该是对的吧。
另外,建议你用8个周期完成这些功能再回去取指令,不要一完成某些功能就跳回CLK1,这样感觉好混乱,看波形看的很累。
此帖出自FPGA/CPLD论坛

赞赏

1

查看全部赞赏

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表