显示标签为“VHDL”的博文。显示所有博文
显示标签为“VHDL”的博文。显示所有博文

2009年1月3日星期六

GALS设计讨论(part3)异步控制部件协议,STG

GALS设计中常常涉及各种异步控制部件协议和STG,这里我很简单地讨论一下这些概念。

常用的异步控制部件协议有(具体解释见Google&Wiki):

  1. 两段打包(bundled data)协议使用Two-Phase Handshake,发送端发出REQUEST,接收端收到数据后发出ACK确认,使用信号的跳变。
  2. 四段打包(bundled data)协议使用Four-Phase Handshake,发送端发出REQUEST,接收端收到数据后发出ACK确认,使用信号电平来表示REQUEST和ACK。
  3. 四段双轨(dual rail)协议使用两根信号表示每位数据的逻辑电平。

Two and Four- phase handshake protocols

两段打包,四段打包优点是简单,面积小,能耗低,缺点是对延迟敏感。而使用四段双轨协议的电路正好相反。

STG:signal transition graph STG,是一种信号转换图(属于petri网),是常见的描述异步电路信号控制行为描述方法。

非常简单的例子,请参考下面链接: A Case for Using Signal Transition Graphs for Analysing and ... 看完这个例子,我想你一定已经了解STG。

2008年12月24日星期三

GALS设计讨论(part2)flow control机制

前面讨论了ack requst 机制在GALS设计的应用。但是,GALS系统(这里假定一个简单的GALS系统由CLK_DOMAIN_A和CLK_DOMAIN_B组成并使用非同步FIFO作为两个DOMAIN的接口),常常需要使用到flow control机制,这时候就需要,flow control signal:例如:(ready, hold信号)。

使用HOLD信号,可以简单的是CLK_DOMAIN_A 保持了高电平。这时DOMAIN_A发送的DATA信号便保持了最后一个值不变,在DOMAIN_A里的模块,就保持“冻结”状态,只有当HOLD = '0' 时,“冻结”状态被解除。这里所谓的“冻结”状态有两个好处:

  1. 可以防止,系统时序的错乱,我做过几个实验,并没有采用flow control机制,仅仅采用ack requst 机制,当DOMAIN_B里的模块要从非同步FIFO系统需要读出数据时,要对DOMAIN_A发送ACK_A= '0'的信号,注意这里很容易会产生 系统时序的错乱。
  2. 可以节能 Energy Efficient。很简单,当DOMAIN_A里的模块,保持“冻结”状态时,这时模块就几乎不会耗能。

使用同样的原理,我们可以很容易地对DOMAIN_B里的模块控制,使其达到“冻结”状态,当往非同步FIFO里写入数据时。以下是一个 stretchable clock 的例子:

Example of the output from a stretchable clock

现在我们有了非同步FIFO(及其控制信号如WR_EN, RD_EN等等),flow control机制里的hold信号,ack requst 机制的ack request信号,我们可以快速的建立一个很简单的GALS系统。

经验:最好不要将ack requst 机制的ack request信号直接对非同步FIFO的控制信号如WR_EN, RD_EN进行控制,理论上是可以成功,但实践上会遇到很多譬如时序,延迟的问题。

比较聪明的解决方法是:建立一个INPUTINTERFACE(也可以叫做INPUTPORT)和一个OUTPUTINTERFACE(也可以叫做OUTPUTPORT)分别放在非同步FIFO两端,仅仅使用INPUTINTERFACE和OUTPUTINTERFACE的内部信号对FIFO进行控制。对于外部INPUTINTERFACE和OUTPUTINTERFACE控制和接受ack requst 机制的ack request信号,控制flow control机制里的hold信号。并且在INPUTINTERFACE和OUTPUTINTERFACE中放置一系列的flipflops和寄存器,对输出和输入信号还有数据进行“保护”。

本系列文章未完,待续。

2008年12月20日星期六

GALS设计讨论(part1)ack request机制

Handshake Protocol 是在硬件设计时,基础通信的协议。ack request信号的使用是其要点,这篇文章并不对其的基本原理进行讨论,这里着重对于ack request机制在GALS(全局非同步,局部同步系统)应用的讨论。

一般典型设计,以下是一个简单的示例:


模块1 模块2
| request_out |--> |request_in |
| ack_in |<-- |ack_out |

GALS系统设计,以下是一个简单的示例:

模块1 非同步FIFO控制模块 模块2
| request_out |--> |request_A(in) request_B(out)| --> |request_in |
| ack_in |<-- |ack_A(out) ack_B(in)| <-- |ack_out |

