在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2176|回复: 2

mc8051扩展外设试验

[复制链接]
发表于 2017-4-22 19:33:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 weisonwsc 于 2017-4-22 19:41 编辑

mc8051官网上有FPGA实现demo例程,我就不多说了,现在讲一下我如何在此基础上进行外设扩展。整体思路:
mc8051顶层没有外设的接口,片外RAM接口封装在内部,最大支持64KB,其实大多数情况下不需要这么多,而且一般的FPGA也没有那么多资源,我们可以把内部片外RAM接口再分成两个接口,一个接口连接到外部ram上,另一个接口连到外设上。


##1
在mc8051_top.vhd文件端口声明加上外设接口




  1.                 per_data_out:  out std_logic_vector(7 downto 0);
  2.                 per_data_in :   in std_logic_vector(7 downto 0);
  3.                 per_adr     :  out std_logic_vector(15 downto 0);
  4.                 per_wr      :  out std_logic;


复制代码



##2
修改mc8051_top_struc.vhd文件,主要是实现内部片外RAM接口分成两个接口,这里我使用2k的片外ram,大家根据自己的情况修改




  1. architecture struc of mc8051_top is
  2.    
  3.   signal s_rom_adr:      std_logic_vector(15 downto 0);  -- Programmcounter =
  4.                                                          -- ROM-adress
  5.   signal s_rom_data:     std_logic_vector(7 downto 0);   -- data input from ROM
  6.   signal s_ram_data_out: std_logic_vector(7 downto 0);   -- data output to
  7.                                                          -- internal RAM
  8.   signal s_ram_data_in:  std_logic_vector(7 downto 0);   -- data input from
  9.                                                          -- internal RAM
  10.   signal s_ram_adr:      std_logic_vector(6 downto 0);   -- internal RAM-adress
  11.   signal s_ram_wr:       std_logic;                      -- read (0)/write (1)
  12.                                                          -- internal RAM
  13.   signal s_ram_en:       std_logic;                      -- RAM-block enable
  14.   
  15.   signal s_datax_o:      std_logic_vector(7 downto 0);  -- data output to
  16.                                                          -- ext. RAM
  17.   signal s_datax_i:      std_logic_vector(7 downto 0);  -- data input from
  18.                                                          -- ext. RAM
  19.   signal s_adrx_o:       std_logic_vector(15 downto 0); -- ext. RAM-adress
  20.   signal s_wrx_o:        std_logic;                     -- read (0)/write (1)
  21.                                                          -- ext. RAM
  22.   signal s_rom_adr_sml:  std_logic_vector(14 downto 0);
  23.   signal s_ramx_adr_sml: std_logic_vector(10 downto 0);
  24.   signal s_ramx_data_in: std_logic_vector(7 downto 0);
  25.   signal s_ramx_data_out:std_logic_vector(7 downto 0);
  26.   signal s_ramx_wr: std_logic;
  27.   signal per_sel :  std_logic;

  28. begin                 -- architecture structural
  29.   s_rom_adr_sml  <= std_logic_vector(s_rom_adr(14 downto 0));
  30.   s_ramx_adr_sml <= std_logic_vector(s_adrx_o(10 downto 0));
  31.   s_ramx_data_out<= s_datax_o ;
  32.   s_ramx_wr      <= s_wrx_o when std_logic_vector(s_adrx_o(15 downto 11))="00000" else '0' ;
  33.   per_adr        <= s_adrx_o;        
  34.   per_data_out   <= s_datax_o ;
  35.   per_wr         <= s_wrx_o when std_logic_vector(s_adrx_o(15 downto 11))/="00000" else '0' ;
  36.   
  37.   process(clk,reset)
  38.   begin
  39.   if(reset='1') then per_sel<='0';
  40.   elsif(rising_edge(clk)) then
  41.                 if std_logic_vector(s_adrx_o(15 downto 11))="00000" then per_sel<='0' ;
  42.                 else per_sel<='1';
  43.                 end if;
  44.   end if;
  45.   end process;
  46.   
  47.   s_datax_i<= s_ramx_data_in   when per_sel='0' else
  48.               per_data_in ;
  49.   
  50.   
  51.   i_mc8051_core : mc8051_core
  52.     port map(clk         => clk,
  53.              reset       => reset,
  54.              rom_data_i  => s_rom_data,
  55.              ram_data_i  => s_ram_data_out,
  56.              int0_i      => int0_i,
  57.              int1_i      => int1_i,
  58.              all_t0_i    => all_t0_i,
  59.              all_t1_i    => all_t1_i,
  60.              all_rxd_i   => all_rxd_i,
  61.              p0_i        => p0_i,
  62.              p1_i        => p1_i,
  63.              p2_i        => p2_i,
  64.              p3_i        => p3_i,
  65.              p0_o        => p0_o,
  66.              p1_o        => p1_o,
  67.              p2_o        => p2_o,
  68.              p3_o        => p3_o,
  69.              all_rxd_o   => all_rxd_o,
  70.              all_txd_o   => all_txd_o,
  71.              all_rxdwr_o => all_rxdwr_o,
  72.              rom_adr_o   => s_rom_adr,
  73.              ram_data_o  => s_ram_data_in,
  74.              ram_adr_o   => s_ram_adr,
  75.              ram_wr_o    => s_ram_wr,
  76.              ram_en_o    => s_ram_en,
  77.              datax_i     => s_datax_i,
  78.              datax_o     => s_datax_o,
  79.              adrx_o      => s_adrx_o,
  80.              wrx_o       => s_wrx_o);

  81.    
  82.   -----------------------------------------------------------------------------
  83.   -- Hook up the general purpose 128x8 synchronous on-chip RAM.
  84.   i_mc8051_ram : mc8051_ram
  85. port map ( clock => clk,
  86.             data => s_ram_data_in,
  87.                q => s_ram_data_out,
  88.          address => s_ram_adr,
  89.             wren => s_ram_wr,
  90.            clken => s_ram_en);
  91.   -- THIS RAM IS A MUST HAVE!!
  92.   -----------------------------------------------------------------------------


  93.   -----------------------------------------------------------------------------
  94.   -- Hook up the (up to) 64kx8 synchronous on-chip ROM.
  95.   i_mc8051_rom : mc8051_rom_32k
  96.     port map (    clock => clk,
  97.                       q => s_rom_data,
  98.                 address => s_rom_adr_sml);
  99.   -- THE ROM OF COURSE IS A MUST HAVE, ALTHOUGH THE SIZE CAN BE SMALLER!!
  100.   -----------------------------------------------------------------------------
  101.   
  102.    
  103.   -----------------------------------------------------------------------------
  104.   -- Hook up the (up to) 64kx8 synchronous RAM.
  105.   i_mc8051_ramx : mc8051_xram_2k
  106. port map ( clock => clk,
  107.             data => s_ramx_data_out,
  108.               q => s_ramx_data_in,
  109.         address => s_ramx_adr_sml,
  110.              wren => s_ramx_wr);
  111.   -- THIS RAM (IF USED) CAN BE ON OR OFF CHIP, THE SIZE IS ARBITRARY.
  112.   -----------------------------------------------------------------------------

  113.   
  114. end struc;


