导入外部的HDL程序模块
System generator支持导入HDL设计,能以黑盒子(Black Box)的方式导入VHDL、Verilog HDL以及EDIF设计文件。在模型设计中,黑盒子模块和普通的System generator一样,能实现模块间的互相连接、参与仿真以及被编译成硬件电路。
1.黑盒子HDL代码的要求
黑盒子模块队导入的HDL代码格式有一定的限制,其具体要求如下:
HDL实体的名字不能和设计中已有的模块名字重复;
顶层黑盒子实体中不能出现双向端口;
对于Verilog黑盒子,其模块和端口名必须小写,且命名要规范;
HDL模块的时钟信号以及时钟使能信号都必须是标准逻辑类型,即不能使用矢量输入信号,如:
input clk1, clk2;是合法的
input [1:0] clk; 是不合法的
黑盒子代码的时钟和时钟使能信号必须成对出现,即出现一个时钟信号,则必须有一个时钟使能信号。且时钟信号的名字中必须包含字符串clk,时钟使能信号的名字必须包含字符串ce,一对时钟信号和时钟使能信号的名字只能有clk和ce不同,如my_clk_1和my_ce_1。
2.黑盒子配置向导
System Generator提供了由HDL代码到黑盒子模块转化的可配置向导,用于简化整个流程。可配置向导首先检查VHDL、Verilog代码的语法检查,然后根据语义分析的结果将其转换成.m函数,最后再将.m函数和黑盒子模块关联起来。生成的可配置.m函数是否可用取决于导入的HDL代码的复杂度。将在5.5.1节给出说明,指出在哪些细节下,必须对其生成的代码进行手工修改以修正可配置向导的不足。
1)
启动可配置向导
当在设计中添加一个黑盒子模块时,配置向导会自动启动。注意:在添加黑盒子之前,要将导入的HDL文件放在设计模型的文件夹中。可配置向导只在设计文件.mdl所在的文件中寻找.v和.vhd文件,如果没有找到相关文件,则会弹出警告提示对话框,如图7-47所示。
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_94501360583111391 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s12.sinaimg.cn/mw690/735f2910gd5715405847b&690" width=465 height=164 real_src="http://s12.sinaimg.cn/mw690/735f2910gd5715405847b&690">
警告提示对话框
当找到.v或者.vhd文件后,可配置向导会弹出一个新的对话框,并列出所有HDL文件,如图7-48所示。然后选中要导入的文件,点击“Open”按钮即可完成整个流程。自动生成的.m文件的名字为
“_config.m”,且存放在设计文件夹中。就是导入的HDL文件的名字。
2)
可配置向导的一些细节
可配置向导在运行过程中会自动提取大量的信息,并执行相应的转换,但是有些细节必须通过手动修改才能完成,如表7-12所示。另外,可配置向导会在.m函数相应的地方添加注释以提示设计人员。
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_51731360584095955 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s11.sinaimg.cn/mw690/735f2910gd57169bdb2ca&690" real_src="http://s11.sinaimg.cn/mw690/735f2910gd57169bdb2ca&690">
3.可配置.m函数
导入的HDL文件都是以黑盒子模块来描述的,因此原HDL文件所有的信息都通过可配置.m函数加载到黑盒子中。可配置.m函数不仅定义了接口、物理实现以及仿真行为等信息,还包括以下配置信息:顶层模块的实体名字、VHDL或Verilog语言选择标志、端口描述、模块的一般性需求、时钟和采样速率、和模块有关的所有文件信息以及模块中是否含有组合逻辑路径。
例如:
在新的文件中拉入两个 black box
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_1791360584227830 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s16.sinaimg.cn/mw690/735f2910gd571ad52346f&690" width=663 height=424 real_src="http://s16.sinaimg.cn/mw690/735f2910gd571ad52346f&690">
然后会自动弹出
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_62431360584315977 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s11.sinaimg.cn/mw690/735f2910gd571b1ac8dba&690" width=634 height=481 real_src="http://s11.sinaimg.cn/mw690/735f2910gd571b1ac8dba&690" action-type="show-slide" action-data="http%3A%2F%2Fs11.sinaimg.cn%2Fmw690%2F735f2910gd571b1ac8dba%26690">
分别有两个编写好的HDL文件,一个verilog,一个VHDL。分别选择一个HDL 文件。
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_4281360584365751 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s4.sinaimg.cn/mw690/735f2910gd571aad10103&690" width=690 height=395 real_src="http://s4.sinaimg.cn/mw690/735f2910gd571aad10103&690">
然后如果我们要使用modelsim仿真的话,要拖入这个
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_77171360584616983 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s7.sinaimg.cn/mw690/735f2910gd571aae08c16&690" width=690 height=316 real_src="http://s7.sinaimg.cn/mw690/735f2910gd571aae08c16&690">
然后双击black box图标。
我们注意到在Block configuration m-function一栏中,会自动出现自动生成的文件,这个文件是可配置的。
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_42341360585406638 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s15.sinaimg.cn/mw690/735f2910gd571aae6955e&690" real_src="http://s15.sinaimg.cn/mw690/735f2910gd571aae6955e&690" action-type="show-slide" action-data="http%3A%2F%2Fs15.sinaimg.cn%2Fmw690%2F735f2910gd571aae6955e%26690">
在HDL co-simulator中填入
ModelSim ,注意大小写。
然后点运行,会自动弹出modelsim仿真
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_24691360585622283 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s12.sinaimg.cn/mw690/735f2910gd571f1f083ab&690" width=690 height=440 real_src="http://s12.sinaimg.cn/mw690/735f2910gd571f1f083ab&690" action-type="show-slide" action-data="http%3A%2F%2Fs12.sinaimg.cn%2Fmw690%2F735f2910gd571f1f083ab%26690">
注意在Inactive 情况下scope没有波形。。。只有在modelsim或者ISE下scope才有波形
<IMG style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px; border-image: initial" title="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" name=image_operate_7601360585853984 alt="sysgen(system generator)下的使用black box导入现有的HDL模块,并使用modelsim模块仿真" src="http://s14.sinaimg.cn/mw690/735f2910gd571ff74bb6d&690" width=622 height=425 real_src="http://s14.sinaimg.cn/mw690/735f2910gd571ff74bb6d&690" action-type="show-slide" action-data="http%3A%2F%2Fs14.sinaimg.cn%2Fmw690%2F735f2910gd571ff74bb6d%26690">
下面是实现编写好的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; |