PicoBlaze 设计实例

一、 设计要求
1. PICOBLAZE 嵌入式系统,包括1 个8 位的方波输出口,一个驱动两位7 段LED 的输出口,一个时钟输入和一个中断输入。
2. 在Spartan-3an starter 套件中实现。

二、 设计过程

1. 在ISE 11.x中建立一个新的项目,项目名为kcpsm3_int_test,并加入源文件kcpsm3.vhd,这仅仅是一个PicoBlaze控制器核文件,读者可以根据自己的爱好选择不同的设计语言。

2. 编写PicoBlaze的汇编语言源程序,本例中的汇编源程序为int_test.psm,具体如下。

;Interrupt example
;
CONSTANT waveform_port, 02 ;定义方波输出端口ID为02
CONSTANT counter_port, 04 ;定义中断计数器输出端口ID为04
CONSTANT sel_port, 08 ;定义2位7段LED选择输出端口ID为08
CONSTANT pattern_10101010, AA ;定义方波输出口初始值
CONSTANT ini_sel, 01 ;定义2位7段LED位选初始值为01
NAMEREG sA, interrupt_counter ;将sA寄存重新命名为interrupt_counter
;
start: LOAD interrupt_counter, 00 ;中断计数寄存器清零
LOAD s2, pattern_10101010 ;将方波数据载入寄存器s2中
LOAD sD, ini_sel ;将位选值装载入寄存器sD中
ENABLE INTERRUPT ;使能中断
;
drive_wave: OUTPUT s2, waveform_port ;输出方波
OUTPUT sD, sel_port ;输出LED位选
LOAD s0, FF ;延时
loop3: LOAD s1, FF
loop4: SUB s1, 01
ADD s1, 01
SUB s1, 01
JUMP NZ, loop4
SUB s0, 01
JUMP NZ, loop3
XOR s2, FF ;方波值取反
XOR sD, FF ;位选值取反
JUMP drive_wave
;
ADDRESS 2B0 ;定义程序存储地址
int_routine: ADD interrupt_counter, 01 ;中断计数器加1
OUTPUT interrupt_counter, counter_port ;输出计数值
OUTPUT sD, sel_port ;输出位选
LOAD sF, FF ;延时
loop1: LOAD sE, FF
loop2: SUB sE, 01
ADD sE, 01
SUB sE, 01
JUMP NZ, loop2
SUB sF, 01
JUMP NZ, loop1
XOR sD, FF
RETURNI ENABLE ;中断返回
;
ADDRESS 3FF ;中断入口地址
JUMP int_routine
3. 将int_test.psm 文件拷贝到Assembler 目录下, 运行DOS 命令, 进入
Assembler 目录,运行如下命令:
kcpsm3 int_test.psm > screen 回车

编译后Assembler 目录中产生了一些新的文件, 如图12-30 所示。其中INT_TEST.VHD/INT_TEST.V 文件为我们需要的文件,它就是PicoBlaze 的程序存储器文件,将它加入到kcpsm3_int_test 项目中。可以看到,生成的PROM 文件名与汇编源程序的文件名相同。

图12-30 编译后Assembler 目录文件

其中screen 文件为一个文本文件,编译过程记录在此文件中,如果源文件有错误,错误信息会在此文件中找到。

4. 建立一个顶层文件。在顶层文件中完成PROM 文件以及PicoBlaze 核文件的连接。下面对顶层文件进行简要说明。
 例化kcpsm3 和INT_TEST。
 初始化未用的PicoBlaze 输入引脚in_port 和reset。
 扩展输出寄存器, 分别是waveforms 、counter 和sel,其端口ID 分别为0x02、0x04 和0x08。
 中断输入逻辑。
 将计数器的结果译码为7 段LED 的输入编码。

顶层文件源代码如下。
--
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

--
-------------------------------------------------------------------------
entity kcpsm3_int_test is
Port ( LED : out std_logic_vector(6 downto 0);
waveforms : out std_logic_vector(7 downto 0);
interrupt_event : in std_logic;
clk : in std_logic;
selp : out std_logic);
end kcpsm3_int_test;
-------------------------------------------------------------------------
architecture Behavioral of kcpsm3_int_test is
--
component kcpsm3
Port ( address : out std_logic_vector(9 downto 0);
instruction : in std_logic_vector(17 downto 0);
port_id : out std_logic_vector(7 downto 0);
write_strobe : out std_logic;
out_port : out std_logic_vector(7 downto 0);
read_strobe : out std_logic;
in_port : in std_logic_vector(7 downto 0);
interrupt : in std_logic;
interrupt_ack : out std_logic;
reset : in std_logic;
clk : in std_logic);
end component;
--
component int_test
Port ( address : in std_logic_vector(9 downto 0);
instruction : out std_logic_vector(17 downto 0);
clk : in std_logic);
end component;
--
-------------------------------------------------------------------------
signal address : std_logic_vector(9 downto 0);
signal instruction : std_logic_vector(17 downto 0);
signal port_id : std_logic_vector(7 downto 0);
signal out_port : std_logic_vector(7 downto 0);
signal in_port : std_logic_vector(7 downto 0);
signal write_strobe : std_logic;

