嵌入式系统与结构 第 10 课 数码相机实例

47
1 嵌嵌嵌嵌 嵌嵌嵌 嵌 10 嵌 嵌嵌嵌嵌嵌嵌

description

嵌入式系统与结构 第 10 课 数码相机实例. 概述. 简单数码相机实现介绍 设计者的观点 需求说明 设计方案 4 种实现. Introduction. 几种技术相结合进行简单数码相机的设计 通用目的处理器 单目的处理器 定制 标准 存储器 接口设计. 简单数码相机功能 - 从用户观点. 捕获图像 以数字的形式保存图像 非胶片形式 在相机内保存多幅图像 图像的数量依赖每幅图像使用的位数和内存大小 可以把图像下载到 PC 数码相机的重要技术支持 片上系统的出现 Systems-on-a-chip 高容量的闪存存储器 - PowerPoint PPT Presentation

Transcript of 嵌入式系统与结构 第 10 课 数码相机实例

Page 1: 嵌入式系统与结构 第 10 课  数码相机实例

1

  嵌入式系统与结构

第 10课 数码相机实例

Page 2: 嵌入式系统与结构 第 10 课  数码相机实例

2

概述

简单数码相机实现介绍设计者的观点需求说明设计方案 4 种实现

Page 3: 嵌入式系统与结构 第 10 课  数码相机实例

3

几种技术相结合进行简单数码相机的设计 通用目的处理器 单目的处理器

定制 标准

存储器 接口设计

Introduction

Page 4: 嵌入式系统与结构 第 10 课  数码相机实例

4

简单数码相机功能 - 从用户观点

捕获图像以数字的形式保存图像

非胶片形式 在相机内保存多幅图像

图像的数量依赖每幅图像使用的位数和内存大小可以把图像下载到 PC数码相机的重要技术支持

片上系统的出现 Systems-on-a-chip 高容量的闪存存储器

本例采用一个非常简单的描述 实际相机会有更多的特性

可变尺寸图像,图像删除,图像放大与缩小等

Page 5: 嵌入式系统与结构 第 10 课  数码相机实例

5

设计者的观点需要完成两个主要任务 处理图像并在存储器种保存

当快门按下 : 捕获图像 通过电荷耦合器件 (CCD) 转化成数字格式 在内存种完成压缩和保存

上传图像到 PC 数码相机连接到 PC 用专用软件串行的传送图像

Page 6: 嵌入式系统与结构 第 10 课  数码相机实例

6

电荷耦合器件 (CCD)用来捕获图像的专用传感器许多单元的光敏硅固态器件

当暴露在光下,每个单元带电荷,被转换成 8bit 数值, 0 表示没有曝光 255表示最强的曝光.

几列单元被遮挡,作为对所有其它单元的零偏校正 .

电子机械快门使得 CCD 单元被曝光一个短时间段

电路获得命令后把单元放电,激活电子机械快门,读入每个单元的 8bit 值。这些数据通过并行总线接口读入。

Lens area

Pixel columns

Covered columns

Ele

ctro

nic

circ

uitr

y

Electro-mechanical

shutter

Pixel rows

Page 7: 嵌入式系统与结构 第 10 课  数码相机实例

7

零-偏差误差单元的制造误差会引起测量值比实际值偏高或偏低误差每一列相同,当每一行不同最左的几列被用于进行零偏差校正

123 157 142 127 131 102 99 235134 135 157 112 109 106 108 136135 144 159 108 112 118 109 126176 183 161 111 186 130 132 133137 149 154 126 185 146 131 132121 130 127 146 205 150 130 126117 151 160 181 250 161 134 125168 170 171 178 183 179 112 124

136 170 155 140 144 115 112 248 12 14145 146 168 123 120 117 119 147 12 10144 153 168 117 121 127 118 135 9 9176 183 161 111 186 130 132 133 0 0144 156 161 133 192 153 138 139 7 7122 131 128 147 206 151 131 127 2 0121 155 164 185 254 165 138 129 4 4173 175 176 183 188 184 117 129 5 5

Covered cells

Before zero-bias adjustment After zero-bias adjustment

-13-11-90-7-1-4-5

Zero-bias adjustment

Page 8: 嵌入式系统与结构 第 10 课  数码相机实例

8

压缩能够保存更多的图像图像象 PC 传送更快JPEG (Joint Photographic Experts Group)

数字图像压缩形式的最流行的标准 提供许多运算模式 本章采用模式使用离散余弦变换提供高压缩率 图像分成 8 x 8 的象素块 每个块执行 3 个运算步骤

