MCU软核 1. Altera FPGA上运行8051

news2025/1/17 0:49:58


0. 环境

- Quartus 13
- EP4CE6E22开发板
- keil c51 
- ag10kl144h(本工程兼容AGM)

下载8051源码:https://www.oreganosystems.at/products/ip-cores/8051-ip-core

1. Create Project

File --> New Project Wizard

位置:E:\Workspaces\Quartus\EP4CE6_Core\mc8051_hello
名字:mc8051_hello

next - next
选择芯片
EP4CE6E22C6

Simulation     None     None


2. 添加源码


2.1 顶层文件


mc8051顶层文件样例请参考 mc8051_hello.v

module mc8051_hello(
	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上
	.reset(0),
	.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

2.2 ROM


创建一个ROM模块所需使用的初始化文件
File -> New -> Memory Files -> Hexadecimal (Intel-Format)File
-> Number of words:        4096
-> Word size:            8
File -> save as ... -> E:/Workspaces/Quartus/EP4CE6_Core/mc8051_hello/rtl/mc8051_hello.hex

2.3 生成ROM模块

注意这部分的hex文件需要完成keil部分章节才会生成。
Tools -> MegaWizard Plug-In Manager… -> Create a new custom megafunction variation -> Next ->ROM: 1-PORT -> 语言选择VHDL
-> 地址:E:/Workspaces/Quartus/EP4CE6_Core/mc8051_hello/rtl/altera_ip/mc8051_rom -> Next
-> how wide: 8 bits -> how many: 4096
-> 取消勾选 'q' output port
-> file name: E:/Workspaces/Quartus/EP4CE6_Core/mc8051_hello/keil/mc8051_hello/Objects/mc8051_hello.hex
-> 勾选Allow In-System Memory Content Editor to capture and update content independently of the system clock
-> The Instance ID of this ROM is: ROM0
-> 勾选 mc8051_rom.cmp 和 mc8051_rom_inst.vhd

2.4 生成RAM模块


Tools -> MegaWizard Plug-In Manager… -> Create a new custom megafunction variation -> Next ->RAM: 1-PORT -> 语言选择VHDL
-> 地址:E:/Workspaces/Quartus/EP4CE6_Core/mc8051_hello/rtl/altera_ip/mc8051_ram -> Next
-> how wide: 8 bits -> how many: 128
-> 取消勾选 'q' output port
-> 勾选 Create one clock enable signal for each clock signal.(clken)
-> 勾选 mc8051_ram.cmp 和 mc8051_ram_inst.vhd

 

Tools -> MegaWizard Plug-In Manager… -> Create a new custom megafunction variation -> Next ->RAM: 1-PORT -> 语言选择VHDL
-> 地址:E:/Workspaces/Quartus/EP4CE6_Core/mc8051_hello/rtl/altera_ip/mc8051_ramx -> Next
-> how wide: 8 bits -> how many: 2048
-> 取消勾选 'q' output port
-> 勾选 mc8051_ramx.cmp 和 mc8051_ramx_inst.vhd

 

 

 

2.5 mc8051_core


mc8051_design_v1.6\Version1_6\vhdl
拷贝到
E:\Workspaces\Quartus\EP4CE6_Core\mc8051_hello\rtl\mc8051core打开 mc8051_p.vhd 文件

--------------------------------------------------------------------
  -- START: Component declarations for simulation models
  --------------------------------------------------------------------
  component mc8051_ram
    port (
        clk        : in  std_logic;
        reset      : in  std_logic;
        ram_data_i : in  std_logic_vector(7 downto 0);
        ram_data_o : out std_logic_vector(7 downto 0);
        ram_adr_i  : in  std_logic_vector(6 downto 0);
        ram_wr_i   : in  std_logic;
        ram_en_i   : in  std_logic);
  end component;

  component mc8051_ramx
    port (
        clk        : in  std_logic;
        reset      : in  std_logic;
        ram_data_i : in  std_logic_vector(7 downto 0);
        ram_data_o : out std_logic_vector(7 downto 0);
        ram_adr_i  : in  std_logic_vector(15 downto 0);
        ram_wr_i   : in  std_logic);
  end component;

  component mc8051_rom
    port (
        clk        : in  std_logic;
        reset      : in  std_logic;
        rom_data_o : out std_logic_vector(7 downto 0); 
        rom_adr_i  : in  std_logic_vector(15 downto 0)); 
  end component;
  --------------------------------------------------------------------
  -- END: Component declarations for simulation models
  --------------------------------------------------------------------


  
替换为

--------------------------------------------------------------------
  -- START: Component declarations for simulation models
  --------------------------------------------------------------------
    component mc8051_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 mc8051_ramx     
    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(10 downto 0);            
        wren    : in  std_logic);   
    end component;
    
    component mc8051_rom     
    port ( 
        clock   : in  std_logic; 
        q       : out std_logic_vector(7 downto 0);  
        address : in  std_logic_vector(11 downto 0));   
    end component;

  --------------------------------------------------------------------
  -- END: Component declarations for simulation models
  --------------------------------------------------------------------