signal read_strobe : std_logic;
signal interrupt : std_logic :='0';
signal interrupt_ack : std_logic;
signal reset : std_logic;
signal counter : std_logic_vector(7 downto 0);
signal HEX0 : std_logic_vector(3 downto 0);
signal HEX1 : std_logic_vector(3 downto 0);
signal HEX : std_logic_vector(3 downto 0);
signal sel : std_logic;
--
-------------------------------------------------------------------------
begin
processor: kcpsm3
port map( address => address,
instruction => instruction,
port_id => port_id,
write_strobe => write_strobe,
out_port => out_port,
read_strobe => read_strobe,
in_port => in_port,
interrupt => interrupt,
interrupt_ack => interrupt_ack,
reset => reset,
clk => clk);
program: int_test
port map( address => address,
instruction => instruction,
clk => clk);
-- Unused inputs on processor
in_port <= "00000000";
reset <= '0';
-- Adding the output registers to the processor
IO_registers: process(clk)
begin

if clk'event and clk='1' then
-- waveform register at address 02
if port_id(1)='1' and write_strobe='1' then
waveforms <= out_port;
end if;
-- Interrupt Counter register at address 04
if port_id(2)='1' and write_strobe='1' then
counter <= out_port;
end if;
-- sel port register at address 08
if port_id(3) = '1' and write_strobe = '1' then
sel <= out_port(0);
end if;
end if;
end process IO_registers;
-- Adding the interrupt input
-- Note that the initial value of interrupt (low) is
-- defined at signal declaration.
interrupt_control: process(clk)
begin
if clk'event and clk='1' then
if interrupt_ack='1' then
interrupt <= '0';
elsif interrupt_event='1' then
interrupt <= '1';
else
interrupt <= interrupt;
end if;
end if;
end process interrupt_control;
HEX0 <= counter(3 downto 0);
HEX1 <= counter(7 downto 4);
with HEX SELect

LED <= "0000110" when "0001", --1
"1011011" when "0010", --2
"1001111" when "0011", --3
"1100110" when "0100", --4
"1101101" when "0101", --5
"1111101" when "0110", --6
"0000111" when "0111", --7
"1111111" when "1000", --8
"1101111" when "1001", --9
"1110111" when "1010", --A
"1111100" when "1011", --b
"0111001" when "1100", --C
"1011110" when "1101", --d
"1111001" when "1110", --E
"1110001" when "1111", --F
"0111111" when others; --0
HEX <= HEX0 when sel = '0' else HEX1;
selp <= sel;
end Behavioral;
添加约束文件,约束文件内容如下。
NET "clk" LOC = "E12"|IOSTANDARD = LVCMOS33 ;
NET "selp" LOC = "AB19"|IOSTANDARD = LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "LED<6>" LOC = "AA19"|IOSTANDARD = LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "LED<5>" LOC = "AB21"|IOSTANDARD = LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "LED<4>" LOC = "AA21"|IOSTANDARD = LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "LED<3>" LOC = "V16"|IOSTANDARD = LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "LED<2>" LOC = "W16"|IOSTANDARD = LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "LED<1>" LOC = "V15"|IOSTANDARD = LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "LED<0>" LOC = "V14"|IOSTANDARD = LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "waveforms<0>" LOC ="R20"|IOSTANDARD=LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "waveforms<1>" LOC ="T19"|IOSTANDARD=LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "waveforms<2>" LOC ="U20"|IOSTANDARD=LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "waveforms<3>" LOC ="U19"|IOSTANDARD=LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "waveforms<4>" LOC ="V19"|IOSTANDARD=LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "waveforms<5>" LOC ="V20"|IOSTANDARD=LVCMOS33|SLEW = SLOW|DRIVE = 8;
NET "waveforms<6>" LOC ="Y22"|IOSTANDARD=LVCMOS33|SLEW = SLOW|DRIVE = 8;

NET "waveforms<7>" LOC ="W21"|IOSTANDARD=LVCMOS33|SLEW = SLOW|DRIVE = 8;
#PACE: Start of PACE Area Constraints
NET "interrupt_event" LOC = "T9"|IOSTANDARD = LVCMOS33|PULLUP ;

5. 综合、布局布线。如图12-31所示,在ISE中完成布局布线。

图12-31 综合、布局布线

6. 配置FPGA。用iMPACT配置FPGA。

7. 读者可以在/CH12/kcpsm3_int_test中找到ISE工程文件,在/CH12/assembler中找到int_test.psm源文件。

12.8 小结

本章介绍了PicoBlaze微控制器,包括其基本结构、指令系统和开发工具,最后用一个简单的实例介绍了PicoBlaze的开发流程。PicoBlaze具有精小、易用、灵活、高性能等优点,不会像很多MCU一样停产,影响产品生命周期,可以方便地应用在Xilinx的FPGA中,特别适合应用于小型的控制系统中,用来实现状态机控制,进行系统管理。
目前,FPGA已经广泛地应用在游戏机产品、小型电机控制和医疗产品中,希望通过本章介绍,使其应用更加广泛。