DCT 变换 量化 Huffman 编码

Page 9: 嵌入式系统与结构 第 10 课  数码相机实例

9

DCT 步骤将原始的 8 x 8 block 转换到余弦频域

左上角表示图像的基本要素 右下角代表图像的细节

可以减小这些值的精度并保留可接受的图像质量

FDCT ( 前向 DCT) 公式 C(h) = if (h == 0) then 1/sqrt(2) else 1.0

辅助函数,主公式为 F(u,v) F(u,v) = ¼ x C(u) x C(v) Σx=0..7 Σy=0..7 Dxy x cos(π(2u + 1)u/16) x cos(π(2y + 1)v/

16) 给出了第 u行,第 v列的编码象素值 Dxy is是第 x行第 y列的原始象素值

IDCT (反向 DCT) 为得到原始数据块而做的一个方向过程(本例中不使用)

Page 10: 嵌入式系统与结构 第 10 课  数码相机实例

10

量化通过降低图像质量完成一个高压缩率 降低编码数据位精度

更少的位被编码 将所有值除 2 的指数倍

解量化是一个相反的过程

1150 39 -43 -10 26 -83 11 41-81 -3 115 -73 -6 -2 22 -514 -11 1 -42 26 -3 17 -382 -61 -13 -12 36 -23 -18 5

44 13 37 -4 10 -21 7 -836 -11 -9 -4 20 -28 -21 14

-19 -7 21 -6 3 3 12 -21-5 -13 -11 -17 -4 -1 7 -4

144 5 -5 -1 3 -10 1 5-10 0 14 -9 -1 0 3 -1

2 -1 0 -5 3 0 2 -50 -8 -2 -2 5 -3 -2 16 2 5 -1 1 -3 1 -15 -1 -1 -1 3 -4 -3 2

-2 -1 3 -1 0 0 2 -3-1 -2 -1 -2 -1 0 1 -1

After being decoded using DCT After quantization

每个单元同除 8

Page 11: 嵌入式系统与结构 第 10 课  数码相机实例

11

串行化 8 x 8 象素块 按照 Z 字形图形将这些数值转换成串行列表,然后再转成 Huffma

n 编码。

执行 Huffman 编码 最经常出现的象素值分配最短二进制码 更长的二进制码留给更少使用的象素值

串行数列中的每个象素转换成 Huffman 编码值 短的多的列表值,然后压缩

Huffman 编码

  

 

  

               

               

               

               

               

               

               

               

Page 12: 嵌入式系统与结构 第 10 课  数码相机实例

12

Huffman 编码举例计算象素出现的频率从低向上建立 Huffman 树

遍历树得到叶子节点的二进制编码Huffman 编码是可逆的 任何节点不会是另一

个节点的首部分 144

5 3 2

1 0 -2

-1

-10 -5 -3

-4 -8 -96141 1

2

1 1

2

1

22

4

3

5

4

65

9

5

10

5

115

14

6

17

8

181

5

29

35

64

1

-1 15x 0 8x-2 6x1 5x2 5x3 5x5 5x-3 4x-5 3x

-10 2x144 1x-9 1x-8 1x-4 1x6 1x

14 1x

-1 00

0 100

-2 110

1 010

2 1110

3 1010

5 0110

-3 11110

-5 10110

-10 01110

144 111111

-9 111110

-8 101111

-4 101110

6 011111

14 011110

Pixel frequencies

Huffman tree Huffman codes

Page 13: 嵌入式系统与结构 第 10 课  数码相机实例

13

保存步骤记录开始地址和图像大小 用链表数据结构来表示这些信息

保存图像的一种方案 若被保存的图像最大数目为 N:

为 N 个地址和 N 个图像尺寸变量保留存储器空间 用计数器来记录存储器下一个可用地址的位置 初始地址和图像尺寸变量设置成 0 设置全局内存地址为 N x 4

地址,图像尺寸变量占用 N x 4 bytes 第一个保存的图像从地址N x 4开始 全局存储器地址更新到 N x 4 + (compressed image size)

Memory 需求取决于N, 图像大小 , 编码得到的平均压缩比

Page 14: 嵌入式系统与结构 第 10 课  数码相机实例

14

上传到 PC

当连接到 PC 并且收到上传命令 从存储器中度图像 用 UART 串行发送 发送过程中

数据指针,图像尺寸变量和全局内存指针进行相应的改变

Page 15: 嵌入式系统与结构 第 10 课  数码相机实例

