Verilog卷积_Conv函数实现_MATLAB卷积_FPGA驱动VGA显示(1)MATLAB

看了奥本海姆的信号与系统的卷积和之后就想用FPGA实现一下,首先用MATLAB仿真,MATLAB有现成的卷积函数,用输入变量un卷积xn相当于xn通过一个累加系统。

卷积是倒序乘累加,但是如果看成两个多项式相乘相乘对象系数就是卷积对象,相乘结果系数就是卷积结果。以下是输入函数xn,系统函数hn(取un),xn累加结果,MATLAB自带卷积函数,我写的卷积函数的结果图:

输入xn是单位阶跃函数un的额时候:

输入xn是指数函数的时候: 

源码:

clear;clc;close all;

Scale = 1000;

un     = ones(1,Scale);
nun    =	0:length(un)-1;

%%这个是输入2^n的结果
% x     =	zeros(1,Scale);
% for r2 = 1:Scale/10
%    for r = 1:10
%         x(10*(r2-1)+r)       =   2^r;
%     end
% end

x     =     ones(1,Scale);
nx          =	0 : length(x)-1;

y_x     =	zeros(1,length(un) + length(x)-1);
for r = 1 :  length(un) + length(x)-1
    if r == 1 
        y_x(r)       =   x(r) ;
    else
        if r<=length(x)-1
            y_x(r)      =  y_x(r-1)  +  x(r) ;
        else
            y_x(r)      =  y_x(r-1) ;
        end
    end
end
ny_x = 1 : length(un) + length(x)-1;

my_y_hx  =  my_conv(un,x)
nmy_y_hx  =  0 : length(my_y_hx)-1

y_hx           =   conv(un,x);%my_conv(un,x);
ny_hx          =   0 : length(y_hx)-1;

subplot(511);
stem(nx,x);
xlabel('nx');
ylabel('x输入函数');
grid on;

subplot(512);
stem(nun,un);
xlabel('nun');
ylabel('un阶跃函数');
grid on;

subplot(513);
stem(ny_x,y_x);
xlabel('ny_x');
ylabel('y_x直接算递增的结果');
grid on;

subplot(514);
stem(nmy_y_hx,my_y_hx);
xlabel('nmy_y_hx');
ylabel('my_y_hx自己写的卷积结果');
grid on;

subplot(515);
stem(ny_hx,y_hx);
xlabel('ny_hx');
ylabel('y_hx卷积系统函数得出');
grid on;

我写的卷积: 

function y = my_conv( x,h )
nx = length(x);
nh = length(h);
y = zeros(1,nx+nh-1);
for index = 1:nx
    indexSum = x(index)*h;
    y(1,index:index+nh-1) = y(1,index:index+nh-1)+indexSum;
end
end

 之后就是将其Verilog化,见下一篇:https://blog.csdn.net/Mr_liu_666/article/details/103372507

FPGAVGA显示,见下下篇:https://blog.csdn.net/Mr_liu_666/article/details/103376238

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Verilog 实现卷积神经网络的简单代码示例: ``` module conv_layer ( input clk, input rst, input [7:0] in_data, output [7:0] out_data ); // 定义卷积核 reg [2:0] kernel [0:2][0:2] = { {2'b01, 2'b00, 2'b11}, {2'b01, 2'b10, 2'b01}, {2'b11, 2'b00, 2'b00} }; // 定义偏置项 reg [7:0] bias = 8'b00000010; // 定义输入和输出特征图 reg [7:0] input_fm [0:4][0:4]; reg [7:0] output_fm [0:2][0:2]; // 卷积操作 always @(posedge clk) begin if (rst) begin // 初始化输入特征图 input_fm <= 0; out_data <= 0; end else begin // 对于每个输出像素 for (int i = 0; i < 3; i = i + 1) begin for (int j = 0; j < 3; j = j + 1) begin // 计算卷积结果 int sum = 0; for (int k = 0; k < 3; k = k + 1) begin for (int l = 0; l < 3; l = l + 1) begin sum = sum + input_fm[i+k][j+l] * kernel[k][l]; end end sum = sum + bias; output_fm[i][j] <= sum; end end // 输出结果 out_data <= output_fm[1][1]; // 特征图平移 for (int i = 0; i < 4; i = i + 1) begin for (int j = 0; j < 4; j = j + 1) begin input_fm[i][j] <= input_fm[i+1][j]; end end input_fm[4][0] <= in_data; end end endmodule ``` 这个示例实现了一个大小为 5x5 的输入特征图上的 3x3 卷积层。它使用了一个固定的 3x3 卷积核和一个偏置项,并且在每次时钟上升沿时进行一次卷积操作,输出特征图的中心像素到 `out_data` 端口。同时,输入特征图也会向下平移一行,以便进行下一次卷积操作。 需要注意的是,这只是一个简单的示例,实际上实现卷积神经网络需要更多的模块和信号线,而且也需要更多的硬件资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值