打开 mc8051_top_struc.vhd 文件
添加

  signal s_rom_adr_sml:   std_logic_vector(11 downto 0);  -- new
  signal s_ramx_adr_sml:   std_logic_vector(10 downto 0);  -- new


添加

    s_rom_adr_sml <= std_logic_vector(s_rom_adr(11 downto 0));  -- *** new    
    s_ramx_adr_sml <= std_logic_vector(s_ramx_adr(10 downto 0));  -- *** new  


再修改

--------------------------------------------------------------------
  -- Hook up the general purpose 128x8 synchronous on-chip RAM. 
  i_mc8051_ram : mc8051_ram     
    port map ( 
        clock       => clk, 
        data        => s_ram_data_in,     
        q           => s_ram_data_out, 
        address     => s_ram_adr,
        wren        => s_ram_wr,
        clken       => s_ram_en);

  -- THIS RAM IS A MUST HAVE!!
  --------------------------------------------------------------------


  --------------------------------------------------------------------
  -- Hook up the (up to) 64kx8 synchronous on-chip ROM.
    i_mc8051_rom : mc8051_rom
        port map (
            clock   => clk,
            q       => s_rom_data,
            address => s_rom_adr_sml);
  -- THE ROM OF COURSE IS A MUST HAVE, ALTHOUGH THE SIZE CAN BE SMALLER!!
  --------------------------------------------------------------------
  
    
  --------------------------------------------------------------------
  -- Hook up the (up to) 64kx8 synchronous RAM.
    i_mc8051_ramx : mc8051_ramx
        port map ( 
            clock   => clk,
            data    => s_ramx_data_out,
            q       => s_ramx_data_in,
            address => s_ramx_adr_sml,
            wren    => s_ramx_wr);
  -- THIS RAM (IF USED) CAN BE ON OR OFF CHIP, THE SIZE IS ARBITRARY.
  --------------------------------------------------------------------


  
添加mc8051 Core相关文件到Quartus II工程中
对部分文件的文件名进行更改。原版的VHDL源码,部分文件的文件名末尾加了有“_”,而实际源码中的模块名没有加“_”,因此,如果将这些文件直接添加到Quartus II工程中,编译就会报错。
名字带CFG的文件不需要添加。

2.6 pll


Tools -> MegaWizard Plug-In Manager… -> Create a new custom megafunction variation -> Next ->ALTPLL -> 语言选择verilog hdl
-> 地址:E:/Workspaces/Quartus/EP4CE6_Core/mc8051_hello/rtl/altera_ip/pll -> Next
-> inclk0: 50MHz
-> 取消勾选Create an 'areset' input to asynchronously reset the PLL
-> 取消勾选Create 'locked' output
-> c0 output clock frequency: 18MHz

2.7 设置工程顶层文件