15

需求规范系统需求 – 系统应该干什么 非功能需求

设计指标约束 (e.g., “应不大于 0.001 watt”) 功能需求

系统行为 (e.g., “输出 X 应为输入 Y 乘以 2”) 开始的规范可以非常笼统,可以来自市场部门

E.g., 短文档描述低端数码相机的市场需求: 捕获并保存至少 50幅低分辨图像,并且能上传到 PC, 成本在 $100 左右,使用一个中等大小,成本低于 $25 的 IC 电池寿命越长越好 如果 6 个月内上市,则预期销售量为 200,000 如果 6 到 12 个月上市,预期销售量为 100,000 上市时间超过 12 个月,则销量很有限

Page 16: 嵌入式系统与结构 第 10 课  数码相机实例

16

非功能需求基于初始规范确定重要设计指标 Performance: 处理图像所需要的时间 Size: IC 基本逻辑门的数量 (2-input NAND gate) Power: 在处理图像时消耗的平均电能 Energy: 电池寿命 (power x time)约束性指标 值必须在某一门限值之下

最优化指标 为提高品质需要尽可能提高的指标指标可以同时是约束指标和最优化指标

Page 17: 嵌入式系统与结构 第 10 课  数码相机实例

17

非功能需求 (cont.)Performance

必须处理图像足够快才又用 1 sec 是一个合理的约束

超过 1s会觉得讨厌 远小于 1s则在低端市场没有必要

因此这时一个约束指标Size

必须使用 IC才能得到合理尺寸的相机 是约束性和最优化指标

约束可以是 200,000 门 , 但 IC越小越便宜Power

IC必须运行在某一温度之下 (风冷不实际 ) 是一个约束性指标(假设 200mW)

Energy 降低功耗或时间来降低能耗 优化指标 : 希望电池能持续时间越长越好

Page 18: 嵌入式系统与结构 第 10 课  数码相机实例

18

非正式的功能规范流程图将功能分成更简单的功能

每个功能可用文字详细描述

低质量图像采用分辨力 64 x 64

没有映射每一个功能块一定要对应不同的处理器,只是对功能进行分解

serial outpute.g.,

011010...

yes no

CCDinput

零偏置调整

DCT

Quantize

保存到内存

More 8×8

blocks?

串行传输

yes

no Done?

Page 19: 嵌入式系统与结构 第 10 课  数码相机实例

19

精确的功能规范将非正式规范细化成一个可执行的规范可采用 C/C++ code to 描述每个功能

称为系统级模型,原型 是第一个可实现模型

能提供系统运行的深入理解 Profiling can find computa

tionally intensive functions

能得到样本输出用于验证最终实现的正确性

image file

101011010110101010010101101...

CCD.C

CNTRL.C

UART.C

output file

1010101010101010101010101010...

CODEC.C

CCDPP.C

Executable model of digital camera

Page 20: 嵌入式系统与结构 第 10 课  数码相机实例

20

CCD moduleSimulates real CCD

CcdInitialize is passed name of image file

CcdCapture reads “image” from file

CcdPopPixel outputs pixels one at a time

char CcdPopPixel(void) { char pixel; pixel = buffer[rowIndex][colIndex]; if( ++colIndex == SZ_COL ) { colIndex = 0; if( ++rowIndex == SZ_ROW ) { colIndex = -1; rowIndex = -1; } } return pixel;}

#include <stdio.h>

#define SZ_ROW 64

#define SZ_COL (64 + 2)

static FILE *imageFileHandle;

static char buffer[SZ_ROW][SZ_COL];

static unsigned rowIndex, colIndex;

void CcdInitialize(const char *imageFileName) {

imageFileHandle = fopen(imageFileName, "r");

rowIndex = -1;

colIndex = -1;

}

void CcdCapture(void) {

int pixel;

rewind(imageFileHandle);

for(rowIndex=0; rowIndex<SZ_ROW; rowIndex++) {

for(colIndex=0; colIndex<SZ_COL; colIndex++) {

if( fscanf(imageFileHandle, "%i", &pixel) == 1 ) {

buffer[rowIndex][colIndex] = (char)pixel;

}

}

}

rowIndex = 0;

colIndex = 0;

}

Page 21: 嵌入式系统与结构 第 10 课  数码相机实例

21

CCDPP (CCD PreProcessing) module完成 zero-bias 调整CcdppCapture 调用 CcdCapture and CcdPopPixel 获得图像读入每一行后进行 zero-bias adjustment

#define SZ_ROW 64

