题解 | #位拆分与运算#

位拆分与运算

http://www.nowcoder.com/practice/1649582a755a4fabb9763d07e62a9752

`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// /借鉴榜一大佬的说辞!!!!! 题中看到对于sel的不同情况,有几种不同的输出,首先考虑到用case语句。 要注意的是,仅当sel为0时,输入信号有效,因此需要一个寄存器data_temp,在sel为0时对输入信号进行锁存。 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的运算。/ //本题最关键的一点是为0的时候,不输出,且只有此时的输入有效,所以需要把为0的时候输入寄存下来。寄存到寄存器中 //之后的d不管他,只看sel=0时候的 reg[4:0] r_out;//输出 reg r_validout;//输出
reg[15:0] r_temp;//寄存器锁存,将输入信号锁存 always@(posedge clk or negedge rst)begin if(~rst)begin r_validout<=1'b0; r_out<=5'b0; r_temp<=16'b0; end else begin case(sel) 2'b00:begin r_temp<=d;//为0的时候将输入信号进行锁存 r_out<=5'b0; r_validout<=1'b0; end 2'b01:begin r_temp<=r_temp;// r_out<=r_temp[3:0]+r_temp[7:4]; r_validout<=1'b1; end 2'b10:begin r_out<=r_temp[3:0]+r_temp[11:8]; r_validout<=1'b1; end 2'b11:begin r_temp<=r_temp; r_out<=r_temp[3:0]+r_temp[15:12]; r_validout<=1'b1; end default:begin r_out<=5'b0; r_validout<=1'b0; end endcase end end assign out=r_out; assign validout=r_validout;

//**code// endmodule

全部评论

相关推荐

xdm怎么说&nbsp;要被拷打了&nbsp;担心是KPI
丹田:面就完了,就当日薪四位数的大佬免费给给你面试。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-27 15:19
简历上能写3个月吗?
码农索隆:大胆写,主要你能把实习经历包装好,可以看一下我这篇帖子https://www.nowcoder.com/share/jump/4888395581180798063
点赞 评论 收藏
分享
05-20 21:57
已编辑
门头沟学院 Java
喜欢吃卤蛋的悲伤蛙在提需求:建信融通没消息吧,我2说有实习挂简历不理了
点赞 评论 收藏
分享
ZywOo_求职版:谁问你了....
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务