在Files栏中,选中mc8051_top.vhd文件,点击右键,选择“Set as Top-Level Entity”,即可将mc8051_top.vhd设置为工程的顶层文件,(这里设置为顶层主要是为了封装IP核方便,临时性的,并不是最终作为工程顶层)。如图 2.23 所示:

3. 编译 

4. 配置引脚


打开 mc8051_hello.qsf
添加

set_location_assignment PIN_23 -to Clk50M
set_location_assignment PIN_88 -to Rst_n        # 掌中宝1A 复位按钮
set_location_assignment PIN_87 -to p1_o[1]        # 掌中宝1A led2
set_location_assignment PIN_98 -to p1_o[0]        # 掌中宝1A led1
# set_location_assignment PIN_42 -to p1_o[0]        # zhybcjbk_v011 led1
# set_location_assignment PIN_129 -to p1_o[1]        # zhybcjbk_v011 led2

编辑完后再次编译工程。 

5. keil

创建工程
Project -> New uVision Project -> E:\Workspaces\Quartus\EP4CE6_Core\mc8051_hello\keil\mc8051_hello
-> at89c51

添加源码
E:\Workspaces\Quartus\EP4CE6_Core\mc8051_hello\keil\mc8051_hello\src\main.c

设置生成Hex 
右键Target 1 -> Options for Target 'Target 1' -> Output -> 勾选Create HEX File

6. 验证与下载

重新编译再下载 sof

在Quartus中点击
Assignments—— Device——Device and Pin Options——Unused Pins
As input tri-stated

Assignments—— Device——Device and Pin Options——Dual-Purpose Pins
全部选择Use as regual I/O

Assignments—— Device——Device and Pin Options——Voltage
3.3-V LVTTL


6.1 FPGA程序

Open programmer --> 
add file --> output_files/add_sub_ip_test.sof

Hardware Setup:        USB-Blaster
Mode:                JTAG

 

6.2 FPGA程序-固化

File -> Convert Programming Files
    -> Programming file type -> JTAG Indirect Configuration File(.jic)
    -> Configuration device -> EPCS16
    -> File name -> output_files/mc8051_hello.jic
    -> Flash Loader -> Add Device -> EP4CE6
    -> SOF Data -> Add File -> mc8051_hello.sof
    -> Generate

 

打开Programmer,选择jlc文件,mc8051_hello.sof
勾选 output_files/mc8051_hello.sof 一行的Program/Configure

6.3 ROM

 

Tools -> In-System Memory Content Editor -> Hardware Setup: USB-Blaster
ROM0 -> 右键ROM0 -> Import Data From File -> E:\Workspaces\Quartus\EP4CE6_Core\mc8051_hello\keil\mc8051_hello\Objects\mc8051_hello.hex
-> Write Data to In-System Memory

但是这个ROM是在8051的IP核的,不是外部硬件ROM,因此掉电就要重新下载了。

7. Supre

这部分将EP4CE6工程转换为AGM工程。

D:\Supra-2023.02.b0-7773ca8a-win64-all\bin\Supra.exe

创建工程
Project -> New Project -> 
project directory:    E:\Workspaces\Supra\zhybcjbk\mc8051_hello
project name:        mc8051_hello

工程migrate
Tools -> Migrate
select migrate from directory:    E:\Workspaces\Quartus\EP4CE6_Core\mc8051_hello
input design name:                mc8051_hello
Select device:                    AG10KL144H
按Next转换

quartus
打开 E:\Workspaces\Supra\zhybcjbk\mc8051_hello\mc8051_hello.qpf

Tools -> TCL Scripts 
选择 af_quartus.td,点击Run

Supre编译工程
回到Supre界面,点击 Next -> Finish -> 稍后会弹出窗口提示Compile deisgn watch done.