#define SZ_COL 64

static char buffer[SZ_ROW][SZ_COL];

static unsigned rowIndex, colIndex;

void CcdppInitialize() {

rowIndex = -1;

colIndex = -1;

}

void CcdppCapture(void) {

char bias;

CcdCapture();

for(rowIndex=0; rowIndex<SZ_ROW; rowIndex++) {

for(colIndex=0; colIndex<SZ_COL; colIndex++) {

buffer[rowIndex][colIndex] = CcdPopPixel();

}

bias = (CcdPopPixel() + CcdPopPixel()) / 2;

for(colIndex=0; colIndex<SZ_COL; colIndex++) {

buffer[rowIndex][colIndex] -= bias;

}

}

rowIndex = 0;

colIndex = 0;

}

char CcdppPopPixel(void) {

char pixel;

pixel = buffer[rowIndex][colIndex];

if( ++colIndex == SZ_COL ) {

colIndex = 0;

if( ++rowIndex == SZ_ROW ) {

colIndex = -1;

rowIndex = -1;

}

}

return pixel;

}

Page 22: 嵌入式系统与结构 第 10 课  数码相机实例

22

UART module实际完成了一半功能的 UART

Only transmits, does not receive

UartInitialize 传送一个要输出的文件名

UartSend 一次发送一个字节

#include <stdio.h>static FILE *outputFileHandle;void UartInitialize(const char *outputFileName) { outputFileHandle = fopen(outputFileName, "w");}void UartSend(char d) { fprintf(outputFileHandle, "%i\n", (int)d);}

Page 23: 嵌入式系统与结构 第 10 课  数码相机实例

23

CODEC module建模 FDCT 编码ibuffer holds original 8 x 8 blockobuffer holds encoded 8 x 8 blockCodecPushPixel 被调用 64 times 用初始块填满 ibufferCodecDoFdct 调用 1次转换 8 x 8 block

CodecPopPixel 调用 64 次从 obuffer 得到象素

static short ibuffer[8][8], obuffer[8][8], idx;

void CodecInitialize(void) { idx = 0; }

void CodecDoFdct(void) {

int x, y;

for(x=0; x<8; x++) {

for(y=0; y<8; y++)

obuffer[x][y] = FDCT(x, y, ibuffer);

}

idx = 0;

}

void CodecPushPixel(short p) {

if( idx == 64 ) idx = 0;

ibuffer[idx / 8][idx % 8] = p; idx++;

}

short CodecPopPixel(void) {

short p;

if( idx == 64 ) idx = 0;

p = obuffer[idx / 8][idx % 8]; idx++;

return p;

}

Page 24: 嵌入式系统与结构 第 10 课  数码相机实例

24

CODEC (cont.)实现 FDCT 的公式

C(h) = if (h == 0) then 1/sqrt(2) else 1.0F(u,v) = ¼ x C(u) x C(v) Σx=0..7 Σy=0..7 Dxy x

cos(π(2u + 1)u/16) x cos(π(2y + 1)v/16)仅 64 个可能输入值到 COS, 因此可使用一个表来提高性能

Floating-point values multiplied by 32,678 and rounded to nearest integer

32,678 chosen in order to store each value in 2 bytes of memory

Fixed-point representation explained more later

static const short COS_TABLE[8][8] = {

{ 32768, 32138, 30273, 27245, 23170, 18204, 12539, 6392 },

{ 32768, 27245, 12539, -6392, -23170, -32138, -30273, -18204 },

{ 32768, 18204, -12539, -32138, -23170, 6392, 30273, 27245 },

{ 32768, 6392, -30273, -18204, 23170, 27245, -12539, -32138 },

{ 32768, -6392, -30273, 18204, 23170, -27245, -12539, 32138 },

{ 32768, -18204, -12539, 32138, -23170, -6392, 30273, -27245 },

{ 32768, -27245, 12539, 6392, -23170, 32138, -30273, 18204 },

{ 32768, -32138, 30273, -27245, 23170, -18204, 12539, -6392 }

};

static int FDCT(int u, int v, short img[8][8]) {

double s[8], r = 0; int x;

for(x=0; x<8; x++) {

s[x] = img[x][0] * COS(0, v) + img[x][1] * COS(1, v) +

img[x][2] * COS(2, v) + img[x][3] * COS(3, v) +

img[x][4] * COS(4, v) + img[x][5] * COS(5, v) +

img[x][6] * COS(6, v) + img[x][7] * COS(7, v);

}

for(x=0; x<8; x++) r += s[x] * COS(x, u);

return (short)(r * .25 * C(u) * C(v));

}

