简单设计 MIPS 单周期 CPU (7条指令)

明儿就是 Computer Organization and Design 的考试了,然而我复习不下去惹。
不如来写点东西

这次介绍的是单周期 CPU 的设计,使用的 ISA 是 MIPS 。关于详细信息:

Reference:
http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html

本次文章为 Computer Organization and Design 课程的实验2总结,同时也包括部分章节知识。本次实验的所有知识来自网络和书本 Computer Organization And Design MIPS Edition

今后还有 多周期 CPU流水线 CPU 的实验记录,欢迎持续关注。

目标:实现7条 Instruction

  • addu
  • subu
  • ori
  • lw
  • sw
  • beq
  • jal

在介绍指令之前,我们来了解一下 MIPS ISA (Instruction Set Architecture) 的格式。

MIPS ISA format

本次实验中,我们将指令简单分为三种类型

  • R-Type (Register type)
  • I-Type (Immediate type)
  • J-Type (Jump)

R-Type

  • [31:26] OP
  • [25:21] Rs
  • [20:16] Rt
  • [15:11] Rd
  • [10:6] shamt
  • [5:0] funct

I-Type

  • [31:26] OP
  • [25:21] Rs
  • [20:16] Rt
  • [15:0] Immediate

J-Type

  • [31:26] OP
  • [25:0] Address Offset

R-Type 指令用于处理从 Reg 中读取两个数的操作,I-Type 指令用于处理一个从 Reg 中读取,另一个为立即数(Immediate)的操作,J-Type 则用于处理跳转指令。

OP & funct

以下是这些指令的 OP 和 funct 表

Instr op funct desc
addu 6'b000000 6'b100001 add unsigned
subu 6'b000000 6'b100011 sub unsigned
ori 6'b001101 Immediate or immediate
lw 6'b100011 Immediate load word
sw 6'b101011 Immediate save word
beq 6'b000100 Immediate branch equal
jal 6'b000011 Immediate jump and link

不难看出,addu 和 subu 为 R-Type ,jal 为 J-Type ,其余指令则为 I-Type。

设计架构图

閱讀全文»

[Bot Framework Tutorial] [episode.1] 数据存储和对话

上期传送门 https://touko.moe/blog/0_environment_configuration_and_hello_world
Github 地址:https://github.com/HoshinoTouko/bot-framework-tutorial

State and Dialogs

Save state

概览

针对不同的用户或是同一个用户的不同对话场景,我们很多时候需要保存一些用户数据。例如用户的名字,用户交流时的上下文信息。Bot-Framework 被设计为"无状态"的,所以它可以非常自如地应对多重对话的情景。它提供了一个用于存储数据的容器,用来应对用户 (User) 、公共会话中 (Conversation) 、私有会话中 (privateConversation) 与对话中 (Dialog) 可能出现的需要进行数据存储的情况。

数据容器

在 Bot-Framework 中,bot 使用 session 对象提供以下四种数据容器。

Property Scoped Description
userData User 包括了在特定 Channel 针对特定用户存放的数据。这部分数据将会被长期保存。
privateConversationData Conversation 包括了在特定 Channel 、特定用户、特定会话中存放的数据。这部分数据仅针对特定用户有效,并且只会在该会话中保存。这部分数据将会在会话结束或者调用 endConversation 后被清除。
conversationData Conversation 类似 privateConversationData ,包括保存的时间、清除的条件。不同的是这部分数据将与所有用户共享。
dialogData Dialog 包括了仅当前对话保存的数据,每个对话仅维护一份各自的数据副本。当当前对话从"对话栈"中清除,该部分数据副本也被清空。

这四种属性分别对应四种数据容器。针对不同的应用场景,我们可以使用不同类型的容器来提高程序开发的效率。

数据容器样例

举例。

当用户表现出对体育新闻的喜好时,bot 可以将用户的喜好存储于userData中。在之后的对话中,bot 可以针对该喜好进行一些特定内容的推送和筛选。
当用户询问天气时,bot 可以将询问天气的行为记录在 PrivateConversationData 下。如果用户在之后的对话询问"明天呢?",bot 就可以明白用户询问的是明天的天气,而非明天的其他信息。

Dialogs

概览

Dialogs 是 Bot-Framework 的一个重要模块,它允许用户模块化地维护对话。bot 与用户的每次交流称作"会话",每次会话由多个对话组成,每次的对话又可以用"对话流"来进行构建。可以将会话理解为对话的父结构。理解对话与会话的关系和相互之间的作用,可以极大方便我们开发聊天机器人,提高聊天机器人的代码可读性和组织结构。

通过对话构建会话

Bot-Framework 使用会话作为使用者和 bot 之间的交流。会话由多个对话组成。会话由用户定义,是一个可以重复使用的模块。在这里,我们定义一个 askName 的对话模块作为示例。

样例代码

