用 verilog 实现 minst 数字识别

用verilog实现minst 的数字识别, 可以用modelsim看结果, 如果要部署到fpga上, PL的资源要非常非常多

代码下载:(包含5个仿真文件)

https://download.csdn.net/download/howard789/13715547

https://github.com/howard789/verilog_mnist

以数字2的仿真文件为例, 可以显示以下的结果,因为最终0-9里 数字2的得分最高,所以判断是2, 这里只是要判断最有可能的数字, 就不再化成几率的形式了

 

 

代码里的x坐标和y坐标,是假设在480*272的lcd上显示, 因为minst的像素是28*28的.我们假每4个LCD的像素点代表minst的一个点,那就是在中间红色的区域才是数字显示的区域

部分代码如下,完整代码可以下载

module digital_recognition #(
	parameter	[10:0]		UP			=	108,
	parameter	[10:0]		DOWN		=	164,
	parameter	[10:0]		LEFT		=	212,
	parameter	[10:0]		RIGHT		=	269,
	parameter	[10:0]		EACH_WIDE	=   2,
	parameter           	DEBIT       =   22

)(
	//system signals
	input								clk, 
	input								rst_n,
	
	//binarization 
	input			   [ 7:0]			dq_i,
	input			   [10:0]      		xpos,
	input			   [10:0]      		ypos,

	output	  reg      [ 4:0]		    digit

);

wire res_done_x784;

reg 	[ 2:0]	  done_all_res;

reg  signed [DEBIT:0]  res_0_sum;
reg  signed [DEBIT:0]  res_1_sum;
reg  signed [DEBIT:0]  res_2_sum;
reg  signed [DEBIT:0]  res_3_sum;
reg  signed [DEBIT:0]  res_4_sum;
reg  signed [DEBIT:0]  res_5_sum;
reg  signed [DEBIT:0]  res_6_sum;
reg  signed [DEBIT:0]  res_7_sum;
reg  signed [DEBIT:0]  res_8_sum;
reg  signed [DEBIT:0]  res_9_sum;



//****************************    B输入    *******************************

localparam signed [DEBIT:0]  B_0 = - 23'd4599;
localparam signed [DEBIT:0]  B_1 = - 23'd3332;
localparam signed [DEBIT:0]  B_2 = - 23'd4722;
localparam signed [DEBIT:0]  B_3 = - 23'd5087;
localparam signed [DEBIT:0]  B_4 = - 23'd3820;
localparam signed [DEBIT:0]  B_5 = - 23'd3477;
localparam signed [DEBIT:0]  B_6 = - 23'd4286;
localparam signed [DEBIT:0]  B_7 = - 23'd3446;
localparam signed [DEBIT:0]  B_8 = - 23'd7252;
localparam signed [DEBIT:0]  B_9 = - 23'd5047;


assign rst_valid =((xpos == LEFT - 1) && (ypos == UP +1)) || !rst_n;