static short ONE_OVER_SQRT_TWO = 23170;

static double COS(int xy, int uv) {

return COS_TABLE[xy][uv] / 32768.0;

}

static double C(int h) {

return h ? 1.0 : ONE_OVER_SQRT_TWO / 32768.0;

}

Page 25: 嵌入式系统与结构 第 10 课  数码相机实例

25

CNTRL (controller) module系统核心CntrlInitialize 与其它模块一致CntrlCaptureImage 利用 CCDPP 模块输入图像并放置到缓冲区 CntrlCompressImage 将 64 x 64 缓冲分成 8 x 8 块并调用 CODEC模块对每个块执行 FDCT

同时对每个块进行量化CntrlSendImage 用 UART模块发送编码图像

void CntrlSendImage(void) { for(i=0; i<SZ_ROW; i++) for(j=0; j<SZ_COL; j++) { temp = buffer[i][j]; UartSend(((char*)&temp)[0]); /* send upper byte */ UartSend(((char*)&temp)[1]); /* send lower byte */ } } }

#define SZ_ROW 64

#define SZ_COL 64

#define NUM_ROW_BLOCKS (SZ_ROW / 8)

#define NUM_COL_BLOCKS (SZ_COL / 8)

static short buffer[SZ_ROW][SZ_COL], i, j, k, l, temp;

void CntrlInitialize(void) {}

void CntrlCaptureImage(void) {

CcdppCapture();

for(i=0; i<SZ_ROW; i++)

for(j=0; j<SZ_COL; j++)

buffer[i][j] = CcdppPopPixel();

}

void CntrlCompressImage(void) {

for(i=0; i<NUM_ROW_BLOCKS; i++)

for(j=0; j<NUM_COL_BLOCKS; j++) {

for(k=0; k<8; k++)

for(l=0; l<8; l++)

CodecPushPixel(

(char)buffer[i * 8 + k][j * 8 + l]);

CodecDoFdct();/* part 1 - FDCT */

for(k=0; k<8; k++)

for(l=0; l<8; l++) {

buffer[i * 8 + k][j * 8 + l] = CodecPopPixel();

/* part 2 - quantization */

buffer[i*8+k][j*8+l] >>= 6;

}

}

}

Page 26: 嵌入式系统与结构 第 10 课  数码相机实例

26

将模块放到一起Main 初始化所有的模块 , 然后使用 CNTRL 模块进行捕获,压缩和发送一个图像这个系统级模型能够用于大量的实验,

在这里进行 Bugs 的纠正要比在后期模型进行纠正要容易的多

int main(int argc, char *argv[]) { char *uartOutputFileName = argc > 1 ? argv[1] : "uart_out.txt"; char *imageFileName = argc > 2 ? argv[2] : "image.txt"; /* initialize the modules */ UartInitialize(uartOutputFileName); CcdInitialize(imageFileName); CcdppInitialize(); CodecInitialize(); CntrlInitialize(); /* simulate functionality */ CntrlCaptureImage(); CntrlCompressImage(); CntrlSendImage();}

Page 27: 嵌入式系统与结构 第 10 课  数码相机实例

27

设计过程决定系统的结构

处理器 单目的与通用目的处理器的某一种结合

存储器,总线的选用映射功能到这些结构上

多个功能到一个处理器上 一个功能到一个或多个处理器

实现 一种特定的结构和映射 解决方案空间是所有实现的集合

设计开始点 低端通用处理器连接到一个

全部功能映射到软件,在一个处理器上运行 一般能满足功耗,尺寸,上市时间的约束 如果性能约束不能满足,后续实现能够:

利用单目的处理器设计时间约束严格的功能 重写功能规范

Page 28: 嵌入式系统与结构 第 10 课  数码相机实例

28

实现 1: 只使用微控制器采用 Intel 8051 microcontroller总的 IC 成本包括NRE大约 $5功耗远低于 200 mW上市时间大约 3 months但每秒处理一幅图像不可能

时钟 12 MHz, 每条指令 12 cycles 每秒钟执行 1百万指令

CcdppCapture 有嵌套循环进行 4096 (64 x 64) 次遍历 每次遍历大约 ~100 汇编指令 每幅图像 409,000 (4096 x 100) 指令 一半的预算用于读图像

加上计算密集型的 DCT and Huffman encoding运算将大大超出预算

Page 29: 嵌入式系统与结构 第 10 课  数码相机实例

