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

查看17道真题和解析