PicoBlaze 设计实例相关推荐

  1. [转] MySQL和MongoDB设计实例对比

    转载自: http://www.phpchina.com/?action-viewnews-itemid-39896 文章举了一个数据库设计的例子,对MySQL和MongoDB两种存储工具,分别进行了 ...

  2. Verilog设计实例(3)基于Verilog的单端口同步读写RAM设计

    文章目录 写在前面 正文 电路设计 行为仿真 交个朋友 写在前面 为什么要写单端口同步读写RAM呢? 没有那么多为什么?就是因为简单.基础,能清晰说明单端口RAM的原理,顺手给出设计,也能说明你的设计 ...

  3. Verilog设计实例(2)一步一步实现一个多功能通用计数器

    博文目录 写在前面 正文 普通的二进制计数器 电路设计 行为仿真 普通的格雷码计数器 电路设计 行为仿真 LFSR 电路设计 行为仿真 多功能计数器 电路设计 行为仿真 生成语句实现方式 电路设计 行 ...

  4. 40多个漂亮的网页表单设计实例

    40多个漂亮的网页表单设计实例详细出处参考:http://www.jb51.net/web/20182.html 转载于:https://www.cnblogs.com/Ken-Cai/archive ...

  5. mysql mongodb插件_MySQL和MongoDB设计实例对比分析

    下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里面除了包含手机的名称,品牌等基本信息,还包含了待机时间,外观设计等参数信息,应该如何存取数据呢? 如果使用MySQL的话,应该如何存 ...

  6. css网页设计实例代码_大型电商平台设计实例:电商平台项目工程、数据库选型、代码库...

    电商平台微服务体系架构 经过一系列的微服务设计, 下面使用一张维导图完整表示这个电商平台的微服务架构设计模型,如图 3-6 示. 这是一个为简单的电商平台微服务架构设计模型,并且使用了粗粒度的微服务划 ...

  7. java 单例模式 泛型_设计模式之架构设计实例(工厂模式、单例模式、反射、泛型等)...

    设计模式, 架构设计实例, 使用到了工厂模式.单例模式.反射.泛型等 项目包结构如下图: 1.bean包 (1)Base.java父类 package test.bean; public class ...

  8. MySQL与MongoDB设计实例对比

    MySQL与MongoDB设计实例对比 2011年06月15日14:06 来源:huoding 作者:老王 编辑:胡铭娅 评论:0条 如果使用MongoDB的话,应该如何存取数据呢? 如果使用Mong ...

  9. 行波iq调制器_低功率IQ调制器的基带设计实例—电路精选(1)

    标签:基带(41)调制器(16)滤波器(821) 调制参数 在本设计实例中,系统规格指标如下: 符号率 = 30 ksps 数字滤波器 = 0.35 下一步是确定基带滤波器要求: 总的信号 BW = ...

最新文章

  1. 离群?异常?新类?开集?分布外检测?一文搞懂其间异同!
  2. python饼状图颜色一样_Python饼状图的绘制实例
  3. php html中的判断,php怎么判断字符串中是否包含html标签?
  4. C#中读写Xml配置文件常用方法工具类
  5. Batch request processing in backend
  6. word List32
  7. Scrapy安装介绍
  8. 今天用python的turtle简单画了一副眼镜
  9. Windows下redis使用及安装
  10. Linux从初学到精通
  11. ios实例开发精品文章推荐(8.13)
  12. 发动机电控系统:T3温度模型标定
  13. Learning Multi-granularity Consecutive User Intent Unit for Session-based Recommendation
  14. 我的理想200字计算机工程师,我的理想工程师作文(我的理想是做一名工程师)...
  15. php计算工资的代码,php计算税后工资的方法_PHP
  16. “征服自己是最大的胜利,被征服是最大的耻辱和邪恶。”
  17. 3分钟了解今日头条推荐算法原理
  18. 帆软报表决策系统忘记密码重置
  19. 【SpringCloudAlibaba学习 04】整合Dubbo(实现数据消费者服务调用数据生产者服务)
  20. css水平垂直居几种方式总结

热门文章

  1. linux安装python虚拟环境_linux环境下安装python虚拟环境及注意事项
  2. vb获得mysql的值,VB.NET调用MySQL存储过程并获得返回值的方法
  3. 滑动平均滤波_11种滤波算法程序大全(含源代码分享)
  4. 台式计算机的cpu设置,i7型CPU进行了修改并在台式计算机上使用,这才是真正的计算机之神!...
  5. html随机播放不同的音乐,如何随机播不同的背景音乐
  6. JFET直耦级联放大电路:MPF102,2SK102
  7. c语言联合体作用,C语言 联合体(Unions)
  8. verilog中数组的定义_开源仿真工具Icarus Verilog中的verilog parser
  9. linux lua ide,mac os上开发lua用什么ide
  10. python构造方法与java区别_一张图秒懂Java和Python的区别,你知道吗?