29

实现 2: 微控制器与 CCDPP

CCDPP 功能利用单用途处理器实现 改进性能– 更少的微控制器周期 增加了 NRE 成本和上市时间 易实现

简单的数据通道 控制器很少的状态

简单的 UART易于用单用途处理器实现利用 EEPROM 用于程序存储器, RAM用于数据存储器

8051

UART CCDPP

RAMEEPROM

SOC

Page 30: 嵌入式系统与结构 第 10 课  数码相机实例

30

微控制器Intel 8051 可综合版本能够获得

VHDL编写 获得 RTL 级代码 register tran

sfer level (RTL)从 ROM 取指令译码ALU 执行算术运算

源和目的寄存器放在 RAM中通过外部存储器总线,用特殊的数据移动指令从外部存储器输入和存储数据ROM有特殊程序产生,可以读取 C链接程序的输出,以产生ROM的 VHDL 描述

To External Memory Bus

Controller

4K ROM

128RAM

Instruction Decoder

ALU

Block diagram of Intel 8051 processor core

Page 31: 嵌入式系统与结构 第 10 课  数码相机实例

31

UARTUART 处于空闲状态,直到被唤醒

当 8051 用 UART’s 使能寄存器作为目标地址执行存储指令时, UART 被唤醒

内存映射的通信在 8051 和全部单用途处理器之间进行

内存地址空间低 8-bits地址分给 RAM 内存地址空间高 8-bits 分给内存映射的 I/O设备

起始状态 Start 发送 0 表示数据字节发送开始,然后进入 Data 状态Data状态串行发送 8 bits ,然后迁移到 Stop状态Stop state 发送 1 表示发送结束,然后回到 idle mode

invoked

I = 8

I < 8

Idle:I = 0

Start: Transmit

LOW

Data: Transmit

data(I), then I++

Stop: Transmit

HIGH

FSMD description of UART

Page 32: 嵌入式系统与结构 第 10 课  数码相机实例

32

CCDPP零偏置操作的硬件实现与外部的 CCD 芯片交互内部缓冲区B, 内存映射到 8051变量 R, C 缓冲行,列索引GetRow 状态从 CCD 读一行到 B

66 bytes: 64 pixels + 2 blacked-out pixelsComputeBias 状态计算行、列的偏移,并保存在变量 BiasFixBias 状态遍历相同行,从每个单元减掉 BiasNextRow 迁移到 GetRow 并重复,当 64 行完成后转到 Idle state

C = 64

C < 64

R = 64 C = 66

invoked

R < 64

C < 66

Idle:R=0C=0

GetRow:B[R][C]=Pxl

C=C+1 

ComputeBias:Bias=(B[R][11] +

B[R][10]) / 2C=0

NextRow:R++C=0

FixBias:B[R][C]=B[R][C]-Bias

 

FSMD description of CCDPP

Page 33: 嵌入式系统与结构 第 10 课  数码相机实例

33

连接 SOC 组件内存映射

所有的单目的处理器核RAM都连接到 8051的 内存总线读

处理器在 16 位地址总线上放置地址; 确保 1个时钟周期的读控制信号; 1个时钟后从 8bit 数据总线上读数据 外部设备探测到读控制信号 检查地址 将被请求数据在数据总线上保持 1个时钟;写

处理器在地址和数据总线上放置地址和数据; 1个时钟周期的写控制信号 外部设备探测到写控制信号 检查地址总线 从数据总线上读入并保存数据。

Page 34: 嵌入式系统与结构 第 10 课  数码相机实例

34

软件的修改系统级模型提供核心代码 System-level model provides majority of code

模块层次,程序名字和主程序不需要改变UART 和 CCDPP 模块的代码要进行重新设计

用内存赋值来代替 xdata 用来在外部内存总线上载入或保存变量 _at_ 确定内存地址(端口地址) 处理器发送字节到 U_TX_REG 将会调用 UART 模块 U_STAT_REG 用来指示 UART 已准备好接收下一字节

UART 会比处理器慢很多 类似的修改 CCDPP 代码其它的模块不该变。

static unsigned char xdata U_TX_REG _at_ 65535;static unsigned char xdata U_STAT_REG _at_ 65534;void UARTInitialize(void) {}void UARTSend(unsigned char d) { while( U_STAT_REG == 1 ) { /* busy wait */ } U_TX_REG = d;}

Rewritten UART module#include <stdio.h>static FILE *outputFileHandle;void UartInitialize(const char *outputFileName) { outputFileHandle = fopen(outputFileName, "w");}void UartSend(char d) { fprintf(outputFileHandle, "%i\n", (int)d);}

