阅读 RAM-Based Shift Register(ALTSHIFT_TAPS) IP Core User Guide

说明:本文档自带测试工程:

DE_ALTSHIFT_TAPS.zip

1.支持单bit与多bit传输模式

可以理解为:一个时钟周期内,可以传送1bit数据,也可以传送多bit数据。

2.关于taps 的理解

Taps 相当于把整串数据分段,而且必须要遵循等分的原则,taps的最高位段的数据存储的是这串数据的第一个数据。

3.参数配置

4.仿真与分析

解压工程文件得到:

关于shift Register配置表如图:

shiftreg.v文件如下:

// megafunction wizard: %Shift register (RAM-based)%
// GENERATION: STANDARD
// VERSION: WM1.0
// MODULE: altshift_taps // ============================================================
// File Name: shiftreg.v
// Megafunction Name(s):
// altshift_taps
//
// Simulation Library Files(s):
// altera_mf
// ============================================================
// ************************************************************
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
//
// 8.0 Build 211 05/07/2008 SJ Full Version
// ************************************************************ //Copyright (C) 1991-2008 Altera Corporation
//Your use of Altera Corporation's design tools, logic functions
//and other software and tools, and its AMPP partner logic
//functions, and any output files from any of the foregoing
//(including device programming or simulation files), and any
//associated documentation or information are expressly subject
//to the terms and conditions of the Altera Program License
//Subscription Agreement, Altera MegaCore Function License
//Agreement, or other applicable license agreement, including,
//without limitation, that your use is for the sole purpose of
//programming logic devices manufactured by Altera and sold by
//Altera or its authorized distributors. Please refer to the
//applicable agreement for further details. // synopsys translate_off
`timescale ps / ps
// synopsys translate_on
module shiftreg (
aclr,
clken,
clock,
shiftin,
shiftout,
taps0x,
taps1x,
taps2x,
taps3x); input aclr;
input clken;
input clock;
input [:] shiftin;
output [:] shiftout;
output [:] taps0x;
output [:] taps1x;
output [:] taps2x;
output [:] taps3x; wire [:] sub_wire0;
wire [:] sub_wire7;
wire [:] sub_wire5 = sub_wire0[:];
wire [:] sub_wire6 = sub_wire0[:];
wire [:] sub_wire4 = sub_wire0[:];
wire [:] sub_wire3 = sub_wire4[:];
wire [:] sub_wire2 = sub_wire0[:];
wire [:] sub_wire1 = sub_wire2[:];
wire [:] taps3x = sub_wire1[:];
wire [:] taps2x = sub_wire3[:];
wire [:] taps1x = sub_wire5[:];
wire [:] taps0x = sub_wire6[:];
wire [:] shiftout = sub_wire7[:]; altshift_taps altshift_taps_component (
.clken (clken),
.aclr (aclr),
.clock (clock),
.shiftin (shiftin),
.taps (sub_wire0),
.shiftout (sub_wire7));
defparam
altshift_taps_component.lpm_hint = "RAM_BLOCK_TYPE=MLAB",
altshift_taps_component.lpm_type = "altshift_taps",
altshift_taps_component.number_of_taps = ,
altshift_taps_component.tap_distance = ,
altshift_taps_component.width = ; endmodule // ============================================================
// CNX file retrieval info
// ============================================================
// Retrieval info: PRIVATE: ACLR NUMERIC "1"
// Retrieval info: PRIVATE: CLKEN NUMERIC "1"
// Retrieval info: PRIVATE: GROUP_TAPS NUMERIC "1"
// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Stratix III"
// Retrieval info: PRIVATE: NUMBER_OF_TAPS NUMERIC "4"
// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
// Retrieval info: PRIVATE: TAP_DISTANCE NUMERIC "3"
// Retrieval info: PRIVATE: WIDTH NUMERIC "8"
// Retrieval info: CONSTANT: LPM_HINT STRING "RAM_BLOCK_TYPE=MLAB"
// Retrieval info: CONSTANT: LPM_TYPE STRING "altshift_taps"
// Retrieval info: CONSTANT: NUMBER_OF_TAPS NUMERIC "4"
// Retrieval info: CONSTANT: TAP_DISTANCE NUMERIC "3"
// Retrieval info: CONSTANT: WIDTH NUMERIC "8"
// Retrieval info: USED_PORT: aclr 0 0 0 0 INPUT VCC aclr
// Retrieval info: USED_PORT: clken 0 0 0 0 INPUT VCC clken
// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL clock
// Retrieval info: USED_PORT: shiftin 0 0 8 0 INPUT NODEFVAL shiftin[7..0]
// Retrieval info: USED_PORT: shiftout 0 0 8 0 OUTPUT NODEFVAL shiftout[7..0]
// Retrieval info: USED_PORT: taps0x 0 0 8 0 OUTPUT NODEFVAL taps0x[7..0]
// Retrieval info: USED_PORT: taps1x 0 0 8 0 OUTPUT NODEFVAL taps1x[7..0]
// Retrieval info: USED_PORT: taps2x 0 0 8 0 OUTPUT NODEFVAL taps2x[7..0]
// Retrieval info: USED_PORT: taps3x 0 0 8 0 OUTPUT NODEFVAL taps3x[7..0]
// Retrieval info: CONNECT: @shiftin 0 0 8 0 shiftin 0 0 8 0
// Retrieval info: CONNECT: shiftout 0 0 8 0 @shiftout 0 0 8 0
// Retrieval info: CONNECT: taps0x 0 0 8 0 @taps 0 0 8 0
// Retrieval info: CONNECT: taps1x 0 0 8 0 @taps 0 0 8 8
// Retrieval info: CONNECT: taps2x 0 0 8 0 @taps 0 0 8 16
// Retrieval info: CONNECT: taps3x 0 0 8 0 @taps 0 0 8 24
// Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0
// Retrieval info: CONNECT: @clken 0 0 0 0 clken 0 0 0 0
// Retrieval info: CONNECT: @aclr 0 0 0 0 aclr 0 0 0 0
// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg.inc TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg.cmp TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg.bsf TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg_inst.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg_bb.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg_waveforms.html TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg_wave*.jpg FALSE
// Retrieval info: LIB_FILE: altera_mf

testbench如下:

// Copyright (C) 1991-2008 Altera Corporation
// Your use of Altera Corporation's design tools, logic functions
// and other software and tools, and its AMPP partner logic
// functions, and any output files from any of the foregoing
// (including device programming or simulation files), and any
// associated documentation or information are expressly subject
// to the terms and conditions of the Altera Program License
// Subscription Agreement, Altera MegaCore Function License
// Agreement, or other applicable license agreement, including,
// without limitation, that your use is for the sole purpose of
// programming logic devices manufactured by Altera and sold by
// Altera or its authorized distributors. Please refer to the
// applicable agreement for further details. // *****************************************************************************
// This file contains a Verilog test bench with test vectors .The test vectors
// are exported from a vector file in the Quartus Waveform Editor and apply to
// the top level entity of the current Quartus project .The user can use this
// testbench to simulate his design using a third-party simulation tool .
// *****************************************************************************
// Generated on "06/11/2008 17:15:53" // Verilog Test Bench (with test vectors) for design : shiftreg
//
// Simulation tool : 3rd Party
// `timescale ps/ ps
module shiftreg_vlg_vec_tst();
// constants
// general purpose registers
reg aclr;
reg clken;
reg clock;
reg [:] shiftin;
// wires
wire [:] shiftout;
wire [:] taps0x;
wire [:] taps1x;
wire [:] taps2x;
wire [:] taps3x; // assign statements (if any)
shiftreg i1 (
// port map - connection between master ports and signals/registers
.aclr(aclr),
.clken(clken),
.clock(clock),
.shiftin(shiftin),
.shiftout(shiftout),
.taps0x(taps0x),
.taps1x(taps1x),
.taps2x(taps2x),
.taps3x(taps3x)
);
initial
begin
# $stop;
end // clock
always
begin
clock = 'b0;
clock = # 'b1;
#;
end // clken
initial
begin
clken = 'b0;
clken = # 'b1;
end // aclr
initial
begin
aclr = 'b0;
aclr = # 'b0;
aclr = # 'b1;
aclr = # 'b0;
aclr = # 'bX;
aclr = # 'b0;
aclr = # 'bX;
aclr = # 'b0;
end
// shiftin[ 7 ]
initial
begin
shiftin[] = 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
end
// shiftin[ 6 ]
initial
begin
shiftin[] = 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
end
// shiftin[ 5 ]
initial
begin
shiftin[] = 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
end
// shiftin[ 4 ]
initial
begin
shiftin[] = 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
end
// shiftin[ 3 ]
initial
begin
shiftin[] = 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
end
// shiftin[ 2 ]
initial
begin
shiftin[] = 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
end
// shiftin[ 1 ]
initial
begin
shiftin[] = 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
end
// shiftin[ 0 ]
initial
begin
shiftin[] = 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
shiftin[] = # 'b1;
shiftin[] = # 'b0;
end
endmodule

