龙空技术网

FGPA实现单片机8051

坐在犄角旮旯里写代码 1042

前言:

当前小伙伴们对“8051单片机程序设计”大概比较重视,咱们都需要分析一些“8051单片机程序设计”的相关资讯。那么小编在网摘上收集了一些有关“8051单片机程序设计””的相关知识,希望咱们能喜欢,大家快快来学习一下吧!

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烧录

标签: #8051单片机程序设计 #8051单片机程序设计教程 #div顶层 #c8051f单片机程序 #基于8051单片机的设计