ディジタル回路 第1回 ガイダンス、CMOSの基本回路

Similar documents
ディジタル回路 第1回 ガイダンス、CMOSの基本回路

2.5. Verilog 19 Z= X + Y - Z A+B LD ADD SUB ST (X<<1)+(Y<<1) X 1 2 LD SL ST 2 10

MIPSのマルチサイクル マイクロアーキテクチャ

VelilogHDL 回路を「言語」で記述する

Verilog HDL による回路設計記述

Microsoft PowerPoint - 01-VerilogSetup-2019.pptx

電卓の設計 1

Microsoft PowerPoint - vlsi4.ppt [互換モード]

Microsoft PowerPoint - Lec pptx

目次 1. はじめに 1 2. マルチALUプロセッサ MAP MAP の構成 MAP 命令セットアーキテクチャ 並列 連鎖判定のアルゴリズムについて 5 3. Booth 乗算のアルゴリズム 次 Booth アルゴリズム 次 Bo

2ALU 以下はデータ幅 4ビットの ALU の例 加算, 減算,AND,OR の4つの演算を実行する 実際のプロセッサの ALU は, もっと多種類の演算が可能 リスト 7-2 ALU の VHDL 記述 M use IEEE.STD_LOGIC_1164.ALL; 00 : 加算 use IEE

1: ITT-2 DDR2 1.8V,.V(F) Config. Mem. JTAG XCFPV048 LEDs SWs Clock (VariClock) DDR2 DDR2 DDR2 FPGA XC5VFX0T General-Purpose LEDs SWs XTAL (2.68kHz) MC

Microsoft PowerPoint - 01-VerilogSetup-2018.pptx

Łñ“’‘‚2004


プリント

DELPHINUS EQUULEUS 2019 NASA SLS FPGA ( ) DELPHINUS 2

計算機アーキテクチャ

Microsoft PowerPoint - Sol7 [Compatibility Mode]

Microsoft PowerPoint - NxLecture ppt [互換モード]

計算機アーキテクチャ

ソフトウェア基礎技術研修

ex05_2012.pptx

FPGAによる24時間時計回路