综合整个工程,得到结果:

自己按照如上参数表,配置一遍shift Register:

得到:

其实.qip里面也就一个文件:shiftreg.v

里面的信息包含有:

// megafunction wizard: %Shift register (RAM-based)%
// GENERATION: STANDARD
// VERSION: WM1.0
// MODULE: altshift_taps // ============================================================
// File Name: shiftreg.v
// Megafunction Name(s):
// altshift_taps
//
// Simulation Library Files(s):
// altera_mf
// ============================================================
// ************************************************************
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
//
// 8.0 Build 211 05/07/2008 SJ Full Version
// ************************************************************ //Copyright (C) 1991-2008 Altera Corporation
//Your use of Altera Corporation's design tools, logic functions
//and other software and tools, and its AMPP partner logic
//functions, and any output files from any of the foregoing
//(including device programming or simulation files), and any
//associated documentation or information are expressly subject
//to the terms and conditions of the Altera Program License
//Subscription Agreement, Altera MegaCore Function License
//Agreement, or other applicable license agreement, including,
//without limitation, that your use is for the sole purpose of
//programming logic devices manufactured by Altera and sold by
//Altera or its authorized distributors. Please refer to the
//applicable agreement for further details. // synopsys translate_off
`timescale ps / ps
// synopsys translate_on
module shiftreg (
aclr,
clken,
clock,
shiftin,
shiftout,
taps0x,
taps1x,
taps2x,
taps3x); input aclr;
input clken;
input clock;
input [:] shiftin;
output [:] shiftout;
output [:] taps0x;
output [:] taps1x;
output [:] taps2x;
output [:] taps3x; wire [:] sub_wire0;
wire [:] sub_wire7;
wire [:] sub_wire5 = sub_wire0[:];
wire [:] sub_wire6 = sub_wire0[:];
wire [:] sub_wire4 = sub_wire0[:];
wire [:] sub_wire3 = sub_wire4[:];
wire [:] sub_wire2 = sub_wire0[:];
wire [:] sub_wire1 = sub_wire2[:];
wire [:] taps3x = sub_wire1[:];
wire [:] taps2x = sub_wire3[:];
wire [:] taps1x = sub_wire5[:];
wire [:] taps0x = sub_wire6[:];
wire [:] shiftout = sub_wire7[:]; altshift_taps altshift_taps_component (
.clken (clken),
.aclr (aclr),
.clock (clock),
.shiftin (shiftin),
.taps (sub_wire0),
.shiftout (sub_wire7));
defparam
altshift_taps_component.lpm_hint = "RAM_BLOCK_TYPE=MLAB",
altshift_taps_component.lpm_type = "altshift_taps",
altshift_taps_component.number_of_taps = ,
altshift_taps_component.tap_distance = ,
altshift_taps_component.width = ; endmodule // ============================================================
// CNX file retrieval info
// ============================================================
// Retrieval info: PRIVATE: ACLR NUMERIC "1"
// Retrieval info: PRIVATE: CLKEN NUMERIC "1"
// Retrieval info: PRIVATE: GROUP_TAPS NUMERIC "1"
// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Stratix III"
// Retrieval info: PRIVATE: NUMBER_OF_TAPS NUMERIC "4"
// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
// Retrieval info: PRIVATE: TAP_DISTANCE NUMERIC "3"
// Retrieval info: PRIVATE: WIDTH NUMERIC "8"
// Retrieval info: CONSTANT: LPM_HINT STRING "RAM_BLOCK_TYPE=MLAB"
// Retrieval info: CONSTANT: LPM_TYPE STRING "altshift_taps"
// Retrieval info: CONSTANT: NUMBER_OF_TAPS NUMERIC "4"
// Retrieval info: CONSTANT: TAP_DISTANCE NUMERIC "3"
// Retrieval info: CONSTANT: WIDTH NUMERIC "8"
// Retrieval info: USED_PORT: aclr 0 0 0 0 INPUT VCC aclr
// Retrieval info: USED_PORT: clken 0 0 0 0 INPUT VCC clken
// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL clock
// Retrieval info: USED_PORT: shiftin 0 0 8 0 INPUT NODEFVAL shiftin[7..0]
// Retrieval info: USED_PORT: shiftout 0 0 8 0 OUTPUT NODEFVAL shiftout[7..0]
// Retrieval info: USED_PORT: taps0x 0 0 8 0 OUTPUT NODEFVAL taps0x[7..0]
// Retrieval info: USED_PORT: taps1x 0 0 8 0 OUTPUT NODEFVAL taps1x[7..0]
// Retrieval info: USED_PORT: taps2x 0 0 8 0 OUTPUT NODEFVAL taps2x[7..0]
// Retrieval info: USED_PORT: taps3x 0 0 8 0 OUTPUT NODEFVAL taps3x[7..0]
// Retrieval info: CONNECT: @shiftin 0 0 8 0 shiftin 0 0 8 0
// Retrieval info: CONNECT: shiftout 0 0 8 0 @shiftout 0 0 8 0
// Retrieval info: CONNECT: taps0x 0 0 8 0 @taps 0 0 8 0
// Retrieval info: CONNECT: taps1x 0 0 8 0 @taps 0 0 8 8
// Retrieval info: CONNECT: taps2x 0 0 8 0 @taps 0 0 8 16
// Retrieval info: CONNECT: taps3x 0 0 8 0 @taps 0 0 8 24
// Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0
// Retrieval info: CONNECT: @clken 0 0 0 0 clken 0 0 0 0
// Retrieval info: CONNECT: @aclr 0 0 0 0 aclr 0 0 0 0
// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg.inc TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg.cmp TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg.bsf TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg_inst.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg_bb.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg_waveforms.html TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL shiftreg_wave*.jpg FALSE
// Retrieval info: LIB_FILE: altera_mf

综合工程,得到结果:

分析二者,代码几乎相同,这意味着只需要shiftreg.v文件,就可以实现移位寄存器的功能,基于配置的编辑器,只是用来生成这个文件的工具。

分析例子工程的仿真波形:

数据从shiftin端输入,等待12个数据输入完后,shiftout端口才开始输出数据。但是,最早的taps输出是在shiftin输入数据后的3个时钟。

如今,需要弄清楚的是为什么是12个数据输入完后,才开始输出数据,而不是等待9个,或者15个?

首先,更改distance between taps这一参数,更改为4:

然后将例子工程里面的testbench导入自己建的工程中,进行仿真:

首先,将shift Register里面的参数改为与例子工程里面相同的参数,8,4,3目的是为了验证仿真出来的波形是否与例子工程仿真出来的波形一致,即检验此testbench的有效性。

产生的波形与例子工程一样,可以继续使用。

更改参数后,生成的仿真波形为:

此种情况下,数据从shiftin端输入,等待16(4x4)个数据输入完后,shiftout端口才开始输出数据。但是,最早的taps输出是在shiftin输入数据后的4个时钟。

再次更改shift Register里面的参数:

得到仿真波形:

此种情况下,数据从shiftin端输入,等待24(4x6)个数据输入完后,shiftout端口才开始输出数据。但是,最早的taps输出是在shiftin输入数据后的4个时钟。

更改参数为:

但是modelsim启动不了?

原因:shift Register 的taps number 修改了,生成的.v文件的端口也更改了,相应的testbench文档中端口信号线也要做出相应的更改。

启动modelsim报错:

.v文件端口声明:

.vt文件端口声明:

更改.vt文件端口声明:

启动modelsim,得到波形:

验证了猜想:数据从shiftin端输入,等待9(3x3)个数据输入完后,shiftout端口才开始输出数据。但是,最早的taps输出是在shiftin输入数据后的3个时钟。

(完结)

阅读 RAM-Based Shift Register(ALTSHIFT_TAPS) IP Core User Guide的更多相关文章

  1. RAM-Based Shift Register (ALTSHIFT_TAPS) IP Core-实现3X3像素阵列存储

    最近想要实现CNN的FPGA加速处理,首先明确在CNN计算的过程中,因为卷积运算是最耗时间的,因此只要将卷积运算在FPGA上并行实现,即可完成部分运算的加速 那么对于卷积的FPGA实现首先要考虑的是卷 ...

  2. Modelsim独立仿真Vivado Clocking Wizard IP Core

    工欲善其事,必先利其器.在使用Vivado自带的仿真软件仿真的时候,相对于更优秀的仿真工具Modelsim,效率低了很多,为了更高效的开发,我尝试着用Vivado级联Modelsim仿真,但是级联后还 ...

  3. Xilinx 7系列例化MIG IP core DDR3读写

    昨晚找了一下,发现DDR3读写在工程上多是通过例化MIG,调用生成IPcore的HDL Functional Model.我说嘛,自己哪能写出那么繁琐的,不过DDR读写数据可以用到状态机,后期再添砖加 ...

  4. 在EDK里面添加ISE IP core的方法

    (1)在ISE下,使用core generator,可以得到xilinx的IP的*.v和*.ngc 文件,将这两个文件拷贝出来: (2)在EDK下使用“Create or Import Periphe ...

  5. 使用xilinx ip core FIFO First- World First-Through (FWFT)模式的注意事项

    也许很多人知道xilinx ip core 中的fifo可以配成standard 模式和FWFT模式,并知道两者的区别是:standard模式下,当rd为高时,fifo会延时一个时钟输出数据(时序逻辑 ...

  6. IP Core 分类

    IP(Intelligent Property)核是具有知识产权核的集成电路芯核总称,是经过反复验证过的.具有特定功能的宏模块,与芯片制造工艺无关,可以移植到不同的半导体工艺中.到了SOC阶段,IP核 ...

  7. H.265 Video Encoder IP Core

    复制: 开源H.265硬件视频编码器H.265 Video Encoder IP Core是开源的H.265硬件视频编码器,实现了H.265(或叫HEVC)的大部分功能. 它由复旦大学专用集成电路与系 ...

  8. Vivado 2017封装自定义IP Core

    使用Vivado2017.3自定义IP Core.通常情况下,我们做设计采用模块化设计,对于已经设计好的一部分模块功能,就可以直接拿来调用,IP Core就是这样来的,一般来说我们看不到IP Core ...

  9. Shift Register(Using Submodule)

    /*************************************************** /  Shift Register module by Submodule /  Progra ...

随机推荐

  1. 【webdriver自动化】整理API框架(主要是关键字,具体例子在本地)

    1. 获取网页源码 pageSource = self.driver.page_source print pageSource.encode("gbk","ignore& ...

  2. extjs技术

    转载:http://www.cnblogs.com/willick/p/3168809.html 转载 :http://www.cnblogs.com/youring2/archive/2013/08 ...

  3. JavaWeb基础知识总结

    JavaWeb基础知识总结.   1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...

  4. jQuery中AJAX同步如何实现?

    jax请求默认的都是异步的如果想同步 async设置为false就可以(默认是true) var html = $.ajax({  url: "some.php",  async: ...

  5. TEST mathjax

    这里是第一个公式 $ F = ma^2 $ \[ \text{Reinforcement Learning} \doteq \pi_* \\ \quad \updownarrow \\ \pi_* \ ...

  6. python 实现 KNN 分类器——手写识别

    1 算法概述 1.1 优劣 优点:进度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 应用:主要用于文本分类,相似推荐 适用数据范围:数值型和标称型 1.2 算法伪代码 (1)计 ...

  7. JavaBasic_05

    方法 简述:实现特定功能的代码块 格式 修饰符: 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…){           函数体;           return 返回值;} 方法格式 ...

  8. sql数据查询基础笔记

    使用SELETE语句进行查询 语法 SELECT<列名> FROM<表名>  [ORDER BY <排序的列名>[ASC或DESC]] 1.查询所有的数据和列 SE ...

  9. Unity 3D接入ShareSDK流程2

    Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  10. js知识点: 数组

    1.行内元素  margin  padding 左右值都有效,上下值都无效 2.var ev = ev || window.event document.documentElement.clientW ...