功能自己设计一个FPGA CPU,基于FPGA的极简CPU设计,运行基础微处理器。
介绍:FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
主函数 main.c
功能,运行调用函数接口
#include "basic.h"
#include "stdlib.h" //调用basic,stdlib两个功能库
int main(void)
{
system("/bin/stty raw");
startBasic();
system("/bin/stty cooked");
//调用bin文件夹stty raw 和 cooked文件
return 0;
}
C语言知识点
system函数的用法
system()在头文件stdlib.h中
system()是C语言中为了调用windows系统命令来设置。
system(“color Xx”);//第一个大叉用来控制背景色,第二个用来控制字体色
system(“cls”);//清屏,要搭配#include<window.h>来实现。
system(“pause”);//暂停
system(“title 名字”);//设置窗口名
system(“time /T”);//显示当前时间
system(“data /T”);//显示当前日期
system(“start 地址”);//打开某程序
system(“mode 数字1,数字2”);//控制窗口的大小,数字1控制长,数字2控制高。
system(“mode con cols=数字1 lines=数字2”);//控制窗口的大小,数字1控制长,数字2控制高。
还有很多dos命令都可以通过system()函数在c语言中使用。
//C语言中.h文件和.c文件作用和区别
basic.h
basic.c
.h文件和.c文件作用
xx.h文件 .h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。
xx.c文件 .c文件一般放的是变量、数组、函数的具体定义
.c文件包含了程序的实现部分,其中包含了函数的实现和变量的定义等内容。.c文件是可以被编译成可执行文件的。
.h文件包含了程序的接口部分,其中包含了函数的声明和结构体的定义等内容。这些代码不是可执行代码,而是提供给其他模块使用的接口。其他模块可以导入这些头文件,并通过调用头文件中声明的函数和定义的结构体来与该模块进行交互。
因此,.c文件和.h文件是相互关联的。通常,每个.c文件都对应一个.h文件。
写嵌入式代码,步骤
先编写 led.h;
再编写 led.c;
在mian.c 或其他文件中导入 led.h 使用定义好的函数。
basic.h文件,定义接口和变量,确定功能函数
头文件定义宏,预编译
#ifndef __BASIC_H
#define __BASIC_H
void startBasic(void);
// test functions
void NEW(void);
int evalExpression(char *line,int offset);
#endif
宏定义#define #ifndef #endif
使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率。无参宏定义的一般形式为:#define 标识符 字符串
#ifndef 条件编译
样例,目的就是使得查找变量是否已经定义过
#ifndef x //先测试x是否被宏定义过
#define x
程序段1 //如果x没有被宏定义过,定义x,并编译程序段 1
#endif
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1
使用#ifndef可以避免下面这种错误:如果在h文件中定义了全局变量,一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错.
c语言中,void的意思是“无类型”,相应的“void *”为无类型指针,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明,其作用是对函数返回和参数的进行限定。
c语言中,void的意思是“无类型”,相应的“void *”为无类型指针,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明,其作用是对函数返回和参数的进行限定。
void最常见的用法,就是在函数中限定函数的参数和返回值的 void draw(void); 表明函数draw没有参数也没有返回值
数据类型+算法=程序
声明的函数和定义的结构体,作为.c文件的接口调用
void startBasic(void) 函数功能开启
void New(void) 新
int evalExpression(char *line, int offset);
计算line的字符串长度
指针1 输入一行字符,要求用自定义的函数void f(char *line)统计和输出字符串中数字字符、英文字符和其他字符的个数
basic.c文件
#include "basic.h"
#include "io.h"
#define True 1
#define False 0
#定义最大的int值
#define Nan 0x7FFFFFFF
// define the maximum int to be not a number(int)
// define the minimum int to be error
#define ERROR 0x80000000
#define NaL 0xFFFF
#define LINEBUFSIZE 64
#define PROGBUFSIZE 1024
#define INDEXBUFSIZE 64
#define STACKSIZE 32
//定义需要的常量值,LINEBUFSIZE PROGBUFSIZE INDEXBUFSIZE STACKSIZE
//最后在增加字符串'\0' 是字符串的结束符
//additional char for \0 in the end
//增加字符串从0到结束
//数据类型的定义很重要
char lineBuf[LINEBUFSIZE + 1];
int lineBufCnt = 0;
char progBuf[PROGBUFSIZE + 1];
int progBufCnt = 0;
//每行的行号|的偏移量line number | offset for each line
unsigned short indexBuf[INDEXBUFSIZE * 2];
int indexBufCnt = 0;
行号堆栈,用于循环和gotosub// line number stack, for loop and gotosub
unsigned short lineNumStack[STACKSIZE];
int lineNumSP = 0;
// variable A-Z
int variables[26]; //数组[]
一、整型(int、short、long、long long)
1、有符号整型
有符号整型的数据类型通常包括 int、short、long、long long 四种,因为是有符号类型,所以前面要加上 signed ,但是通常省略,也就是说在代码中直接打出 int 类型就代表是有符号类型的。
(1)int类型
数据类型大小是 4 字节,能表示的数值范围是
-2^(32-1) – 2^(32-1)-1 (即 -2147483648 ~ 2147483647)
打印类型是 %d ,使用格式为 int 名 = 值;
(2)short类型
数据类型大小是 2 字节,能表示的数值范围是
-2^(16-1) – 2(16-1) -1 (即 -32768 ~ 32767)
打印类型是 %hd ,使用格式为 short 名 = 值;
(3)long类型
数据类型大小是 4 字节,能表示的数值范围是
-2^(32-1) – 2^(32-1)-1 (即 -2147483648 ~ 2147483647)
打印类型是 %ld ,使用格式为 int 名 = 值;
(4)long long类型
数据类型大小是 8 字节,能表示的数值范围是
-2^(63) ~ 2^(63)-1 (这个数足够大了)
打印类型是 %lld ,使用格式为 long long 名 = 值;
2、无符号整型
无符号数用 unsigned 表示 ,只表示数据量,而没有方向(没有正负,且无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。
(1)unsigned int 类型
数据类型大小是 4 字节,能表示的数值范围是
0 – 2^(32)-1 (即 0~4294967295)
打印类型是 %u ,使用格式为 unsigned int 名 = 值;
(2)unsigned short 类型
数据类型大小是 2 字节,能表示的数值范围是
0 ~ 2^8 -1 (即 0~65535)
打印类型是 %hu ,使用格式为 unsigned short 名 = 值;
(3)unsigned long 类型
数据类型大小是 4 字节,能表示的数值范围是
0 – 2^(32)-1 (即 0~4294967295)
打印类型是 %lu ,使用格式为 unsigned long 名 = 值;
(4)unsigned long long 类型
数据类型大小是 8 字节,能表示的数值范围是
0~2^63-1
打印类型是 %llu ,使用格式为 unsigned long long 名 = 值;
二、 字符型(char)
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’ ')把字符括起来。字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
char 的格式匹配符(打印格式) 为:%c
数值表示范围是:
有符号: -2^(8-1) – 2(8-1) -1 (即 -128 ~ 127)
无符号: 0 ~ 2^8 -1 (即 0~255)
三、浮点型(float、double)
(1)单精度浮点型(float)
单精度浮点型的大小是 4 字节
float v1 = 4.345;
unsigned float v1 = 4.345; 无符号的 float 数据
格式匹配符是:%f , 默认保留 6 位小数。
(2)双精度浮点型(double)
双精度浮点型的大小为 8 字节
double v2 = 5.678;
unsigned double v2 = 5.678; 无符号的 double 数据
printf(“n = %08.3f\n”, n);
输出的含义为:显示8位数(包含小数点), 不足8位用0填充。并且保留3位小数。对第4位做四舍五入。
函数命名规范,英文准确表达功能,大写
功能函数 getNextOffset 获取下一阶段偏移
功能,对offset其实是ECU的擦除,元素偏移量 offset
可以动态地得到元素的大小,位置
输入,字符串 line地址,offset元素偏移量变量
输出,return 元素偏移+1,自增
功能实现,while函数循环
条件 当符合line[offset] 不等于 \0(结束值) 且 line[offset] 不等于 ''空字符
执行 循环体 offset变量自增,每次都会运行自增offset+1功能
int getNextOffset(char *line, int offset)
{
while (line[offset] != '\0' && line[offset] != ' ')
{
offset = offset + 1;
}
//返回下一个有效字符的位置或大于其大小的值
//return the position of next valid char or a
//value larger than the size
return offset + 1;
}
知识点:逻辑运算符
&& 逻辑与
|| 逻辑或
! 逻辑非
// return the updated offset of line返回更新后的行的偏移量
功能函数匹配CMD matchCMD CMD命令提示符
int matchCMD(const char *cmd, char *line, int offset)
{
int i = 0;
int j = offset;
while(cmd[i] != '\0')
{
//taking into account of end of line,
//since cmd[i] is not \0
if (cmd[i] != line[j])
{
return False;
}
i = i + 1;
j = j + 1;
}
if (line[j] == '\0' || line[j] == ' ')
{
// return the position of next valid char or
//a value larger than the size
return j + 1;
}
return False;
}
欢迎交流Q裙 697210764