题解 | #位拆分与运算#

题中看到对于sel的不同情况,有几种不同的输出,首先考虑到用case语句。

要注意的是,仅当sel为0时,输入信号有效,因此需要一个寄存器data_temp,在sel为0时对输入信号进行锁存。

下一步编写代码:
复位时,三个信号受到影响,即data_temp清零、validout清零、输出out清零;
sel为0时,将输入的值锁存到data_temp中,同时validout拉低,输出out为0;
sel为1时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算;
sel为2时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算;
sel为3时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算。

整个代码如下:

``` js`timescale 1ns/1ns

`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
);
    reg [15:0]data_temp;
    always@(posedge clk or negedge rst)
        if(!rst)begin
            out<=5'd0;
            validout<=1'b0;
            data_temp<=16'd0;
        end
        else case(sel)
            0:
                begin
                    data_temp<=d;
                    out[4:0]<=5'd0;
                    validout<=1'b0;
                end
            1:
                begin
                    validout<=1'b1;
                    out[4:0]<=data_temp[3:0]+data_temp[7:4];
                end
            2:
                begin
                    validout<=1'b1;
                    out[4:0]<=data_temp[3:0]+data_temp[11:8];
                end
            3:
                begin
                    validout<=1'b1;
                    out[4:0]<=data_temp[3:0]+data_temp[15:12];
                end
            default:
                begin
                    validout<=1'b0;
                    out[4:0]<=5'd0;
                end
        endcase
endmodule
全部评论
data_temp<=15'd0; 能是对的?
1 回复 分享
发布于 2022-05-22 23:32
default后面的情况前面考虑过了,不需要吧.
1 回复 分享
发布于 2022-06-24 17:30
sel刚开始不是00,那data_temp就没有值呀
1 回复 分享
发布于 2023-09-24 11:44 湖南
数组能直接相等?不应该按位赋值吗
点赞 回复 分享
发布于 2022-09-13 18:53 北京
感觉这个时序满足不了。使用always块,out一定是要晚一拍
点赞 回复 分享
发布于 11-18 20:39 广东

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
27 1 评论
分享
牛客网
牛客企业服务