0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

自制CPU(四)程序编写

学FPGA,慢慢来 2018-07-16 09:20 次阅读

在我们设计出来前边三种CPU之后,我们来进行程序的编写。

所谓程序的编写,就是;利用我们写好的CPU,根据我们可执行的指令集,来编写一段程序,可一直用我们的CPU来完成。

首先,我们在写程序之前,确定你的CPU可以执行load,store,beq,jump,add几种基础指令,如果这几个都没有,那这个程序怕是也做不出来的。

在你希望实现的小系统中,一定有你的外围电路,它是将你外部输入的数据写入外存/数据存储器 中的,并将运算结果读出并显示或... 之后你的指令在开始时寄存器堆中可以预先有操作数,也可以通过指令读入。程序在开始前进行load将数据从数据存储器中读入寄存器堆中,最后再从寄存器堆中用store写会到数据寄存器中。在运算中有判断时就使用beq来完成,直接跳转一般都在beq跳转到的位置进行有效操作完的下一条指令,为了实现如C语言中的if语句。

最终你的指令是写成一个case语句中或者写成一个.coe文件的,coe文件直接写入数据存储器中,

例如

32'd0 : instruction <= 32'b000001_00001_00100_0000000000000000;            //1 1 4 000 lw
32'd1 : instruction <= 32'b000000_00000_00001_00010_00000_000000;        //0 0 1 2 0 0 add
32'd2 : instruction <= 32'b000001_00010_00101_0000000000000000;            //1 2 5 000 lw
32'd3 : instruction <= 32'b000000_00000_00010_00011_00000_000000;        //0 0 2 3 0 0 add
32'd4 : instruction <= 32'b000001_00011_00110_0000000000000000;            //1 3 6 000 lw
32'd5 : instruction <= 32'b000000_00011_00010_01101_00000_000001;        //0 3 2 13 0 13 sub

32'd6 : instruction <= 32'b000101_00110_01101_0000000000000001;            //5 6 13 6 beq
32'd7 : instruction <= 32'b000111_00000000000000000000000000;                //7 0 j  
32'd8 : instruction <= 32'b000101_00110_01101_0000000000000110;            //5 6 13 6 beq
32'd9 : instruction <= 32'b000000_00000_00111_01000_00000_000000;        //0 0 7 8 0 0 add
32'd10 : instruction <= 32'b000000_00000_01000_01001_00000_000000;        //0 0 8 9 0 0 add
32'd11 : instruction <= 32'b000000_00000_01001_01010_00000_000000;        //0 0 9 10 0 0 add
32'd12 : instruction <= 32'b000000_00000_01010_01011_00000_000000;        //0 0 10 11 0 0 add

32'd13 : instruction <= 32'b000101_00110_01101_0000000000000110;            //5 6 13 6 beq
32'd14 : instruction <= 32'b000101_00110_00010_0000000000000111;            //5 6 2 7 beq
32'd15 : instruction <= 32'b000101_00110_00011_0000000000001000;            //5 6 3 8 beq
32'd16 : instruction <= 32'b000101_00110_00111_0000000000001001;            //5 6 7 9 beq
32'd17 : instruction <= 32'b000101_00110_01000_0000000000001010;            //5 6 8 10 beq
32'd18 : instruction <= 32'b000101_00110_01001_0000000000001010;            //5 6 9 10 beq
32'd19 : instruction <= 32'b000101_00110_01010_0000000000001010;            //5 6 10 10 beq

32'd20 : instruction <= 32'b000000_00100_00101_01100_00000_000000;        //0 4 5 12 0 0 add
32'd21 : instruction <= 32'b000111_00000000000000000000011110;          //7 30 j
32'd22 : instruction <= 32'b000000_00100_00101_01100_00000_000001;        //0 4 5 12 0 1 sub
32'd23 : instruction <= 32'b000111_00000000000000000000011110;    x      //7 30 j
32'd24 : instruction <= 32'b000000_00100_00101_01100_00000_000010;        //0 4 5 12 0 2 and
32'd25 : instruction <= 32'b000111_00000000000000000000011110;          //7 30 j
32'd26 : instruction <= 32'b000000_00100_00101_01100_00000_000011;        //0 4 5 12 0 3 or
32'd27 : instruction <= 32'b000111_00000000000000000000011110;          //7 30 j
32'd28 : instruction <= 32'b000000_00100_00101_01100_00000_000100;        //0 4 5 12 0 4 nor
32'd29 : instruction <= 32'b000111_00000000000000000000011110;          //7 30 j

32'd30 : instruction <= 32'b000010_00000_01100_0000000000000000;            //2 0 13 000 sw