因为这里要使用到一个 “非同步FIFO控制模块”过渡,所以时序问题的考虑就特别重要,在多次的实验中,我发现 非同步FIFO控制模块 会使一些信号产生延迟,延迟问题常常是致命的,例如:当ack_A(out)无法在正确的时序给定给模块1时(常常,这个信号已经丢失了),模块1就会不断发送request_out信号,因为不能得到正确的ack_in 信号,整个系统就会停摆,或产生错乱。 这时要导入,几个一级flip flop来过滤信号的非稳定性,并要使对延迟进行严格控制。

Struktur der Synchronisierung der 1-Bit breite Kontrollsignale zwischen den Clock Domains

非同步FIFO控制模块有左右两侧接口。为了命名方便,左侧接口为request_A(in),ack_A(out),右侧则命名为B端。非同步FIFO控制模块的左右两端的信号接口,不仅是作为接口,起到链接作用,更为重要的是从模块1和2获得控制信号,并且通过输出信号ack_A(out) 和request_B(out)对模块1和2进行控制。模块1和2的输出信号request_A(in),ack_B(in),也可以进行对非同步FIFO的控制。

接下来讨论, 非同步FIFO控制模块的具体控制问题。

当非同步FIFO控制模块得到request_A(in)等于1时,说明(同一时间)有有效数据传输,这时将数据和request_A(in)信号输入寄存器,然后非同步FIFO从寄存器中读取数据,并发送 "ack_A(out) <= WR_ACK" 给模块1。

说明:WR_ACK是非同步FIFO的写入反馈信号,WR_EN是写使能信号。RD_ACK是非同步FIFO的读出反馈信号,RD_EN是读使能信号。

本文未完,待续。

2008年12月12日星期五

在ModelSim中设定大型的Project的一些讨论

以下内容仅仅是举例说明,具体操作视具体项目而定。
举一个例:在ModelSim中设定大型的Project(看完会发现步骤很多):

在.mpf里修改project的路径,用新的地址代替旧的地址。

大型项目常常有储存电路,如果要使用memory进行模拟,先要加入.vhd文档到project里,然后还有要加入.mif 文档到ModelSim的项目目录里,这很重要,还有加入对应的mem_sim文档。
使用memory进行模拟,注意例如要在component里写上:
-- synopsys translate_off
MEM_FILE : string;
-- synopsys translate_on

在instantiation里写上
-- synopsys translate_off
MEM_FILE => "mem_sim/abcd" & str(abcd_NUM-1, 10, 1)& "/xyz" & str(num+1) & "/efgh",
-- synopsys translate_on
-->可以读出ModelSim的项目目录mem\abcd*\ xyz*\efgh的文档里的内容,*代表数字,我们可以通过一些设定设置数字,这里不详细说明。

写一个clean_libs.do和create_libs.do for ModelSim Transcript
clean_libs.do 例如:
vdel -lib work -all
vlib work
vmap work work等等

create_libs.do 例如:
vlib work
vmap work work等等
最后在ModelSim Transcript执行:do clean_libs.do 然后再执行do create_libs.do

对simulation文档进行设定,例如调整unisim的位置,等等。

本文未完,待续。

2008年11月22日星期六

使用 Xilinx ChipScope对FPGA进行调试

If the prblem with your design lies at the tp-level or is fundamentally hardware-related, using ChipScope modules is probably the best way to debug them.

Example:

如何使用 Xilinx ChipScope对FPGA进行调试,具体请看教程
-- Xilinx Chipscope -- Instantiations
chipscope_controller : chipscope_icon
port map (control0 => chipscope_control);

chipscope_logicanalyzer : chipscope_ila_1
port map (clk => clk_lb, -- #
control => chipscope_control,
trig0 => chipscope_trig0);

-- Trigger
-- chipscope_trig0 <= (not ncore_ta) and (ncore_rw);
-- here:
-- chipscope_trig0 <= cluster_system_chipscope_trig_top;
-------------------------------------------------------

-- Xilinx Chipscope
signal chipscope_trig_top_int : std_logic_vector(0 downto 0);
-------------------------------------------------------
chipscope_trig_top_int(0) <= ((not ncore_ta) and (ncore_r_w)); -- #
chipscope_trig_top <= chipscope_trig_top_int;
逻辑分析仪Xilinx ChipScope的产生有两种方法:

