加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真

(2013-02-11 19:14:32)
标签:

sysgen

systemgenerator

导入hdl模块

xilinx

分类: FPGA

导入外部的HDL程序模块 

System generator支持导入HDL设计,能以黑盒子(Black Box)的方式导入VHDLVerilog HDL以及EDIF设计文件。在模型设计中,黑盒子模块和普通的System generator一样,能实现模块间的互相连接、参与仿真以及被编译成硬件电路。 

1.黑盒子HDL代码的要求 

黑盒子模块队导入的HDL代码格式有一定的限制,其具体要求如下: 

HDL实体的名字不能和设计中已有的模块名字重复; 

顶层黑盒子实体中不能出现双向端口; 

对于Verilog黑盒子,其模块和端口名必须小写,且命名要规范; 

HDL模块的时钟信号以及时钟使能信号都必须是标准逻辑类型,即不能使用矢量输入信号,如: 
input clk1, clk2;是合法的 
input [1:0] clk; 是不合法的 

黑盒子代码的时钟和时钟使能信号必须成对出现,即出现一个时钟信号,则必须有一个时钟使能信号。且时钟信号的名字中必须包含字符串clk,时钟使能信号的名字必须包含字符串ce,一对时钟信号和时钟使能信号的名字只能有clkce不同,如my_clk_1my_ce_1

 

2.黑盒子配置向导 

System Generator提供了由HDL代码到黑盒子模块转化的可配置向导,用于简化整个流程。可配置向导首先检查VHDLVerilog代码的语法检查,然后根据语义分析的结果将其转换成.m函数,最后再将.m函数和黑盒子模块关联起来。生成的可配置.m函数是否可用取决于导入的HDL代码的复杂度。将在5.5.1节给出说明,指出在哪些细节下,必须对其生成的代码进行手工修改以修正可配置向导的不足。 

1) 启动可配置向导

当在设计中添加一个黑盒子模块时,配置向导会自动启动。注意:在添加黑盒子之前,要将导入的HDL文件放在设计模型的文件夹中。可配置向导只在设计文件.mdl所在的文件中寻找.v.vhd文件,如果没有找到相关文件,则会弹出警告提示对话框,如图7-47所示。


http://s12/mw690/735f2910gd5715405847b&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />

                         警告提示对话框

当找到.v或者.vhd文件后,可配置向导会弹出一个新的对话框,并列出所有HDL文件,如图7-48所示。然后选中要导入的文件,点击“Open”按钮即可完成整个流程。自动生成的.m文件的名字为 “_config.m”,且存放在设计文件夹中。就是导入的HDL文件的名字。

 

2) 可配置向导的一些细节
可配置向导在运行过程中会自动提取大量的信息,并执行相应的转换,但是有些细节必须通过手动修改才能完成,如表7-12所示。另外,可配置向导会在.m函数相应的地方添加注释以提示设计人员。

http://s11/mw690/735f2910gd57169bdb2ca&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />

3.可配置.m函数
导入的HDL文件都是以黑盒子模块来描述的,因此原HDL文件所有的信息都通过可配置.m函数加载到黑盒子中。可配置.m函数不仅定义了接口、物理实现以及仿真行为等信息,还包括以下配置信息:顶层模块的实体名字、VHDLVerilog语言选择标志、端口描述、模块的一般性需求、时钟和采样速率、和模块有关的所有文件信息以及模块中是否含有组合逻辑路径。

例如:

在新的文件中拉入两个 black box

http://s16/mw690/735f2910gd571ad52346f&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />
然后会自动弹出
http://s11/mw690/735f2910gd571b1ac8dba&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />

分别有两个编写好的HDL文件,一个verilog,一个VHDL。分别选择一个HDL 文件。

http://s4/mw690/735f2910gd571aad10103&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />
然后如果我们要使用modelsim仿真的话,要拖入这个
http://s7/mw690/735f2910gd571aae08c16&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />

然后双击black box图标。

我们注意到在Block configuration m-function一栏中,会自动出现自动生成的文件,这个文件是可配置的。
http://s15/mw690/735f2910gd571aae6955e&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />

在HDL co-simulator中填入  ModelSim ,注意大小写。

然后点运行,会自动弹出modelsim仿真

http://s12/mw690/735f2910gd571f1f083ab&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />

注意在Inactive 情况下scope没有波形。。。只有在modelsim或者ISE下scope才有波形

http://s14/mw690/735f2910gd571ff74bb6d&690generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" TITLE="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" />

 

 

下面是实现编写好的verilog文件和VHDL 文件

shutter.v 文件内容
// `timescale 1 ns / 1 ns

`define false 0
`define true 1

module shutter(clk, ce, din, latch, dout);
  
   parameter din_width = 6;
   parameter dout_width = 6;

   input     clk, ce;
   input [din_width-1:0] din;
   input latch;
   output [dout_width-1:0] dout;
   wire [dout_width-1:0]  dout;
   reg [dout_width-1:0]   dout_reg;
   reg      dout_valid_reg;

   reg [din_width-1:0]   dly_din;

   assign    dout = dout_reg;
  
   // Delay input on clock cycle
   // always @(posedge clk or ce) begin : sample
   always @(posedge clk) begin : sample
      if(ce & latch) begin
  dly_din <= din;
      end
   end

   // Mux that selects current value or previous value.
   always @(ce or latch or din or dly_din) begin : mux
      if(!ce | !(latch)) begin
  dout_reg <= dly_din;
      end else begin
  dout_reg <= din;
      end
   end
endmodule // shutter

 

 

word_parity_block.vhd 文件内容

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity word_parity_block is
  generic (
    width: integer := 8
  );
  port (
    din: in std_logic_vector(width - 1 downto 0);
    parity: out std_logic
  );
end word_parity_block;

architecture behavior of word_parity_block is
begin
 WORD_PARITY_Process:  process (din)
   variable partial_parity : std_logic := '0';
  begin
    partial_parity := '0';

    XOR_BIT_LOOP: for N in din'range loop
      partial_parity := partial_parity xor din(N);
    end loop;  -- N

    parity <= partial_parity after 1 ns ;
  end process WORD_PARITY_Process;
end behavior;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有