Original code from system-level model

Page 35: 嵌入式系统与结构 第 10 课  数码相机实例

35

分析Entire SOC tested on VHDL simulator

Interprets VHDL descriptions and functionally simulates execution of system

Recall program code translated to VHDL description of ROM

Tests for correct functionality Measures clock cycles to process

one image (performance)

Gate-level description obtained through synthesis

Synthesis tool like compiler for SPPs Simulate gate-level models to

obtain data for power analysis Number of times gates switch from 1

to 0 or 0 to 1 Count number of gates for chip area

Power

VHDL simulator

VHDL VHDL VHDL

Execution time

Synthesis tool

gates gates gates

Sum gates

Gate level simulator

Power equation

Chip area

Obtaining design metrics of interest

Page 36: 嵌入式系统与结构 第 10 课  数码相机实例

36

实现 2: 微控制器和 CCDPP

实现 2 的分析 一幅图像的总执行时间 :

9.1 seconds 功耗 :

0.033 watt 能耗 :

0.30 joule (9.1 s x 0.033 watt) 总芯片面积 :

98,000 gates

Page 37: 嵌入式系统与结构 第 10 课  数码相机实例

37

实现 3: 微控制器和 CCDPP/Fixed-Point DCT

9.1 秒仍然不能满足1秒的性能约束DCT 操作时间作为主要的改进候选 实现 2 的执行过程显示微控制器的执行 DCT操作

的时间太长; 考虑设计专用硬件完成 DCT操作

更加复杂,需要更多的设计努力 同时通过修改行为来加速 DCT 功能。

Page 38: 嵌入式系统与结构 第 10 课  数码相机实例

38

DCT 浮点运算的代价浮点运算代价 每个象素变换中, DCT 使用 ~260 浮点操作 每个图像有 4096 (64 x 64) pixels 每个图像约执行 1 million 浮点操作 Intel 8051不支持浮点

编译器必须仿真浮点运算 每个浮点运算都要产生乘加操作 使用几十个整数操作

因此 , 每个图像 > 10 million 整数操作 增加了代码尺寸浮点算法可以进行改进

Page 39: 嵌入式系统与结构 第 10 课  数码相机实例

39

固定点算法Integer used to represent a real number

Constant number of integer’s bits represents fractional portion of real number

More bits, more accurate the representation Remaining bits represent portion of real number before decimal point

