/*
边缘检测、滤波等相关模板的移位寄存器
假设在rom中文件夹下以wod中的数据存放,列加行的值作为该 数的地址
现在每次取出3列数据为一组,如第一列abc,第二例def,第三列ghi
使用shifter_register ip核来实现这种功能,可以利用这种方法实现流水线操作*/
module left_right_register(
input clk,
input rst_n,
output [7:0] shiftout0,
output [7:0] shiftout1,
output [7:0] shiftout2
);
wire shift_en;
wire [7:0] cnt;
wire [7:0] in;
counter counter(
.clk(clk),
.rst_n(rst_n),
.shift_en(shift_en),//输出使能信号
.cnt(cnt)//给rom地址信号
);
my_rom my_rom(
.address(cnt),
.clock(clk),
.q(in)
);
shift_register shift_register(
.clk(clk),
.rst_n(rst_n),
.in(in),
. shift_en(shift_en),
.shiftout0(shiftout0),
.shiftout1(shiftout1),
.shiftout2(shiftout2)
);
endmodule
module counter(
input clk,
input rst_n,
output reg shift_en,
output reg [7:0]cnt
);
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
cnt<=0;
shift_en<=0;
end
else begin
if(cnt>=16)//表示移位寄存器中的两个fifo值已经移入
begin
cnt<=cnt+1;
shift_en<=1;
end
else
cnt<=cnt+1;
end
endmodule
module shift_register(
input clk,
input rst_n,
input [7:0] in,
output shift_en,
output [7:0] shiftout0,
output [7:0] shiftout1,
output [7:0] shiftout2
);
wire [15:0] taps;
assign shiftout0=shift_en?in:0;
assign shiftout1=shift_en?taps[7:0]:0;
assign shiftout2=shift_en?taps[15:8]:0;
my_shift my_shift(
.clock(clk),
.shiftin(in),//rom提供的初始数据
.shiftout(),
.taps(taps)
);