题解 | 位拆分与运算
`timescale 1ns/1ns module data_cal( input clk, input rst, input [15:0]d, input [1:0]sel, output [4:0]out, output validout ); //*************code***********// reg[15:0]d_reg; wire[3:0]d0; wire[3:0]d1; wire[3:0]d2; wire[3:0]d3; assign d0 = d_reg[3:0]; assign d1 = d_reg[7:4]; assign d2 = d_reg[11:8]; assign d3 = d_reg[15:12]; reg [4:0] out_reg; reg validout_reg; always @(posedge clk or negedge rst)begin if(!rst)begin out_reg <= 5'b0; validout_reg <= 1'b0; d_reg <= 16'b0; end else begin case(sel) 2'b00 :begin d_reg <= d; out_reg <= 5'b0; validout_reg <= 1'b0; end 2'b01 :begin d_reg <= d_reg; out_reg <= d_reg[3:0] + d_reg[7:4]; validout_reg <= 1'b1; end 2'b10 :begin d_reg <= d_reg; out_reg <= d0 + d2; validout_reg <= 1'b1; end 2'b11 :begin d_reg <= d_reg; out_reg <= d0 + d3; validout_reg <= 1'b1; end default : begin out_reg <= 5'b0; validout_reg <= 1'b0; end endcase end end assign out = out_reg; assign validout = validout_reg; //*************code***********// endmodule
FPGA数字IC牛客网Verilog刷题05-位拆分与运算
这题题干给的有点小问题,题干两个输出给的都不是寄存器reg类型的数据。因此中间要加两个中间的寄存器类型out_reg 和 validout_reg。在宏定义中直接加入d0 , d1 ,d2 , d3 。方便下边程序调用。如刷题04 case设置一个简单的状态机,依次调用不同的sel。