Verilog 将8位bmp转换为半色调bmp

Verilog 将8位bmp转换为半色调bmp,verilog,Verilog,我现在正在详细解释我的问题,因为我意识到我没有很好地解释我的问题 我是Verilog的初学者。为了学习这门语言,我正在编写一些示例应用程序。 目前我正在编写Verilog代码,使用该算法将8位BMP图像转换为半色调BMP图像。 基本上,我正在使用上述算法将8位像素转换为1位 我在第555页的书中找到了这个算法的示例代码。我已经成功地在ModelSim中模拟了设计 问题是给出了一个大小为6 x 8的图像的示例,但为了学习和练习,我正在尝试将此代码转换为不同的格式和大小。作为第一个目标,我正在尝试修

我现在正在详细解释我的问题,因为我意识到我没有很好地解释我的问题

我是Verilog的初学者。为了学习这门语言,我正在编写一些示例应用程序。
目前我正在编写Verilog代码,使用该算法将8位BMP图像转换为半色调BMP图像。 基本上,我正在使用上述算法将8位像素转换为1位

我在第555页的书中找到了这个算法的示例代码。我已经成功地在ModelSim中模拟了设计

问题是给出了一个大小为6 x 8的图像的示例,但为了学习和练习,我正在尝试将此代码转换为不同的格式和大小。作为第一个目标,我正在尝试修改这段代码(我已经很好地理解了),以处理大小为1000 x 1000的图像。由于该示例仅适用于48像素(6 x 8),因此手动在模块内编写指令更容易,如下面给出的代码所示。但如果我有1000000像素(1000 x 1000),我该如何更改代码。 我写不出这样的方程式:

  PPDU a0(err_1,htpv_1[1],8'b00,8'b00,8'b00,8'b00,pixel_1);
1000000手动(请参见下面给出的代码)

我想一定有办法使这项工作自动化

在C语言中,我可以使用for循环来自动完成许多事情。但作为Verilog的新手,我无法继续。如果有人能给我指出一个有用的链接,我真的很抱歉

// pixel processor datapath unit//
module PPDU(err_0,htpv,err_1,err_2,err_3,err_4,pv);
output [7:0]err_0;
output htpv;
input [7:0]err_1,err_2,err_3,err_4,pv;
wire [9:0]cpv,cpv_round,e_av;
parameter w1=2,w2=8,w3=4,w4=2;
parameter threshold =128;
assign e_av=(w1*err_1+w2*err_2+w3*err_3+w4*err_4)>>4;
assign cpv=pv+e_av;
assign cpv_round=(cpv<threshold)?0:255;
assign htpv=(cpv_round==0)?0:1;
assign err_0=cpv-cpv_round;
endmodule

module image_converter (pixel_1,pixel_2,pixel_3,pixel_4,pixel_5,pixel_6,pixel_7,pixel_8,pixel_9,
   pixel_10,pixel_11,pixel_12,pixel_13,pixel_14,pixel_15,pixel_16,pixel_17,
   pixel_18,pixel_19,pixel_20,pixel_21,pixel_22,pixel_23,pixel_24,pixel_25,
   pixel_26,pixel_27,pixel_28,pixel_29,pixel_30,pixel_31,pixel_32,pixel_33,
   pixel_34,pixel_35,pixel_36,pixel_37,pixel_38,pixel_39,pixel_40,pixel_41,
   pixel_42,pixel_43,pixel_44,pixel_45,pixel_46,pixel_47,pixel_48,htpv_1,
      htpv_2,htpv_3,htpv_4,htpv_5,htpv_6
      );
 input [7:0]pixel_1,pixel_2,…..,pixel_47,pixel_48;
 output [1:8]htpv_1,htpv_2,htpv_3,htpv_4,htpv_5,htpv_6;
 wire [7:0]err_1,err_2,……., err_47,err_48;
 PPDU a0(err_1,htpv_1[1],8'b00,8'b00,8'b00,8'b00,pixel_1);
 ...
 PPDU a7(err_8,htpv_1[8],err_7,8'b00,8'b00,8'b00,pixel_8);                       
 PPDU b1(err_9,htpv_2[1],8'b00,8'b00,err_1,err_2,pixel_9);
 ...     PPDU b8(err_16,htpv_2[8],err_15,err_7,err_8,8'b00,pixel_16);
 PPDU c1(err_17,htpv_3[1],8'b00,8'b00,err_9,err_2,pixel_17);
 ….
 PPDU c8(err_24,htpv_3[8],err_23,err_15,err_16,8'b00,pixel_24);
 PPDU d1(err_25,htpv_4[1],8'b00,8'b00,err_17,err_18,pixel_25);
 ….
 PPDU d8(err_32,htpv_4[8],err_31,err_23,err_24,8'b00,pixel_32);
 PPDU e1(err_33,htpv_5[1],8'b00,8'b00,err_25,err_26,pixel_33);
 ….
 PPDU e8(err_40,htpv_5[8],err_39,err_31,err_32,8'b00,pixel_40);
 PPDU fi(err_41,htpv_6[1],8'b00,8'b00,err_33,err_34,pixel_41);
 ….
 PPDU f8(err_48,htpv_6[8],err_47,err_39,err_40,8'b00,pixel_40);  
 end
 endmodule
//像素处理器数据路径单元//
模块PPDU(错误0、htpv、错误1、错误2、错误3、错误4、pv);
输出[7:0]错误0;
输出htpv;
输入[7:0]错误1、错误2、错误3、错误4、pv;
电线[9:0]cpv,cpv_圆形,e_av;
参数w1=2,w2=8,w3=4,w4=2;
参数阈值=128;
分配e_av=(w1*err_1+w2*err_2+w3*err_3+w4*err_4)>>4;
分配cpv=pv+e_av;
分配cpv_轮=(cpv两个想法:

  • 您可以使用
    generate
    语句作为一种循环来实例化数量过多而无法键入的模块。我对这种结构不太熟悉,但谷歌搜索这个关键字可能会为您指明正确的方向

  • 虽然verilog是一种硬件描述语言,但没有任何东西要求您实际手动写出文件。您可以随意使用任何编程语言来生成verilog文件(Perl是我的最爱)。如果您必须根据某种算法生成100万个模块,那么您可以编写一个简单的脚本,打印100万行的verilog文件。您不必手动编写


  • 这听起来像是在为每个像素实例化一个模块。这一切都很好,但最终将使用大量硬件处理1000x1000个图像,因为每个模块都是一组门和触发器。这将导致您“一次”转换整个图像,这也意味着您必须“一次”将整个图像转换到此硬件这是一堆别针

    您可能想做的是:

    • 将图像存储在内存中,然后编写一个状态机来读取内存的相关部分,执行抖动并将其写回
    • 通过一些逻辑来流化图像,这些逻辑只保留了足够的关于先前像素的知识来执行抖动。我不太熟悉F-S抖动,但它可能只需要知道正在处理的像素上方的一行或两行