题解 | #位拆分与运算#
位拆分与运算
https://www.nowcoder.com/practice/1649582a755a4fabb9763d07e62a9752
`timescale 1ns/1ns
module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,
output reg [4:0]out,
output reg validout
);
//*************code***********//
reg [15:0] d_valid;
always@(posedge clk or negedge rst)begin
if(!rst)begin
d_valid<=16'd0;
end
else if(sel==2'b0)begin
d_valid<=d;
end
else begin
d_valid<=d_valid;
end
end
always@(sel)begin
case(sel)
2'b0:begin
out<=5'd0;
validout<=1'b0;
end
2'b01:begin
out<=d_valid[3:0]+d_valid[7:4];
validout<=1'b1;
end
2'b10:begin
out<=d_valid[3:0]+d_valid[11:8];
validout<=1'b1;
end
2'b11:begin
out<=d_valid[3:0]+d_valid[15:12];
validout<=1'b1;
end
default:begin
out<=5'd0;
validout<=1'b0;
end
endcase
end
//*************code***********//
endmodule
这题是时序逻辑电路和组合逻辑电路相结合的一个题目,感觉还是比较简单的,至少原理上没啥。就考到了数据的拆分。从题目给出的仿真波形来看out 和 validout有效信号与sel是同时发生变化的可以知道这三个信号应该是一种组合逻辑电路的关系。此外文中给出当sel为零的时候输入的数据才是有效的数据,因此我们需要一个额外的寄存器去存储有效数据,也就是上述代码中的d_valid数据。然后计算部分根据sel控制信号,利用case语句对其运算。这里想到了casex和casez的用法。Verilog HDL针对电路的特性提供了case语句的其它两种形式用来处理case语句比较过程中的不必考虑的情况( don't care condition )。其中casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。所谓不必关心的情况,即在表达式进行比较时,不将该位的状态考虑在内。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Reborn_Lee/article/details/82390445