32'd31 : instruction <= 32'b000111_00000000000000000000000000;                //7 0 j  */

或者.coe文件

memory_initialization_radix = 2 ;
memory_initialization_vector =
10001000001000100000000000000010,
00010100001000100000000000000010,
00001000000000000000000000000000,
10001000001000110000000000000000,
00010100011000100000000000000010,
10101100001001000000000100000010,
00001000000000000000000000000000,
10101100001001010000000100000010,

00001000000000000000000000000000,

最终烧录验证就实现了用CPU跑一个小程序了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593179
收藏 人收藏

    评论

    相关推荐

    编写第一个QT程序

    学习一种编程语言或编程环境,通常会先编写一个“Hello World”程序。我们也用 Qt Creator 编写一个“Hello World”程序,以初步了解 Qt Creator 设
    发表于 11-21 10:41 733次阅读

    用条件赋值语句编写选一的VHDL程序

    用条件赋值语句编写选一的VHDL程序
    发表于 06-23 15:28

    cpu自制入门 原码

    CPU自制入门 配套原码
    发表于 11-03 09:39

    编写无错C程序秘诀

    本教程是关于C程序编写技巧,有利于提高对C程序的掌握程度。
    发表于 11-09 18:33 0次下载

    VB上位机程序编写

    VB上位机程序编写
    发表于 02-07 16:15 61次下载

    单片机的程序编写

    MCU的程序编写与PC下的程序编写存在很大的区别,虽然现在基于C的MCU开发工具越来越流行,但对于一个高效的程序代码和喜欢使用汇编的设计
    的头像 发表于 08-12 09:57 4049次阅读

    单片机程序如何编写

    设计编写单片机程序是一个渐进的过程不可一蹴而就,毕竟单片机程序是与硬件有密切关系的,我们一般称为单片机程序叫底层硬件驱动程序
    的头像 发表于 02-12 14:38 3.7w次阅读
    单片机<b class='flag-5'>程序</b>如何<b class='flag-5'>编写</b>

    编写PLC程序的步骤是怎么样的

    在了解了程序结构和编程方法的基础上,就要实际地编写PLC程序了。编写PLC 程序编写其他计算机
    发表于 09-11 16:12 22次下载
    <b class='flag-5'>编写</b>PLC<b class='flag-5'>程序</b>的步骤是怎么样的

    分享用Labview自制评分程序教程

    分享用Labview自制评分程序教程。
    发表于 04-11 15:02 0次下载

    Verilog程序编写规范

    在实际工作中,许多公司对Verilog程序编写规范都有要求。在公司内部统一Verilog程序编写规范不仅可以增强程序的可读性、可移植性,而且
    的头像 发表于 09-15 09:35 3510次阅读

    PLC对一键启停不同方式的程序编写

    ​​对于刚入门的PLC新手来说,在没有理解PLC CPU的扫描工作原理时对于行内偶尔提到的一键启停程序编写总会有一定的难度。今天和大家分享200系列PLC对一键启停不同方式的程序
    发表于 04-18 11:42 509次阅读

    PLC编写程序编写的是什么?

    对于PLC程序编写,一个好的plc程序一般都具有程序的具有正确性、可靠性、方便性、简洁性和可读性就是很好的程序!
    的头像 发表于 05-10 17:38 1349次阅读
    PLC<b class='flag-5'>编写程序</b><b class='flag-5'>编写</b>的是什么?

    用中文编写的博途SCL程序

    师妹: 师兄,我昨天貌似看到你在玩扫雷游戏?这玩的是游戏还是怀旧青春呀? 布道师: 这你就不懂了吧~这是网路上某位大神用中文写的博途程序哦! 师妹: 用博途做的小游戏我页看过几个,这还能全中文编写
    的头像 发表于 05-29 09:31 668次阅读
    用中文<b class='flag-5'>编写</b>的博途SCL<b class='flag-5'>程序</b>

    大神手工自制CPU的过程

    为了深入理解这个问题,大神耗时整整半年,“逐点”焊接,自制了一个CPU,杰作如下图所示。
    的头像 发表于 09-27 09:41 589次阅读
    大神手工<b class='flag-5'>自制</b><b class='flag-5'>CPU</b>的过程

    多种一键启停的程序编写方式你会几种?

    对于刚入门的PLC新手来说,在没有理解PLC CPU的扫描工作原理时对于行内偶尔提到的一键启停程序编写总会有一定的难度!
    的头像 发表于 12-27 11:32 368次阅读
    多种一键启停的<b class='flag-5'>程序</b><b class='flag-5'>编写</b>方式你会几种?