复制代码



##3 添加外设
以下代码是一个测试外设模块,仅包含了两个寄存器,只实现了外设接口的读写。




  1. module ADT #(parameter
  2. base_adr=16'h8000
  3. )(
  4. output reg [7:0] per_dout,
  5. input [7:0] per_din,
  6. input [15:0]per_adr,
  7. input per_wr,
  8. input clk,
  9. input rst
  10. );


  11. reg[7:0] reg1,reg2;

  12. wire reg1_sel= per_adr==base_adr+16'h0001 ;
  13. wire reg2_sel= per_adr==base_adr+16'h0002 ;

  14. always@(posedge clk or posedge rst)
  15. if(rst)
  16.         reg1<=8'h00;
  17. else if(reg1_sel && per_wr)
  18.         reg1<=per_din;
  19. else ;

  20. always@(posedge clk or posedge rst)
  21. if(rst)
  22.         reg2<=8'h00;
  23. else if(reg1_sel && per_wr)
  24.         reg2<=per_din;
  25. else ;

  26. wire[7:0] reg1_dout,reg2_dout;

  27. assign reg1_dout=(reg1_sel)? reg1 : 8'h00;
  28. assign reg2_dout=(reg2_sel)? reg2 : 8'h00;

  29. always@(posedge clk or posedge rst)
  30. if(rst)
  31.         per_dout<=8'h00;
  32. else
  33.         per_dout<=reg1_dout | reg2_dout ;

  34. endmodule


复制代码



##4 顶层例化
此步省略

##5 测试C代码




  1. #include <reg51.h>
  2. #include "absacc.h"
  3. #include <intrins.h>

  4. #define reg1 XBYTE[0x8001]
  5. #define reg2 XBYTE[0x8002]

  6. void main(void)
  7. {
  8.         unsigned char temp;
  9.         reg1=0x5a;
  10.         while(1)
  11.         {
  12.                 temp=reg1;
  13.                 reg2=temp;
  14.                 temp=reg2;
  15.                 reg1=temp;
  16.         }
  17.         
  18. }


复制代码



##6 下载测试
提示 quartus 有”in-system memory conten editor" 工具,能把C51编辑的HEX文件直接下载到ROM里面(相当于下载程序),非常方便
000.png

逻辑分析仪看到读写时序
0001.png
发表于 2018-11-19 15:15:01 | 显示全部楼层
mc8051扩展外设试验
发表于 2020-7-12 16:00:20 | 显示全部楼层
不错不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-26 12:49 , Processed in 0.028001 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表