always @ (posedge clk or negedge rst_n) begin
	if(rst_n == 1'b0) done_all_res <= 1'b0;
    else done_all_res <= {done_all_res[1:0], res_done_x784};
end

wire		  add_b;
wire		  decide_number;





always @ (posedge clk) begin
	if(!rst_n) 
		digit <= 1'b0;
		
	if(done_all_res[2]) begin	
	/*
		$monitor ($time, ,"res_0_sum = %d",res_0_sum);
		$monitor ($time, ,"res_1_sum = %d",res_1_sum);
		$monitor ($time, ,"res_2_sum = %d",res_2_sum);
		$monitor ($time, ,"res_3_sum = %d",res_3_sum);
		$monitor ($time, ,"res_4_sum = %d",res_4_sum);
		$monitor ($time, ,"res_5_sum = %d",res_5_sum);
		$monitor ($time, ,"res_6_sum = %d",res_6_sum);
		$monitor ($time, ,"res_7_sum = %d",res_7_sum);
		$monitor ($time, ,"res_8_sum = %d",res_8_sum);
		$monitor ($time, ,"res_9_sum = %d",res_9_sum);
*/
        if ((res_0_sum > res_1_sum ) &&(res_0_sum > res_2_sum ) && (res_0_sum > res_3_sum ) && (res_0_sum > res_4_sum ) && (res_0_sum > res_5_sum ) && (res_0_sum > res_6_sum ) && (res_0_sum > res_7_sum ) && (res_0_sum > res_8_sum ) && (res_0_sum > res_9_sum ) )
        	digit <= 4'd0;
		else if ((res_1_sum > res_0_sum ) &&(res_1_sum > res_2_sum ) &&(res_1_sum > res_3_sum ) &&(res_1_sum > res_4_sum ) &&(res_1_sum > res_5_sum ) &&(res_1_sum > res_6_sum ) &&(res_1_sum > res_7_sum ) &&(res_1_sum > res_8_sum ) &&(res_1_sum > res_9_sum ) )
			digit <= 4'd1;
		else if ((res_2_sum > res_0_sum ) &&(res_2_sum > res_1_sum ) &&(res_2_sum > res_3_sum ) &&(res_2_sum > res_4_sum ) &&(res_2_sum > res_5_sum ) &&(res_2_sum > res_6_sum ) &&(res_2_sum > res_7_sum ) &&(res_2_sum > res_8_sum ) &&(res_2_sum > res_9_sum ) )
     		digit <= 4'd2;
     	else if ((res_3_sum > res_0_sum ) &&(res_3_sum > res_1_sum ) &&(res_3_sum > res_2_sum ) &&(res_3_sum > res_4_sum ) &&(res_3_sum > res_5_sum ) &&(res_3_sum > res_6_sum ) &&(res_3_sum > res_7_sum ) &&(res_3_sum > res_8_sum ) &&(res_3_sum > res_9_sum ) )
		     digit <= 4'd3;
		else if ((res_4_sum > res_0_sum ) &&(res_4_sum > res_1_sum ) &&(res_4_sum > res_2_sum ) &&(res_4_sum > res_3_sum ) &&(res_4_sum > res_5_sum ) &&(res_4_sum > res_6_sum ) &&(res_4_sum > res_7_sum ) &&(res_4_sum > res_8_sum ) &&(res_4_sum > res_9_sum ) )
		     digit <= 4'd4;
		else if ((res_5_sum > res_0_sum ) &&(res_5_sum > res_1_sum ) &&(res_5_sum > res_2_sum ) &&(res_5_sum > res_3_sum ) &&(res_5_sum > res_4_sum ) &&(res_5_sum > res_6_sum ) &&(res_5_sum > res_7_sum ) &&(res_5_sum > res_8_sum ) &&(res_5_sum > res_9_sum ) )
		     digit <= 4'd5;
		else if ((res_6_sum > res_0_sum ) &&(res_6_sum > res_1_sum ) &&(res_6_sum > res_2_sum ) &&(res_6_sum > res_3_sum ) &&(res_6_sum > res_4_sum ) &&(res_6_sum > res_5_sum ) &&(res_6_sum > res_7_sum ) &&(res_6_sum > res_8_sum ) &&(res_6_sum > res_9_sum ) )
		     digit <= 4'd6;
		else if ((res_7_sum > res_0_sum ) &&(res_7_sum > res_1_sum ) &&(res_7_sum > res_2_sum ) &&(res_7_sum > res_3_sum ) &&(res_7_sum > res_4_sum ) &&(res_7_sum > res_5_sum ) &&(res_7_sum > res_6_sum ) &&(res_7_sum > res_8_sum ) &&(res_7_sum > res_9_sum ) )
		     digit <= 4'd7;
		else if ((res_8_sum > res_0_sum ) &&(res_8_sum > res_1_sum ) &&(res_8_sum > res_2_sum ) &&(res_8_sum > res_3_sum ) &&(res_8_sum > res_4_sum ) &&(res_8_sum > res_5_sum ) &&(res_8_sum > res_6_sum ) &&(res_8_sum > res_7_sum ) &&(res_8_sum > res_9_sum ) )
		     digit <= 4'd8;
		else if ((res_9_sum > res_0_sum ) &&(res_9_sum > res_1_sum ) &&(res_9_sum > res_2_sum ) &&(res_9_sum > res_3_sum ) &&(res_9_sum > res_4_sum ) &&(res_9_sum > res_5_sum ) &&(res_9_sum > res_6_sum ) &&(res_9_sum > res_7_sum ) &&(res_9_sum > res_8_sum ) )
		     digit <= 4'd9;
		else 
			digit <= 4'd10;     

    end 
end

 

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值