目录
6.多功能数据处理器
- 第一点:多功能数据处理器其实就是一个时序逻辑电路中的多路选择器,通过sel来对输出通道进行选择,实现功能,整体比较简单,写即可。
`timescale 1ns/1ns
module data_select(
input clk,
input rst_n,
input signed[7:0]a,
input signed[7:0]b,
input [1:0]select,
output reg signed [8:0]c
);
always@(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)
c <= 9'd0;
else
case(select)
2'd0: c <= a;
2'd1: c <= b;
2'd2: c <= a + b;
2'd3: c <= a - b;
endcase
end
endmodule
7.求两个数的差值
- 就是对于两个数字进行判断,采用a > b,a < b,综合即可。相对来说比较简单
`timescale 1ns/1ns
module data_minus(
input clk,
input rst_n,
input [7:0]a,
input [7:0]b,
output reg [8:0]c
);
always@(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)
c <= 9'd0;
else if(a > b)
c <= a - b;
else
c <= b - a;
end
endmodule
8.使用generate...for语句简化代码
- 第一点:数据替换,即将将首位数据进行颠倒;
- 第二点:采用generate...for语法,需要采用genvar来生成循环条件i,然后采用for循环语句进行循环,采用assign data_out[i] = data_in[7-i];即可,也比较简单,但是要熟练掌握,generate...for语法和语句,更利于提升效率。
`timescale 1ns/1ns
module gen_for_module(
input [7:0] data_in,
output [7:0] data_out
);
genvar i;
generate
for(i = 0;i < 8;i = i + 1)
begin
assign data_out[i] = data_in[7-i];
end
endgenerate
endmodule
9.使用子模块实现三输入数的大小比较
- 第一点:采用子模块的方式实现,所以要先生成compare的子模块,并且声明各个端口。
- 第二点:进行例化,该题的重点也是在这里,很多人采用软件思维的方式只会例化2次子模块,是将a,b比较之后的结果min_ab与c进行比较,进而得到最终的最小值。
- 但是这样是存在误区的,采用min_ab与c进行比较时,是上一时刻的a,b的最小值与此时的c的值进行比较,也就是拍数上是差一拍的,因此做不到比较同一拍下的a,b,c。
`timescale 1ns/1ns
module main_mod(
input clk,
input rst_n,
input [7:0]a,
input [7:0]b,
input [7:0]c,
output [7:0]d
);
wire [7:0] min_1,min_2;
compare compare_1(clk,rst_n,a,b,min_1);
compare compare_2(clk,rst_n,a,c,min_2);
compare compare_3(clk,rst_n,min_1,min_2,d);
endmodule
module compare(input clk,input rst_n,input [7:0] data_a,input [7:0] data_b,output reg [7:0] min);
always@(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)
min <= 8'd0;
else if(data_a > data_b)
min <= data_b;
else
min <= data_a;
end
endmodule
10.使用函数实现数据大小端转换
- 可以采用function的方式,生成一个函数;也可以采用generate的方式,进行处理;也可以采用assign语句,多次进行处理,多次练习,融会贯通。
`timescale 1ns/1ns
module function_mod(
input clk,
input rst_n,
input [3:0]a,
input [3:0]b,
output [3:0]c,
output [3:0]d
);
assign c = data_rev(a);
assign d = data_rev(b);
function [3:0] data_rev;
input [3:0] data_in;
begin
data_rev[0] = data_in[3];
data_rev[1] = data_in[2];
data_rev[2] = data_in[1];
data_rev[3] = data_in[0];
end
endfunction
endmodule