Translating a real constant to a fixed-point representation Multiply real value by 2 ^ (# of bits used for fractional part) Round to nearest integer E.g., represent 3.14 as 8-bit integer with 4 bits for fraction

2^4 = 16 3.14 x 16 = 50.24 ≈ 50 = 00110010 16 (2^4) possible values for fraction, each represents 0.0625 (1/16) Last 4 bits (0010) = 2 2 x 0.0625 = 0.125 3(0011) + 0.125 = 3.125 ≈ 3.14 (more bits for fraction would increase

accuracy)

Page 40: 嵌入式系统与结构 第 10 课  数码相机实例

40

固定点算法操作Addition

Simply add integer representations E.g., 3.14 + 2.71 = 5.85

3.14 → 50 = 00110010 2.71 → 43 = 00101011 50 + 43 = 93 = 01011101 5(0101) + 13(1101) x 0.0625 = 5.8125 ≈ 5.85

Multiply Multiply integer representations Shift result right by # of bits in fractional part E.g., 3.14 * 2.71 = 8.5094

50 * 43 = 2150 = 100001100110 >> 4 = 10000110 8(1000) + 6(0110) x 0.0625 = 8.375 ≈ 8.5094

Range of real values used limited by bit widths of possible resulting values

Page 41: 嵌入式系统与结构 第 10 课  数码相机实例

41

实现 CODEC 的固定点运算COS_TABLE gives 8-bit fixed-point representation of cosine values

6 bits used for fractional portion

Result of multiplications shifted right by 6

void CodecDoFdct(void) { unsigned short x, y; for(x=0; x<8; x++) for(y=0; y<8; y++) outBuffer[x][y] = F(x, y, inBuffer); idx = 0;}

static const char code COS_TABLE[8][8] = {

{ 64, 62, 59, 53, 45, 35, 24, 12 },

{ 64, 53, 24, -12, -45, -62, -59, -35 },

{ 64, 35, -24, -62, -45, 12, 59, 53 },

{ 64, 12, -59, -35, 45, 53, -24, -62 },

{ 64, -12, -59, 35, 45, -53, -24, 62 },

{ 64, -35, -24, 62, -45, -12, 59, -53 },

{ 64, -53, 24, 12, -45, 62, -59, 35 },

{ 64, -62, 59, -53, 45, -35, 24, -12 }

};

static const char ONE_OVER_SQRT_TWO = 5;

static short xdata inBuffer[8][8], outBuffer[8][8], idx;

void CodecInitialize(void) { idx = 0; }

static unsigned char C(int h) { return h ? 64 : ONE_OVER_SQRT_TWO;}

static int F(int u, int v, short img[8][8]) {

long s[8], r = 0;

unsigned char x, j;

for(x=0; x<8; x++) {

s[x] = 0;

for(j=0; j<8; j++)

s[x] += (img[x][j] * COS_TABLE[j][v] ) >> 6;

}

for(x=0; x<8; x++) r += (s[x] * COS_TABLE[x][u]) >> 6;

return (short)((((r * (((16*C(u)) >> 6) *C(v)) >> 6)) >> 6) >> 6);

}

void CodecPushPixel(short p) {

if( idx == 64 ) idx = 0;

inBuffer[idx / 8][idx % 8] = p << 6; idx++;

}

Page 42: 嵌入式系统与结构 第 10 课  数码相机实例

42

实现 3: 微控制器和 CCDPP/ 固定点 DCT

实现 3 的分析 使用类似实现 2中的分析技术 一幅图像的总执行时间 :

1.5 seconds 功耗 :

0.033 watt (same as 2) 能耗 :

0.050 joule (1.5 s x 0.033 watt) Battery life 6x longer!!

总芯片面积 : 90,000 gates 8,000 less gates (less memory needed for code)

Page 43: 嵌入式系统与结构 第 10 课  数码相机实例

43

实现 4: 微控制器和 CCDPP/DCT

性能还不够好;必须重新用硬件来实现 CODEC 单目的处理器执行 8 x 8 block 的 DCT运算

8051

UART CCDPP

RAMEEPROM

SOCCODEC

Page 44: 嵌入式系统与结构 第 10 课  数码相机实例

44

CODEC design4 个内存映射寄存器

C_DATAI_REG/C_DATAO_REG 用于 push/pop 8 x 8 block从 / 到 into and CODEC

C_CMND_REG 向 CODEC发送命令 写1 调用 CODEC

C_STAT_REG 指示 CODEC 已完成并准备下一块图像

用软件进行轮询直接将 C code 翻译成 HDL 硬件实现

使用固定点版本 软件中的 CODEC 模块响应的进行修改。

static unsigned char xdata C_STAT_REG _at_ 65527;static unsigned char xdata C_CMND_REG _at_ 65528;static unsigned char xdata C_DATAI_REG _at_ 65529;static unsigned char xdata C_DATAO_REG _at_ 65530;void CodecInitialize(void) {}void CodecPushPixel(short p) { C_DATAO_REG = (char)p; }short CodecPopPixel(void) { return ((C_DATAI_REG << 8) | C_DATAI_REG);}void CodecDoFdct(void) { C_CMND_REG = 1; while( C_STAT_REG == 1 ) { /* busy wait */ }}

Rewritten CODEC software

Page 45: 嵌入式系统与结构 第 10 课  数码相机实例

45

实现 4: 微控制器和 CCDPP/DCT实现 4 的分析 单幅图像总执行时间 :

0.099 seconds (well under 1 sec) 功耗 :

0.040 watt 能耗 :

0.00040 joule (0.099 s x 0.040 watt) Battery life 12x longer than previous implementation!!

总芯片面积 : 128,000 gates 比前面的实现有显著增加;

Page 46: 嵌入式系统与结构 第 10 课  数码相机实例

46

实现总结

Implementation 2 Implementation 3 Implementation 4 Performance (second) 9.1 1.5 0.099 Power (watt) 0.033 0.033 0.040 Size (gate) 98,000 90,000 128,000 Energy (joule) 0.30 0.050 0.0040

Page 47: 嵌入式系统与结构 第 10 课  数码相机实例

47

小结数码相机实例 规范说明用自然语言和可执行语言 设计特性:性能,功率和面积

几种实现方式 微控制器 : 太慢! 微控制器和协处理器:有改进,但还是慢; 固定点算法: 1.5s ,几乎能满足要求; 额外的压缩协处理器:足够快,但是设计难度大 软、硬件之间的权衡 – 本们课程的主要内容