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 |
|
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 (), //shiftout和taps中的数据一样,所以只用一个 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拉高以后,shiftout0,shiftout1,shiftout2,就输出了预想的值,证明我们的设计正确。