文件说明
<design>_SRAM.prg 文件为片内 SRAM 写入,通过 JTAG 烧写,掉电即失效,可用于设计调试;
<design>_master.prg 文件为 Master(AS)配置方式下,通过 JTAG 烧写外部配置 FLASH的文件;
<design>_master.bin 为 Master(AS)配置方式下,配置 Flash 的标准烧写文件;
<design>_master_as.prg 调用此 bin 文件,通过 AS 口直接烧写 FLASH;
<design>.bin 为基本配置文件,可用来产生其它类型烧写文件,也可用于 Slave(PS)配置方式;rbf 文件为此 bin 文件的字节高低位反向的转换后文件。

参考:1. mc8051源码下载,https://www.oreganosystems.at/products/ip-cores/8051-ip-core
2. FPGA配置MC8051IP软核,https://blog.csdn.net/QuanSirX/article/details/105143773
3. 【小梅哥FPGA进阶教程】MC8051软核在FPGA上的使用,https://www.cnblogs.com/xiaomeige/p/6403094.html


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是ELK

什么是ELK ELK 并不是一个技术框架的名称&#xff0c;它其实是一个三位一体的技术名词&#xff0c;ELK 的每个字母都来自一个技术组件&#xff0c;分别是 Elasticsearch&#xff08;简称 ES&#xff09;、Logstash 和 Kibana。 三个技术组件是独立的&#xff0c;后两个被elast…

yolov5权重文件.pt转.bin文件

参考链接&#xff1a;YOLOv5学习记录(二): 模型转化及Android端部署_yolo .pt文件转未bin_Xiaoer__Lu的博客-CSDN博客 1、准备pt文件 我的目录是&#xff1a;C:\Users\Administrator\Desktop\driving\yolov5-mask-42-master\runs\train\exp_yolov5s\weights里的best.pt 2、p…

【hive】列转行—collect_set()/collect_list()/concat_ws()函数的使用场景

文章目录 一、collect_set()/collect_list()二、实际运用把同一分组的不同行的数据聚合成一个行用下标可以随机取某一个聚合后的中的值用‘|’分隔开使用collect_set()/collect_list()使得全局有序 一、collect_set()/collect_list() 在 Hive 中想实现按某字段分组&#xff0c…

ARM架构指令集--专用指令

四、状态寄存器专用指令 CPSR寄存器-N Z C V T为0时 为ARM状态 F为0时 为开启FIQ状态 I为0时 为开启IRQ状态 图1 图2 一开始都是SVC指令&#xff0c;因为在操作系统启动的时候&#xff0c;在做一些初始化的操作&#xff0c;不允许被打断 图3 复位后CPSR寄存器为0xD3--…

YOLO物体检测-系列教程4:YOLOV3项目实战1(coco图像数据集/darknet预训练模型)

1、整体项目 1.1 环境 一个有debug功能的IDE&#xff0c;建议PycharmPyTorch深度学习开发环境下载COCO数据集&#xff1a; 训练集&#xff0c;是很大的数据验证集&#xff0c;是很大的数据 1.2 数据 依次进入以下地址&#xff1a; 项目位置\PyTorch-YOLOv3\data\coco\imag…

elasticsearch基础篇

目录 1.mysql与elasticsearch 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.2.4.删除索引库 2.2.5.总结 3.文档操作 3.1.新增文档 3.2.查询文档 3.3.删除文档 3.4.修改文档 3.4.1.全量修改 …

QT6 C++ qDebug()输出中文乱码解决方法

1.“工具”->“选项” 2.“文本编辑器“->”Behaior&#xff08;行为&#xff09;“->默认编码修改为UTF-8 3.“编辑”->“Select Encoding”->选择UTF-8 4.再次编译运行&#xff0c;可以输出显示中文

Springboot 集成 Ehcache操作数据库显示SQL语句设置

