数字逻辑设计的三大设计模式(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】


全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务