以8051为内核的单片机:FGPA实现单片机8051
以8051为内核的单片机:FGPA实现单片机8051MC8051 IP Core 顶层框架图如下图所示,内核IP与外设的连接关系,其中用虚线标识连接的表示数量是可选。顶层框架MC8051 Core IP简介功能特点目录结构
FPGA实现MC8051
开发环境
硬件:ALTERA Cyclone IV系列 EP4CE6F17C8 开发板
IED: Quartus (Quartus Prime 21.1) Lite Edition (免费)
内核IP:MC8051 Core IP V1.6
MC8051 Core IP简介
功能特点
- 采用完全同步设计
- 指令集和标准 8051 微控制器完全兼容
- 指令执行时间为 1~4 个时钟周期,执行性能优于标准 8051 微控制器 8 倍左右
- 用户可选择定时器/计数器、串行接口单元的数量
- 新增了特殊功能寄存器用于选择不同的定时器/计数器、串行接口单元
- 可选择是否使用乘法器(乘法指令 MUL)
- 可选择是否使用除法器(除法指令 DIV)
- 可选择是否使用十进制调整功能(十进制调整指令 DA)
- I/O 口不复用
- 内部带 256Bytes RAM
- 最多可扩展至 64Kbytes 的 ROM 和 64Kbytes 的 RAM
- 最多可扩展至 64Kbytes 的 ROM 和 64Kbytes 的 RAM
目录结构
顶层框架
MC8051 IP Core 顶层框架图如下图所示,内核IP与外设的连接关系,其中用虚线标识连接的表示数量是可选。
顶层信号列表
信号 |
描述 |
clk |
系统时钟. 只用时钟上升沿. |
reset |
异步复位所有触发器. |
all_t0_i |
定时器/计数器0 输入. |
all_t1_i |
定时器/计数器 1 输入. |
all_rxd_i |
串口数据接收. |
int0_i |
中断 0 输入. |
int1_i |
中断1 输入. |
p0_i |
P 0 输入. |
p1_i |
P 1 输入. |
p2_i |
P 2 输入. |
P3_i |
P 3 输入. |
all_rxdwr_o |
rxd 数据输出/输出方向控制 (高= 输出) . |
all_txd_o |
串口数据输出. |
all_rxd_o |
串口工作模式1数据输出. |
p0_o |
P 0 输出. |
p1_o |
P 1 输出. |
p2_o |
P 2 输出. |
p3_o |
P3 输出. |
VHDL设计文件结构
FPGA嵌入MC8051
建立Quartus工程
打开 Quartus (Quartus Prime 21.1) Lite Edition出现界面如下:
建立新的工程
建立名为mcu_8051的工程
选择器件
工程创建完毕
创建顶层文件
MC8051 ROM和RAM模块生成
ROM生成
在右侧导航栏输入ROM
选择生成路径和语言类型
设置 ROM 的信息,数据宽度 8bits,数据个数 4069,其余默认
取消 ROM 的输出寄存器,时钟使能信号及异步清零信号不用选
指定 ROM 的初始化数据文件也即单片机程序编译出来的*.hex 文件。对于 ROM 模块,是一定要指定初始化数据的,要不然向导就不能完成所以选择之前创建的那个空白hex文件mcu_8051.hex 文件。
选择需要生成的文件
点击Finish至此ROM创建完毕
MC8051 中 RAM 模块包括内部 RAM 和扩展 RAM,生成方法和 ROM 一般无二,下面简述一下参数设置
内部 RAM 的参数设置 数据宽度为 8bits,数据个数为 128;取消 RAM 的数据输出寄存器,同时选中时钟使能信号端
点击Finish至此RAM创建完毕
修改MC8051 Core IP源文件
将MC8051 Core IP源码文件复制到工程目录下,由于默认提供的源码中的顶层设计文件中的存储模块(ROM、RAM)是仿真时使用的, 现在要进行硬件测试,所以必须改成我们实际用到的 ROM、RAM 模块,在”./vhdl”目录下的 mc8051_p.vhd 文件,将原文件中 ROM、RAM 模块调用的代码修改:
component mcu_8051_ram
port (
clock : in std_logic;
data : in std_logic_vector(7 downto 0);
q : out std_logic_vector(7 downto 0);
address : in std_logic_vector(6 downto 0);
wren : in std_logic;
clken : in std_logic);
end component;
component mcu_8051_rom
port (
clock : in std_logic;
q : out std_logic_vector(7 downto 0);
address : in std_logic_vector(11 downto 0));
end component;
mc8051_top_struc.vhd 文件,新增标识有“--新增”语句。然后将原文件中 ROM、RAM 模块调用部分完成了源文件更新修改。
添加MC8051核IP到工程
选择非配置文件
创建pll锁相环模块
修改时钟,由于电路板上的有源晶振频率为 50MHz,所以输入频率设为 50MHz
一路默认知道第6页,选择c0输出频率为18MHz,时钟相移和占空比不改变
PLL生成完毕
顶层文件编写
module mcu_8051(
input Clk50M //时钟源,50M
input Rst_n //复位端口
input int0_i //mc8051外部中断0输入
input int1_i //mc8051外部中断1输入
input all_t0_i //mc8051计数器0输入
input all_t1_i //mc8051计数器1输入
input [7:0]p0_i //mc8051端口0输入
input [7:0]p1_i //mc8051端口1输入
input [7:0]p2_i //mc8051端口2输入
input [7:0]p3_i //mc8051端口3输入
output [7:0]p0_o //mc8051端口0输出
output [7:0]p1_o //mc8051端口1输出
output [7:0]p2_o //mc8051端口2输出
output [7:0]p3_o //mc8051端口3输出
input all_rxd_i //mc8051串口接收端口
output all_rxd_o //mc8051串口方式0时输出端口
output all_txd_o //mc8051串口发送端口
output all_rxdwr_o //rxd 输入/输出方向控制信号(高电平输出)
);
wire Clk18M;
//例化PLL模块
pll pll(
.inclk0(Clk50M)
.c0(Clk18M)
);
//例化mc8051核
mc8051_top mc8051_top_inst(
.clk(Clk18M)
.reset(~Rst_n) //mc8051为高电平复位,因此将复位按键状态取反接到reset上
.int0_i(int0_i)
.int1_i(int1_i)
.all_t0_i(all_t0_i)
.all_t1_i(all_t1_i)
.p0_i(p0_i)
.p1_i(p1_i)
.p2_i(p2_i)
.p3_i(p3_i)
.p0_o(p0_o)
.p1_o(p1_o)
.p2_o(p2_o)
.p3_o(p3_o)
.all_rxd_i(all_rxd_i)
.all_rxd_o(all_rxd_o)
.all_txd_o(all_txd_o)
.all_rxdwr_o(all_rxdwr_o)
);
endmodule
对工程分析和综合
引脚的锁定
编译烧录FPGA
点击“start”开始烧录
之后就打开Keil进行8051正常C语言代码编程编译出来Hex文件配置到FGPA中即可验证,简单的MC8051齐活,后续外设IP可以基于进行开发。
单片机hex烧录