Core Generator
(核产生器): 产生内核,将这些内核例化后添加到原设计文件,最后综合,实现,下载。
Core Inserter(核插入器):不需要修改原文件,它是将生成的内核添加到综合后的网表文件中.

Core Inserter 的流程为:

1)的 RTL 综合成 Netlist

2)调用 Core Inserter 插入逻辑分析仪;

3)布置和布局;

4)产生 bit 文件下载验证。


http://www.stanford.edu/class/ee108a/resources/documentation/chipscope_tutorial.pdf

这是一个很好的简单教程

基本步骤是:
  1. Generationg ChipScope Modules
  2. Incorporating and Instantiating the ChipScope Modules
  3. Connecting the ChipScope Modules
  4. Synthesizing, Implementing, and Running Your Design
  5. Using ChipScope Analyzer

2008年11月20日星期四

VHDL设计在FPGA模块测试 & VDHL极限编程结合FPGA实物仿真

例如 先进行5 Port original Switch-Box Testing在这个设计中只该变测试接口add Local Bus Interface, add N_core_Address测试接口,其他保持不变。
the Change for ISE Synthezise:
  1. add: library ethernet_lib;use ethernet_lib.all; in eth_controller.vhd.
  2. add: \hardware\assists : av_hw_acc, IP_header_check
  3. add: \hardware\building_blocks : cc_hw_acc, encoder
  4. in ISE: Sythesize properties: Veliog file path: --> ethenet Path
  5. use the new memory_interface.vhd and do some change to the ncore_wb.vhd: for example CPU_ID
  6. add all CoreGen file to the ISE-directory
  7. ISE libraries: change eth_port.vhd to ETHERNET.lib, change pe_cluster.vhd to URAT.lib
以上的内容对于读者并不重要,我只是记下来提醒自己:正确设置ISE是很重要,也是一点点学问和经验,以上例子表明,进行一个很简单的综合,在前期就要进行多达7步的搭配工作。测试常常需要很多不同的技巧,我这里是用XILINX CoreGenerator 生成储存文档,并和VHDL文件在ISE里进行综合,然后产生具有储存文档所描述功能的Bitstream。有时间的话,我将对XILINX CoreGenerator的使用进行说明。

这里所谓的"VDHL极限编程结合FPGA实物仿真":就是利用eXtreme Programming的一部分思想进行VHDL编程。极限编程:从最简单的解决方式入手再通过不断重构达到更好的结果。这种方法与传统系统开发方式的不同之处在于,它只关注于对当前的需求来进行设计、编码,而不去理会明天、下周或者下个月会出现的需求。
具体步骤:
  1. VHDL小系统的模拟(例:我的项目中:使用只有3个Ports的Switch Box系统在ModelSim进行模拟,这样可以提高模拟效率和速度)
  2. FPGA大系统实物仿真(例:我的项目中:使用有5个Ports的Switch Box的原始系统在ISE进行综合,这样可以保证综合的正确性)
  3. 在VHDL小系统的模拟验证正确的设计,直接放入大的系统,直接进行ISE综合,但是要仔细嵌入新的设计。
  4. 重复以上步骤。

2008年11月18日星期二

使用 local bus slave in FPGA 用于检测 VHDL Design

对FPGA进行测常常是一件很麻烦的工作。
这里有我最近的设计,例:
通过不同的从LOCAL BUS给定的地址可以从FPGA中很方便地读出所需要的测试数据。


status_multiplexer: process (I_ADR_test, DEBUG_PORT) is
begin
  case conv_integer(I_ADR_test)*4 is
  when 0 => I_DATA_IN_test_fpga2pc <= DEBUG_PORT(31 downto 0);
  when
4 => I_DATA_IN_test_fpga2pc <= DEBUG_PORT(63 downto 32);
  when
8 => I_DATA_IN_test_fpga2pc <= DEBUG_PORT(95 downto 64);
  when
12 => I_DATA_IN_test_fpga2pc<= DEBUG_PORT(127 downto 96); -- = 0xC
  when others
=> I_DATA_IN_test_fpga2pc <= "10101010101010101010101010101010";
end case;
end process
;


这里只用了一个很简单的multiplexer。
完成了对多个数据的测试。这个设计对于读取时地址资源稀少的 LOCAL BUS 设计很有帮助。可以只用一个 LOCAL BUS 但是可以读出不同的测试数据(在不同的时间)。我们只要给定 LOCAL BUS 的值 在本例中,给定 60004,就可以读出 DEBUG_PORT(63 downto 32)的数据。