数字逻辑设计的三大设计模式(1)—并行处理模式
在进行专业知识讲解前,我们先回顾一下小学数学,基本就是这个“设计模式”的方式解决的。例如,老师会告诉你,这道题是“追逐问题”等等,然后套公式得到结果。后面我将对着三大设计模式(并行处理模式、流水线处理模式、时分复用模式)分三节进行重点阐述,并通过代码的方式展现例子,在FPGA设计中十分重要!
1、并行化思想的引入
并行化系统最少需要三个部分。第一部分:“输入数据分发部分”,主要功能是将高速输入的数据均匀分配给各个处理模块。第二部分:“并行处理部分”,针对低速的组合逻辑在一个相对较长时间内进行的处理。第三部分:“合并输出部分”,这部分完成结果再进行汇总合并以及可能得到的结果的后处理。如下图所示:

2、时序控制部分
本次的时序控制部分采用编码的方法,其中采用编码方式对应的数据输入分发模块结构如下图所示:

该时序控制部分,通过控制不同的采样相位使能信号,来控制采样信号的顺序。使能信号依次激活处理模块前端的D触发器进行采样。
3、合并输出模块
合并输出模块的情况较为复杂,所以要伺机而动。其中一个处理方式是需要一个计数器知道数据是否处理完,如果处理完则进行最后结果的合并。这个计数器主要在时序控制部分,数据处理完毕则输出一个使能信号给合并输出模块进行运算。无论什么方式,都建议输出一个数据有效的使能输出给外部模块。
4、并行化累加器的代码部分
输入数据信号位宽为8bit,输出数据位宽为17bit,每输入128个数据需要输出一次累加结果。
module sum_parallel_timer( input[7:0]input_data , input data_start , input CLK , input RST , output reg[16:0]sum , output reg sum_enable ); //定义变量类型 reg [7:0]count; reg [2:0] count1 reg[7:0]data1,data2,data3,data4; reg[14:0]sum1,sum2,sum3,sum4; //7bit的计数器 always@(posedge CLK&nbs***bsp;negedge RST) begin if(!RST) begin count<=8'h00; end else if(data_start)begin count<=8'h7f+8'h04; end end else if(count!=8'h00)begin count<=count-8'h01; end else begin count<=8'h00; end // always@(posedge CLK&nbs***bsp;negedge RST) begin if(!RST) begin count1<=3'b000; end else if(count==8'h01)begin count1<=3'b111; end else if(count1!=3'b000)begin count1<=count1-3'b001; end end //数据分发 always@(posedge CLK&nbs***bsp;negedge RST) begin if(!RST)begin data1<=8'h00; data2<=8'h00; data3<=8'h00; data4<=8'h00; end else if(count!=8'h00)begin case(count[1:0]) 2'b11:data1<=input_data; 2'b10:data2<=input_data; 2'b01:data3<=input_data; 2'b00:data4<=input_data; endcase end else begin data1<=8'h00; data2<=8'h00; data3<=8'h00; data4<=8'h00; end end //数据处理 always@(posedge CLk&nbs***bsp;negedge RST) begin if(!RST)begin sum1<=15'h0000; sum2<=15'h0000; sum3<=15'h0000; sum4<=15'h0000; end else begin case(count[1:0]) 2'b11:sum1<=sum1+{7'h00,data1}; 2'b10:sum2<=sum2+{7'h00,data2}; 2'b01:sum3<=sum3+{7'h00,data3}; 2'b00:sum4<=sum4+{7'h00,data4}; endcase end end always@(posedge CLK&nbs***bsp;negedge RST) begin if(!RST)begin sum<=17'h00000; end else begin sum<={2'h0,sum1}+{2'h0,sum2}+{2'h0,sum3}+{2'h0,sum4}; end end always@(posedge CLK&nbs***bsp;negedge RST) begin if(!RST)begin sum_enable<=1'b0; end else if(count1==3'b001)begin sum_enable<=1'b1; end else begin sum_enable<=1'b0; end end endmodule
喜欢本文的同学欢迎收藏点赞多多留言 ,本文原发于【FPGA hdl】