IPコアのシフトレジスタとアプリケーションの転送

EDITORIAL言葉

画像の時間のための方法の多くを行う私たちはしばしばテンプレート演算子を使用する必要があります(例えば、ソーベルエッジ検出、メディアンフィルタリング、平均値フィルタリングなど)、これらの問題に対処するための時間を、私たちは使用することができ、アルテラのシフトレジスタを提供するIPをコアを簡素化するために我々は、設計効率を向上させるために設計します。このセクションでは、夢の翼の兄弟と私たちはシフトの操作のための適切なテンプレートを一緒に検討するには、登録したIP コアの使用を。

 

機能要件

 

ROMに、以下に示すようにして格納されたデータは、アドレスとして行番号の列の加算値は、(例えば、アドレスEが8 + 1 = 9である)と仮定する。

 

住所

0

1

2

3

4

5

6

7

0

A

D

グラム

J

メートル

P

AA

BB

8

B

E

時間

K

n個

Q

DD

CC

16

C

F

リットル

インクルード

R

FF

24

S

トン

V

ワット

RR

GG

HH

......

から

インクルード

VV

WW

QQ

II

JJ

 

画像処理の分野において、又は平均ソーベルフィルタリングアルゴリズムを達成するために、図1に示すように、フォーマット・データに応じて、3×3マトリックスを抽出する必要がある。3各:(今データの最初の列のように、データのセットを削除したいです:A、B、データの第2列のC:データの3列目のF D、E、G、H、I)

ソリューション:私はここに紹介したいと思いますが、IP Shift_registerと呼ばれるコアは、この機能を実現するだけでなく、非常に重要な点は、我々はそれがシフトとして見られるならば、我々は、業務を合理化するために、このメソッドを使用することができるということですビット登録「FIFO」こと。

我々は、IPを使用する場合2下に示すように、コアの構成を「FIFO」、我々はROM番号からの原則を取る次の図で表すことができます。

2があり、「FIFO」は、長さが8です。各アドレスプラス1での入力ポートからROMデータ。

ROMアドレス線を有するカウンタcnt、各追加のCNTとして[7:0]に1から、ROMの意志出力新しいデータ。ポートアクセスshift_register、shift_registerながら、すべてのデータが一度同期前方にシフトされ、場合にまでカウント 16:

 

 

 

次のクロックは、値shiftout0ながら開始する時間が来るSHIFTOUT1、SHIFTOUT2

ステップ

まず、深さ 256は、バイトのビット幅が8 の初期値0 255 ROMのIP コア(参考:5. 2 )。

次に、設定シフトレジスタのIP コアを:

右側に IPの編集領域のコア検索、内型のシフトメニューバーで見つけ、ダブルクリックし、[シフト・レジスタ]

 言語の種類を選択したVerilog、および名前を、クリックし、[OK]

設定ビット幅 8ビットは、提供される2 番目の「FIFO 」、各「FIFO の」深さ8 その後、クリックし、[ NEXT ]

   

選択し shift_reg_inst.vをクリックし、[完了]

トップレベルのアーキテクチャ設計

 

モジュールの機能

モジュール名

機能説明

カウンタ

ロム指定されたアドレス、および出力イネーブルシフトレジスタ

ROM

ロムIPコアは、ソースデータを提供する責任があります

shift_register

出力データのいくつかのフォーム

shift_reg

サブモジュールを接続します

そして、ポートは、インターコネクタを説明します


トップレベルのモジュールのポートの説明

ポート名

ポート説明

CLK

システムクロック入力

RST_N

システムリセット

shiftout0

データ出力

SHIFTOUT1

データ出力

SHIFTOUT2

データ出力

導入された内部配線システム

接続名

配線の手順

shift_en

出力イネーブル信号

CNT

アドレスに信号をROM

ローマ初期データが提供さ

コードの説明


コードカウンタモジュール

/ ************************************************* ***          

 *エンジニア:    ドリーム・ブラザーウイング

 * QQ:761664056

 機能のModule1 *の与えられた:ROMのアドレスを、シフトレジスタの出力イネーブル****************************** ************************************************************ /

00   モジュールの  カウンタ

CLK 01         // システム・クロック入力

02                          rst_n,  //系统复位

03                          cnt,        //rom地址

04                          shift_en //输出使能信号

05                      );

06      //模块输入

07      input clk;//系统时钟输入

08      input rst_n;//系统复位

09      //模块输出

10      output reg [7:0] cnt;//rom地址

11      output reg shift_en;//输出使能信号

12

13      always @ (posedge clk or negedge rst_n)

14          begin

15              if (!rst_n)         //复位清零

16                  begin

17                      cnt <= 0;

18                      shift_en <= 0;

19                  end

20              else

21                  begin

22                      if (cnt >= 16)      //cnt计数为16的时候表示shift_register中的两个fifo值已经移入

23                          begin

