Shift_RAM ip核的使用——ROM调用mif文件、传至Shift_RAM输出

前言

最近在做sobel、canny边缘检测需要使用shift_ram做3*3卷积模板,在这一块纠结过一阵子,最后还是想写篇博客沉淀一下。这篇博客就举例记录一下: mif文件输入shift_ram ip核,生成2条tap查看输出效果

1.创建mif文件,通过ROM ip核调用该mif文件

1.1创建mif文件

   新建mif文件,保持默认的256字数和8位字长
在这里插入图片描述
在这里插入图片描述

1.2顺序填充mif文件

  可以使用mif生成软件,也可以按照下图所示
  顺序填充mif,按照顺序填充的好处在于,modelsim仿真时,可以更方便查看结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述  保存为mif文件,等待ROM ip核调用

1.3创建ROM ip核调用mif文件

在这里插入图片描述下图中按照mif文件的大小来配置ROM的大小
在这里插入图片描述
下图中的‘q’out port可选可不选,区别在于,勾选之后‘q’数据会被存入寄存器,由此带来一个时钟信号的延迟
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.计数器读取mif文件中的数据

2.1写一个0-15的循环计数器

这里以0-15的计数器为例,方便查看modelsim仿真数据,当然也可以配置成其他的
module counter(
	input clk_in,               //时钟信号
	input rst_n,                //复位信号
	output reg [7:0] cnt,       //计数值,在后续步骤中,这个cnt也可以作为ROM地址
	output reg shift_en         //进位信号,在后续步骤中,也可以做输出使能,
);

//0-16循环计数,计满时
always@(posedge clk_in or negedge rst_n)
begin
	if(!rst_n)
		begin
			cnt <= 8'b0;
			shift_en <= 1'b0;
		end
	else
		begin                        //8'd16表示8位二进制数,大小为16
			if(cnt >= 8'd16)
				begin
					cnt <= 8'b0;     //等于16的瞬间被置为0,因此是0-15的计数器
					shift_en <= 1'b1;
				end
			else
				cnt <= cnt + 1'b1;
		end
end
endmodule

2.2实例化ROM ip核、调用计数器模块

MY_ROM	MY_ROM_inst (
	.address ( cnt ),
	.clock 	( clk_in ),
	.q 		( in )
);
counter counter_inst(
	.clk_in ( clk_in ),
	.rst_n ( rst_n ),
	.cnt ( cnt ),	//ROM地址
	.shift_en ( shift_en )		//输出使能
);

3.从mif中读取出来的数据传入shift_ram ip核

3.1创建shift_ram ip核

在这里插入图片描述
Shift_ram配置说明
ROM输出的数据是8位的,所以要输入Shift_ram的话,shift_in需要配置为8位
这里选择2条taps输出,另一条是shiftout,所以一共是3条输出
distance根据需求配置,例如,输入一张像素是100*120的图片,那么distance可以配置成100
在这里插入图片描述
在这里插入图片描述

3.2实例化Shift_ram ip核

shift_register shift_register_inst(
	.clk_in ( clk_in ),
	.rst_n ( rst_n ),
	.shift_en ( shift_en ),
	.in ( in ),				//从ROM输入的数据

	.shiftout0 ( shiftout0 ),
	.shiftout1 ( shiftout1 ),
	.shiftout2 ( shiftout2 )
);

4.modelsim仿真查看shift_ram输出数据

4.1生成TestBench模板

在这里插入图片描述

4.2顶层文件添加激励、工程添加仿真文件

4.2.1顶层文件添加激励

`timescale 1 ns/ 1 ns
module shiftram_vlg_tst();
// test vector input registers
reg clk_in;
reg rst_n;
// wires                                               
wire [7:0]  cnt;
wire [7:0]  in;
wire shift_en;
wire [7:0]  shiftout0;
wire [7:0]  shiftout1;
wire [7:0]  shiftout2;
// assign statements (if any)                          
shiftram i1 (
	.clk_in(clk_in),
	.cnt(cnt),
	.in(in),
	.rst_n(rst_n),
	.shift_en(shift_en),
	.shiftout0(shiftout0),
	.shiftout1(shiftout1),
	.shiftout2(shiftout2)
);
initial                                                
begin
	clk_in = 0;
	rst_n = 0;
	#100 rst_n = 1;
end
always #10 clk_in = ~clk_in;
endmodule

4.2.2工程添加仿真文件

shiftram_vlg_tst这个提前复制出来,后面要用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3modelsim仿真

在这里插入图片描述
在这里插入图片描述
工程链接点我点我点我!

posted on 2023-05-07 10:25  naive156  阅读(6)  评论(0编辑  收藏  举报  来源

导航