PicoBlaze 设计实例
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 设计实例相关推荐
- [转] MySQL和MongoDB设计实例对比
转载自: http://www.phpchina.com/?action-viewnews-itemid-39896 文章举了一个数据库设计的例子,对MySQL和MongoDB两种存储工具,分别进行了 ...
- Verilog设计实例(3)基于Verilog的单端口同步读写RAM设计
文章目录 写在前面 正文 电路设计 行为仿真 交个朋友 写在前面 为什么要写单端口同步读写RAM呢? 没有那么多为什么?就是因为简单.基础,能清晰说明单端口RAM的原理,顺手给出设计,也能说明你的设计 ...
- Verilog设计实例(2)一步一步实现一个多功能通用计数器
博文目录 写在前面 正文 普通的二进制计数器 电路设计 行为仿真 普通的格雷码计数器 电路设计 行为仿真 LFSR 电路设计 行为仿真 多功能计数器 电路设计 行为仿真 生成语句实现方式 电路设计 行 ...
- 40多个漂亮的网页表单设计实例
40多个漂亮的网页表单设计实例详细出处参考:http://www.jb51.net/web/20182.html 转载于:https://www.cnblogs.com/Ken-Cai/archive ...
- mysql mongodb插件_MySQL和MongoDB设计实例对比分析
下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里面除了包含手机的名称,品牌等基本信息,还包含了待机时间,外观设计等参数信息,应该如何存取数据呢? 如果使用MySQL的话,应该如何存 ...
- css网页设计实例代码_大型电商平台设计实例:电商平台项目工程、数据库选型、代码库...
电商平台微服务体系架构 经过一系列的微服务设计, 下面使用一张维导图完整表示这个电商平台的微服务架构设计模型,如图 3-6 示. 这是一个为简单的电商平台微服务架构设计模型,并且使用了粗粒度的微服务划 ...
- java 单例模式 泛型_设计模式之架构设计实例(工厂模式、单例模式、反射、泛型等)...
设计模式, 架构设计实例, 使用到了工厂模式.单例模式.反射.泛型等 项目包结构如下图: 1.bean包 (1)Base.java父类 package test.bean; public class ...
- MySQL与MongoDB设计实例对比
MySQL与MongoDB设计实例对比 2011年06月15日14:06 来源:huoding 作者:老王 编辑:胡铭娅 评论:0条 如果使用MongoDB的话,应该如何存取数据呢? 如果使用Mong ...
- 行波iq调制器_低功率IQ调制器的基带设计实例—电路精选(1)
标签:基带(41)调制器(16)滤波器(821) 调制参数 在本设计实例中,系统规格指标如下: 符号率 = 30 ksps 数字滤波器 = 0.35 下一步是确定基带滤波器要求: 总的信号 BW = ...
最新文章
- 离群?异常?新类?开集?分布外检测?一文搞懂其间异同!
- python饼状图颜色一样_Python饼状图的绘制实例
- php html中的判断,php怎么判断字符串中是否包含html标签?
- C#中读写Xml配置文件常用方法工具类
- Batch request processing in backend
- word List32
- Scrapy安装介绍
- 今天用python的turtle简单画了一副眼镜
- Windows下redis使用及安装
- Linux从初学到精通
- ios实例开发精品文章推荐(8.13)
- 发动机电控系统:T3温度模型标定
- Learning Multi-granularity Consecutive User Intent Unit for Session-based Recommendation
- 我的理想200字计算机工程师,我的理想工程师作文(我的理想是做一名工程师)...
- php计算工资的代码,php计算税后工资的方法_PHP
- “征服自己是最大的胜利,被征服是最大的耻辱和邪恶。”
- 3分钟了解今日头条推荐算法原理
- 帆软报表决策系统忘记密码重置
- 【SpringCloudAlibaba学习 04】整合Dubbo(实现数据消费者服务调用数据生产者服务)
- css水平垂直居几种方式总结
热门文章
- linux安装python虚拟环境_linux环境下安装python虚拟环境及注意事项
- vb获得mysql的值,VB.NET调用MySQL存储过程并获得返回值的方法
- 滑动平均滤波_11种滤波算法程序大全(含源代码分享)
- 台式计算机的cpu设置,i7型CPU进行了修改并在台式计算机上使用,这才是真正的计算机之神!...
- html随机播放不同的音乐,如何随机播不同的背景音乐
- JFET直耦级联放大电路:MPF102,2SK102
- c语言联合体作用,C语言 联合体(Unions)
- verilog中数组的定义_开源仿真工具Icarus Verilog中的verilog parser
- linux lua ide,mac os上开发lua用什么ide
- python构造方法与java区别_一张图秒懂Java和Python的区别,你知道吗?