24                              cnt <= cnt+1;

25                              shift_en <= 1;

26                          end

27                      else

28                          cnt <= cnt + 1;

29                  end

30          end

31

32

33  endmodule 

Shift_register模块代码

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 *   E_mail        :   [email protected]

 *   The module function:进行移位输出 *****************************************************/

00 module shift_register (

01 clk, //系统时钟

02 rst_n, //系统复位

03 in,  //rom给出的数据

04 shiftout0, //输出数据

05 shiftout1, //输出数据

06 shiftout2, //输出数据

07 shift_en //出使能

08 );

09 //系统输入

10 input clk; //系统时钟

11 input rst_n;//系统复位

12 input [7:0] in;//rom给出的数据

13 input shift_en;//出使能

14 //系统输出

15 output [7:0] shiftout0; //输出数据

16 output [7:0] shiftout1;//输出数据

17 output [7:0] shiftout2;//输出数据

18 //定义中间连线

19 wire [15:0] taps;

20

21 assign shiftout0 = shift_en ? in : 0 ;//shift_en为真值时,shiftout0 = in

22 assign shiftout1 = shift_en ? taps [7:0] : 0 ;//shift_en为真值时,shiftout1 = taps [7:0]

23 assign shiftout2 = shift_en ? taps [15:8] : 0 ;//shift_en为真值时,shiftout2 = taps [15:8]

24 //调用IP

25 my_shift my_shift_inst (

26 .clock ( clk ), //系统时钟

27 .shiftin ( in ), //rom给出的数据

28 .shiftout (), //shiftouttaps中的数据一样,所以只用一个

29 .taps ( taps )

30    );

31

32 endmodule

顶层连接

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 

 *   The module function:顶层连接*****************************************************/

00  module shift_reg ( 

01                          clk,    //系统时钟输入

02                          rst_n,  //系统复位

03                          shiftout0, //输出有效数据

04                          shiftout1, //输出有效数据

05                          shiftout2  //输出有效数据

06                      );

07      //系统输入

08      input clk;  //系统时钟输入

09      input rst_n;//系统复位  

10      //系统输出

11      output [7:0] shiftout0; //输出有效数据

12      output [7:0] shiftout1; //输出有效数据

13      output [7:0] shiftout2; //输出有效数据

14      //定义中间连线

15      wire [7:0] cnt; //rom的地址

16      wire [7:0] in;  //rom中的数据

17      wire shift_en;  //输出使能

18      //调用rom

19      my_rom  my_rom_inst (

20                                  .address ( cnt ), //rom的地址

21                                  .clock ( clk ), //时钟

22                                  .q (in )                //rom的输出数据

23                              );

24      //实例化counter

25      counter counter (

26                                  .clk(clk),      //系统时钟输入

27                                  .rst_n(rst_n),//系统复位

28                                  .cnt(cnt),  //rom的地址

29                                  .shift_en(shift_en)//输出使能

30                              ); 

31      //实例化shift_register

32      shift_register  shift_register (

33                                    .clk(clk),      //系统时钟输入

34                                    .rst_n(rst_n), //系统复位

3                                     .in(in),        //移位寄存器的输入数据

36                                    .shift_en(shift_en), //输出使能

37                                    .shiftout0(shiftout0), //输出有效数据

38                                    .shiftout1(shiftout1), //输出有效数据

39                                    .shiftout2(shiftout2)   //输出有效数据

40                                 );

41

42  endmodule 

编写完可综合代码之后,查看RTL视图如下:

 

RTL视图可以看出,代码综合以后的结果和我们设计的系统框图一致,说明顶层模块级联关系正确,接下来编写测试代码如下:

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 *   The module function :shift_reg 的仿真测试:*****************************************************/

00 `timescale 1ns/1ps  //时间单位和精度定义

01

02 module shift_reg_tb;

03 //系统输入

04 reg clk; //系统时钟输入

05 reg rst_n;//系统复位

06 //系统输出

07 wire [7:0] shiftout0; //输出有效数据

08 wire [7:0] shiftout1; //输出有效数据

09 wire [7:0] shiftout2; //输出有效数据

10

11 initial begin

12 clk = 1;

13 rst_n = 0;

14 # 200.1

15 rst_n = 1;

16 end

17

18 always # 10 clk = ~clk; //50M的时钟

19

20 shift_reg shift_reg ( 

21 .clk(clk),    //系统时钟输入

22 .rst_n(rst_n),  //系统复位

23 .shiftout0(shiftout0), //输出有效数据

24 .shiftout1(shiftout1), //输出有效数据

25          .shiftout2(shiftout2)  //输出有效数据

26 );

27

28 endmodule

仿真分析

shift_en拉高以后,shiftout0shiftout1shiftout2,就输出了预想的值,证明我们的设计正确。

 

おすすめ

転載: www.cnblogs.com/mengyi1989/p/11518379.html