Springboot 集成 Ehcache操作数据库显示SQL语句设置 2023-09-13 23:33:35.030 INFO 6124 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2023-09-13 23:33:35.124 INFO 6124 --- [ …

24.Xaml ListView控件-----显示数据

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

为保障小程序安全,安装SSL证书是必要的选择

随着小程序的蓬勃发展&#xff0c;用户对于安全性和隐私保护的关注也日益增加。在这样的背景下&#xff0c;安装SSL证书成为保障小程序安全的重要措施之一。本文将为您详细介绍安装SSL证书的原因及其带来的益处。 首先&#xff0c;SSL证书可以保护用户数据的安全性。通过为小程…

开源视频监控服务器Shinobi

什么是 Shinobi ? Shinobi 是用 Node.JS 编写的开源 CCTV 解决方案。采用多帐户系统、WebSocket Streams 和直接保存到 MP4 的设计。Shinobi 提供了一个基于 Web 的用户界面&#xff0c;使用户可以通过浏览器来查看和管理监控视频&#xff0c;Shinobi 支持多个品牌的摄像头和网…

【2023】数据挖掘课程设计:基于TF-IDF的文本分类

目录 一、课程设计题目 基于TF-IDF的文本分类 二、课程设计设置 1. 操作系统 2. IDE 3. python 4. 相关的库 三、课程设计目标 1. 掌握数据预处理的方法&#xff0c;对训练集数据进行预处理&#xff1b; 2. 掌握文本分类建模的方法&#xff0c;对语料库的文档进行建模…

Linux内核4.14版本——drm框架分析(14)——Atomic KMS 架构(struct drm_atomic_state)

目录 1. drm_atomic_state_alloc创建drm_atomic_state 1.1 drm_atomic_state_init 2. 各个drm object对应的state 2.1 drm_atomic_get_crtc_state 2.2 drm_atomic_get_plane_state 2.3 drm_atomic_get_connector_state 2.4 struct __drm_{object}_state 我们从前面两篇文…

excel中的引用与查找函数篇2

如下所有案例中表头均不参与范围查找内&#xff1a; 1、LOOKUP(lookup_value,lookup_vector,[result_vector])&#xff1a;在一行或者一列中查找某个值并从另一行或者列中找到同位置的值 记住&#xff1a;中括号内的参数可以不赋值&#xff0c;若在中间用逗号隔开这个参数&…

【Flink实战】Flink自定义的Source 数据源案例-并行度调整结合WebUI

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;【Flink实战】玩转Flink里面核心的Source Operator实战 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目录导航 什么是Flink的并行度Flink自定义的Source 数据…

阿里云通义千问大模型正式开放;玩10次ChatGPT就要消耗1升水

&#x1f989; AI新闻 &#x1f680; 阿里云通义千问大模型正式开放&#xff0c;已有超20万企业申请接入测试 摘要&#xff1a;阿里云通义千问大模型已经通过备案并向公众开放。用户可以登录官网体验&#xff0c;企业用户可以通过阿里云调用API。阿里云通义千问在一个月的邀测…

《确保安全:PostgreSQL安全配置与最佳实践》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

go并发处理业务

引言 实际上&#xff0c;在服务端程序开发和爬虫程序开发时&#xff0c;我们的大多数业务都是IO密集型业务&#xff0c;什么是IO密集型业务&#xff0c;通俗地说就是CPU运行时间只占整个业务执行时间的一小部分&#xff0c;而剩余的大部分时间都在等待IO操作。 IO操作包括htt…

uniapp 触底加载

方式一 onReachBottomDistance 缺点&#xff1a;需要整个页面滑动&#xff0c;局部滑动触发不了 { // pages.json // 路由下增加 onReachBottomDistance "path": "detailed/detailed","style": {"navigationBarTitleText": "收…

cpu温度监测 Turbo Boost Switcher Pro for mac最新

Turbo Boost Switcher Pro是一款Mac电脑上的应用程序&#xff0c;旨在帮助用户控制和管理CPU的Turbo Boost功能。Turbo Boost是Intel处理器中的一项技术&#xff0c;可以在需要更高性能时自动提高处理器的频率。然而&#xff0c;这可能会导致电池消耗更快和温度升高。 以下是T…