3 SIMPLE ver 3.2: SIMPLE (SIxteen-bit MicroProcessor for Laboratory Experiment) 1 16 SIMPLE SIMPLE 2 SIMPLE 2.1 SIMPLE (main memo

LSI LSI

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

ソフトウェア基礎技術研修

2016 3

PLDとFPGA

untitled

ディジタル電子回路 設計演習課題

デザインパフォーマンス向上のためのHDLコーディング法

Microsoft PowerPoint - 集積回路工学_ ppt[読み取り専用]

Design at a higher level

「FPGAを用いたプロセッサ検証システムの製作」

main.dvi


計数工学実験/システム情報工学実験第一 「ディジタル回路の基礎」

スライド 1

コンピュータ工学Ⅰ

卒業論文 巡回冗長検査 CRC32 のハード / ソフト最適分割の検討 氏名 : 伊藤大喜学籍番号 : 指導教員 : 山崎勝弘教授提出日 : 2009 年 2 月 19 日 立命館大学理工学部電子情報デザイン学科

回路 7 レジスタ ( 同期イネーブル及び非同期リセット付 ) 入力データを保持するのに用いる記憶素子 使用用途として, マイクロプロセッサ内部で演算や実行状態の保持に用いられる Fig4-2 のレジスタは, クロック信号の立ち上がり時かつ 信号が 1 のときに外部からの 1 ビットデータ R をレ

スライド 1


Microsoft PowerPoint - Chap4 [Compatibility Mode]

MIPSのマイクロアーキテクチャ

Microsoft Word - 実験4_FPGA実験2_2015

PowerPoint プレゼンテーション

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c

PowerPoint プレゼンテーション

Microsoft PowerPoint - FPGA

デジタル回路入門

- VHDL 演習 ( 組み合せ論理回路 ) 回路 半加算器 (half adder,fig.-) 全加算器を構成する要素である半加算器を作成する i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,LED, が, の出力とな

.,. 0. (MSB). =2, =1/2.,. MSB LSB, LSB MSB. MSB 0 LSB 0 0 P

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

PowerPoint プレゼンテーション

1, Verilog-HDL, Verilog-HDL Verilog-HDL,, FPGA,, HDL, 11, 1 (a) (b) (c) FPGA (d) 2 10,, Verilog-HDL, FPGA, 12,,,, html % netscape file://home/users11/

PowerPoint プレゼンテーション

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

WinCT-AD4212D オペレーションマニュアルVer.1.01

PowerPoint プレゼンテーション

エンティティ : インタフェースを定義 entity HLFDD is port (, : in std_logic ;, : out std_logic ) ; end HLFDD ; アーキテクチャ : エンティティの実現 architecture RH1 of HLFDD is <= xor

TF Series with Tio1608-D System Setup Guide

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

output2010本文.indd

Transcription:

POCO の 1 サイクルマイクロアーキテクチャ POCO は 作りながら学ぶコンピュータアーキテクチャ ( 倍風館 ) で使っている教育用の 16 ビット RISC である www.am.ics.keio.ac.jp/parthenon/pocobook/ も参照のこと

POCO の構成 1 + + ext func[2:0] 2:0 THB ADD 00 01 10 comsel com S A alu_y Y B alu_b 00 01 10 alu_bsel jmp_op jal_op jr_op 0 1 0 1 0 1 Zero? ext 10:0 7:0 10:8 7 rd imm 0 1 jal_op rf_a aadr cadr rf_csel rf_b rf_c 00 01 10 ext ext0 rwe badr PC 7:5 rs idatain ddatain iaddr ddataout daddr 命令メモリ データメモリ we

R 型命令一覧 NOP 00000------00000 MV rd,rs rd rs 00000dddsss00001 AND rd,rs rd rd AND rs 00000dddsss00010 OR rd,rs rd rd OR rs 00000dddsss00011 SL rd rd rd<<1 00000ddd---00100 SR rd rd rd>>1 00000ddd---00101 ADD rd,rs rd rd + rs 00000dddsss00110 SUB rd,rs rd rd - rs 00000dddsss00111 ST rd,(ra) (ra) rd 00000dddaaa01000 LD rd,(ra) rd (ra) 00000dddaaa01001 JR rd pc rd 00000ddd---01010

I 型命令一覧 LDI rd,#x rd X( 符号拡張 ) 01000dddXXXXXXXX LDIU rd,rs rd X( ゼロ拡張 ) 01001dddXXXXXXXX ADDI rd,#x rd rd+x( 符号拡張 ) 01100dddXXXXXXXX ADDIU rd,#x rd rd+x( ゼロ拡張 ) 01101dddXXXXXXXX LDHI rd,#x rd {X,0} 01010dddXXXXXXXX BEZ rd,x if(rd=0) pc pc+x+1 10000dddXXXXXXXX BNZ rd,x if(rd 0) pc pc+x+1 10001dddXXXXXXXX BPL rd,x if(rd>=0) pc pc+x+1 10010dddXXXXXXXX BMI rd,x if(rd<0) pc pc+x+1 10011dddXXXXXXXX

J 型命令一覧 JMP #X pc pc+x+1 10100XXXXXXXXXXX JAL #X pc pc+x+1, r7 pc+1 10101XXXXXXXXXXX

define 文 ( 基本サイズと ALU のコマンド ) `define DATA_W 16 `define SEL_W 3 `define REG 8 `define REG_W 3 `define OPCODE_W 5 `define IMM_W 8 `define DEPTH 65536 `define ALU_THA `SEL_W'b000 `define ALU_THB `SEL_W'b001 `define ALU_AND `SEL_W'b010 `define ALU_OR `SEL_W'b011 `define ALU_SL `SEL_W'b100 `define ALU_SR `SEL_W'b101 `define ALU_ADD `SEL_W'b110 `define ALU_SUB `SEL_W'b111 ALU のコマンドの割り当ては非常にいい加減に決めてあり これが ALU 命令の機械語のコードに対応している

`define DISABLE 1'b0 `define ENABLE_N 1'b0 `define DISABLE_N 1'b1 define 文の続き : 命令コードとファンクションコードの定義 `define OP_BEZ `OPCODE_W b10000 `define OP_BNZ `OPCODE_W'b10001 `define OP_BPL `OPCODE_W'b10010 `define OP_BMI `OPCODE_W'b10011 `define OP_JMP `OPCODE_W'b10100 `define OP_JAL `OPCODE_W'b10101 `define OP_LDI `OPCODE_W'b01000 `define OP_LDIU `OPCODE_W'b01001 `define OP_LDHI `OPCODE_W'b01010 `define OP_ADDI `OPCODE_W'b01100 `define OP_ADDIU `OPCODE_W'b01101 `define OP_REG `OPCODE_W'b00000 `define F_ST `OPCODE_W b01000 `define F_LD `OPCODE_W'b01001 `define F_JR `OPCODE_W'b01010 `define F_JALR `OPCODE_W'b11000 以下は I 型命令の定義 以下は R 型命令のファンクションの定義

ALU の記述 : これは典型的な条件付選択構文で例題にも使っている `include "def.h" module alu ( input [`DATA_W-1:0] a, b, input [`SEL_W-1:0] s, output [`DATA_W-1:0] y ); assign y = s==`alu_tha? a: s==`alu_thb? b: s==`alu_and? a & b: s==`alu_or? a b: s==`alu_sl? a << 1: s==`alu_sr? a >> 1: s==`alu_add? a + b: a - b ; endmodule

`include "def.h" module rfile ( input clk, input [`REG_W-1:0] aadr, badr, cadr, output [`DATA_W-1:0] a, b, input [`DATA_W-1:0] c, input we); reg [`DATA_W-1:0] r0, r1, r2, r3, r4, r5, r6, r7; assign a = aadr == 0? r0: aadr == 1? r1: aadr == 2? r2: aadr == 3? r3: aadr == 4? r4: aadr == 5? r5: aadr == 6? r6: r7; assign b = badr == 0? r0: badr == 1? r1: badr == 2? r2: always @(posedge clk) begin endmodule end badr == 3? r3: badr == 4? r4: badr == 5? r5: badr == 6? r6: r7; if(we) case(cadr) endcase rfile の記述 : レジスタは個別に定義しているが これは gtkwave でデバッグしやすくするためである 0: r0 <= c; 1: r1 <= c; 2: r2 <= c; 3: r3 <= c; 4: r4 <= c; 5: r5 <= c; 6: r6 <= c; default: r7 <= c; レジスタの読み出しは選択構文で書く 書きこみは always 文中なので case 文が使える

`include "def.h" module poco( input clk, rst_n, input [`DATA_W-1:0] idatain, input [`DATA_W-1:0] ddatain, output [`DATA_W-1:0] iaddr, daddr, output [`DATA_W-1:0] ddataout, output we); POCO 本体の記述 : 入出力と信号名定義 信号名称は 2 ページの図と一致しているので参照のこと reg [`DATA_W-1:0] pc; wire [`DATA_W-1:0] rf_a, rf_b, rf_c; wire [`DATA_W-1:0] alu_b, alu_y; wire [`OPCODE_W-1:0] opcode; wire [`OPCODE_W-1:0] func; wire [`REG_W-1:0] rs, rd, cadr; wire [`SEL_W-1:0] com; wire [`IMM_W-1:0] imm; wire rwe; 以下はデコード信号 wire st_op, bez_op, bnz_op, bmi_op, bpl_op, addi_op, alu_op; wire ldi_op, ldiu_op, ldhi_op, addiu_op, jmp_op, jal_op, jr_op, jalr_op;

// Decorder 命令のデコード assign st_op = (opcode == `OP_REG) & (func == `F_ST); assign ld_op = (opcode == `OP_REG) & (func == `F_LD); assign jr_op = (opcode == `OP_REG) & (func == `F_JR); assign jalr_op = (opcode == `OP_REG) & (func == `F_JALR); assign alu_op = (opcode == `OP_REG) & (func[4:3] == 2'b00); R 型命令 assign ldi_op = (opcode == `OP_LDI); assign ldiu_op = (opcode == `OP_LDIU); assign addi_op = (opcode == `OP_ADDI); assign addiu_op = (opcode == `OP_ADDIU); assign ldhi_op = (opcode == `OP_LDHI); assign bez_op = (opcode == `OP_BEZ); assign bnz_op = (opcode == `OP_BNZ); assign bpl_op = (opcode == `OP_BPL); assign bmi_op = (opcode == `OP_BMI); assign jmp_op = (opcode == `OP_JMP); assign jal_op = (opcode == `OP_JAL); I 型命令

出力信号の接続と ALU 周辺 assign iaddr = pc; assign daddr = rf_b; assign we = st_op 出力信号の接続 assign {opcode, rd, rs, func} = idatain; assign imm = idatain[`imm_w-1:0]; 読んできた命令の分解 assign alu_b = (addi_op ldi_op)? {{8{imm[7]}},imm} : (addiu_op ldiu_op)? {8'b0,imm} : (ldhi_op)? {imm, 8'b0} : rf_b; ALU の B 入力の選択 assign com = (addi_op addiu_op )? `ALU_ADD: ALU の com の選択 (ldi_op ldiu_op ldhi_op)? `ALU_THB: func[`sel_w-1];

レジスタファイル周辺 ALU とレジスタファイルの接続 レジスタの入力選択 assign rf_c = ld_op? ddatain : jal_op? pc+1 : alu_y; assign rwe = ld_op alu_op ldi_op ldiu_op addi_op addiu_op ldhi_op jal_op ; レジスタの書きこみ信号 assign cadr = jal_op? 3'b111 : rd; レジスタ C ポートの選択 alu alu_1(.a(rf_a),.b(alu_b),.s(com),.y(alu_y)); rfile rfile_1(.clk(clk),.a(rf_a),.aadr(rd),.b(rf_b),.badr(rs),.c(rf_c),.cadr(cadr),.we(rwe)); ALU の入出力を接続 レジスタの入出力を選択

PC の制御 always @(posedge clk or negedge rst_n) begin end if(!rst_n) pc <= 0; else if ((bez_op & rf_a == 16'b0 ) (bnz_op & rf_a!= 16'b0) pc <= pc +{{8{imm[7]}},imm}+1 ; else if (jmp_op jal_op) (bpl_op & ~rf_a[15]) (bmi_op & rf_a[15])) pc <= pc + {{5{idatain[10]}},idatain[10:0]}+1; else if(jr_op) pc <= rf_a; else pc <= pc+1; 非同期リセット 8 ビットの符号拡張で相対番地計算 11 ビットの符号拡張で相対番地計算 JR はレジスタ A ポートの値をそのまま使う 分岐でない場合はカウントアップ BEZ,BNZ,BPL,BMI の条件チェック endmodule module poco 終了