VL6 多功能数据处理器:根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a,b为8bit有符号数,当select信号为0,输出a;当select信号为1,输出b;当select信号为2,输出a+b;当select信号为3,输出a-b.
接口信号图如下:
always @(posedge clk or negedge rst_n)begin
if(~rst_n)
c <= 9'b0;
else
case(select)
2'b00: c <= a;
2'b01: c <= b;
2'b10: c <= a+b;
2'b11: c <= a-b;
default: c <= 9'b0;
endcase
end
位拼接,补齐符号位(当a或b有一个是无符号数使用,或将输入、输出、中间变量全部定义位有符号数)
always @(posedge clk or negedge rst_n)begin
if(~rst_n)
c <= 9'b0;
else
case(select)
2'b00: c <= {a[7],a};
2'b01: c <= {b[7],b};
2'b10: c <= {a[7],a}+{b[7],b};
2'b11: c <= {a[7],a}-{b[7],b};
default: c <= 9'b0;
endcase
end
VL7 求两个数的差值:根据输入信号a,b的大小关系,求解两个数的差值:输入信号a,b为8bit位宽的无符号数。如果a>b,则输出a-b,如果a≤b,则输出b-a。
always @(posedge clk or negedge rst_n)begin
if(~rst_n)
c <= 0;
else if(a>b)
c <= a-b;
else
c <= b-a;
end
VL8 使用generate…for语句简化代码:在某个module中包含了很多相似的连续赋值语句,请使用generata…for语句编写代码,替代该语句,要求不能改变原module的功能。
generate
genvar gen;
for(gen = 0; gen <8; gen = gen+1)begin
assign data_out[7-gen] = data_in[gen];
end
endgenerate
VL9 使用子模块实现三输入数的大小比较:请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。
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] d1, d2;
add adder1(
.clk (clk),
.rst_n (rst_n),
.a (a),
.b (b),
.c (d1)
);
add adder2(
.clk (clk),
.rst_n (rst_n),
.a (c),
.b (b),
.c (d2)
);
add adder(
.clk (clk),
.rst_n (rst_n),
.a (d1),
.b (d2),
.c (d)
);
endmodulemodule add(
input clk,
input rst_n,
input [7:0] a,
input [7:0] b,
output reg [7:0] c
);
always @(posedge clk or negedge rst_n)begin
if(~rst_n)
c <= 8'b0;
else if(a > b)
c <= b;
else
c <= a;
end
endmodule
VL10 使用函数实现数据大小端转换:请用函数实现一个4bit数据大小端转换的功能。实现对两个不同的输入分别转换并输出。
function [3:0] rev;
input [3:0] data_in;
generate
genvar gen
for(gen = 0; gen<4; gen=gen+1) begin
assign rev[3-gen] = data_in[gen];
end
endgenerate
endfunction
assign c = rev(a);
assign d = rev(b);//有误?
function [3:0] rev;
input [3:0] data_in;
integer gen;
for(gen = 0; gen<4; gen=gen+1) begin
rev[3-gen] = data_in[gen];
end
endfunction
assign c = rev(a);
assign d = rev(b);//有误?
!自带testbench含有clk,rst_n。