对话本体
bot.dialog('askName', [
    function (session) {
        builder.Prompts.text(session, '我想认识你,请问你叫什么名字?');
    },
    function (session, results) {
        session.userData.userName = results.response;
        session.endDialog(`你好呀,${session.userData.userName}!`);
    }
]);
根会话中的跳转指令
if (!session.userData.userName){
    session.beginDialog('askName');
    return;
}

閱讀全文»

[Bot Framework Tutorial] [episode.0] 环境配置与 Hello world

Overview

Bot-Framework 是微软推出的一个平台,这个平台将开发、测试、部署 bot 的一系列流程整合起来,极大地方便了开发者。bot 支持使用 Node.js 和 C# 进行开发,这个系列的文章将以 Node.js 平台下的 Bot-framework 开发作为主要介绍内容,目标是完成一个可以进行相对智能的人机交互任务的聊天机器人。

一些特性

Bot-Framework 支持多对话 (Dialogs),用户可以根据需求,定义每个对话的触发条件和对话流程。

Bot-Framework 支持自定义的卡片和按钮形式。用户可以自行制作卡片、表单、选项按钮等组件来丰富 bot 的外观。并且,bot 会自行根据所运行的平台,相对应地调整组件的外观。例如在 telegram 平台上,按钮组件就可以被非常完美地原生支持。

Bot-Framework 支持多数聊天工具和网页界面,用户可以根据需求进行选择。

关于认知服务

文章中将会使用微软的认知服务 (cognitive services) 作为主要的"智能"驱动平台,包括 LUIS(Language Understanding Intelligent Service) 服务,QnAMaker 服务,Custom Vision 服务等,提高 bot 对语言的识别能力和对交互的优化能力。有关微软认知服务的详细的信息请参照
https://azure.microsoft.com/en-us/services/cognitive-services/

环境配置

Node.js 环境

npm install --save botbuilder
npm install --save restify

Bot Framework Emulator

http://emulator.botframework.com/下载对应版本的本地模拟器

Hello world

編碼

首先,将依赖引入程序

// This loads bot-framework requires
const builder = require('botbuilder');
const restify = require('restify');

閱讀全文»

2017微軟學生夏令營&微軟編程之美小記

第一次來參加這類的活動,除了本校和微博上的某同學,剩下都是不熟悉的面孔。雖說顯得有點孤單,不過也是習慣了一個人出來闖蕩。在北京的這幾天收穫頗豐(各種意義上)。

另:這篇博文圖片蠻多的,注意流量。

來夏令營的起因

大一學年暑假開始的時候,俱樂部主席找到我,問我有沒有時間去微軟夏令營。當時沒怎麼考慮就答應了。其實蠻驚喜的,我只是一個剛大一入學的新生,就有去夏令營的機會。之後更沒想到的是,編程之美的項目進入了決賽。原本獨行的安排變成了六人同行,也是令我十分驚喜的。

編程之美

每一段有趣的經歷或許都有一個不恰當的開場。當時和cc做完國際軟件學院給的項目,認識了比我大兩屆的同名學長。一切的一切都像是安排好的齒輪一樣,漸漸旋轉起來。
現任WHUMSC主席想參加編程之美,找人組隊。我拉上了因為做項目熟悉起來的同名學長和在天行俱樂部認識的同齡妹子。初賽和複賽走的跌跌撞撞,每次都有沒希望的念頭,卻每次都收到了比賽通過的祝賀郵件。剛從令人焦頭爛額的期末考中走出來,便收到了微軟編程之美的決賽邀請信。
不過時間並不是那麼剛好,兩名學長在7月都忙著準備各種比賽,導致七月的時候我只能對著只寫過簡單粗略的AJAX的JavaScript束手無策。因為一直是用同步的思維寫代碼,遇上異步語言便有些狼狽。7月的時候僅僅把一些API封裝好,便沒有什麼別的進展。
好在八月后,和我同名的學長比賽回來了。跟著他寫了一段時間的JS,並且多看了些文檔,漸漸地寫JS也得心應手起來。

閱讀全文»

在Windows控制台下使用C語言實現俄羅斯方塊

在Windows的控制台下使用C語言實現俄羅斯方塊

這是CSAPP課程的作業,助教問了我情況之後就愉快的決定了
稍微思考了一下,因為是經典的遊戲程序,本身邏輯並不是很複雜,而且肯定也有很多類似的程序了。這裡僅僅提供自己的思路。

簡單思路

俄羅斯方塊本質上來講,是一個在二維地圖上進行操作的遊戲,自然我們需要一張二維圖來表示這個遊戲地圖。然而我們使用的是C語言。。。。好吧我們定義一個int二維數組的全局變量作為這張地圖的表示。

二維地圖也要遵守基本法,自然我們需要給這張圖上每個點做一個定義。當這個點為0的時候,表示這個地方沒有方塊。這個點為1的時候,表示這個點存在一個已經落地的方塊。當這個點大於1的時候,表示這是一個可以活動的點。至於這個可以活動的點具體數值代表什麼,我們之後討論。

閱讀全文»