HDLBits——Replication operator位扩展 (非常有用的一道题目)

本人持续更新HDLBits其他题目,详细讲解我们使用Verilog编程时会遇到的各种错误,若有兴趣可以移步我的博客中心浏览本人的其他文章,感谢赏光!

A Bit of Practice
One common place to see a replication operator is when sign-extending a smaller number to a larger one, while preserving its signed value. This is done by replicating the sign bit (the most significant bit) of the smaller number to the left. For example, sign-extending 4’b0101 (5) to 8 bits results in 8’b00000101 (5), while sign-extending 4’b1101 (-3) to 8 bits results in 8’b11111101 (-3).

Build a circuit that sign-extends an 8-bit number to 32 bits. This requires a concatenation of 24 copies of the sign bit (i.e., replicate bit[7] 24 times) followed by the 8-bit number itself.

本道题目的意思就是扩展位
正确解答

module top_module (
    input [7:0] in,
    output [31:0] out );

    assign out = { {24{in[7]} },in[7:0] };

endmodule

在看错误解答前先看下面这段话
1、{ }表示拼接,{第一位,第二位…};
2、{{ }}表示复制,{4{a}}等同于{a,a,a,a};
所以{24{1‘b1}}就表示将24个1拼接起来,即24’b111111111111111111111111。

注意正确答案assign out = { {24{in[7]} },in[7:0] }; 和两个错误答案assign out = { 24{in[7]} ,in[7:0] }; assign out = { {24in[7] },in[7:0] }; 的中括号的使用

以下是两种典型的错误
1、

module top_module (
    input [7:0] in,
    output [31:0] out );

    assign out = { 24{in[7]} ,in[7:0] };

endmodule

这里的{in[7]}是没有任何意义的,本来一个中括号对{}表示拼接的意思,但是这里in[7]只有它自己,所以拼接了个寂寞。
2、

module top_module (
    input [7:0] in,
    output [31:0] out );

    assign out = { {24in[7] },in[7:0] };

endmodule

这里的{24in[7]}也表示拼接,但是这个24in[7]完全是一个错误的东西。

注意:

位扩展是一种非常有用的东西,尤其是在FPGA中,很多时候我们进行一些乘法加法运算会因为寄存器的位数不够而导致“高位截瘫”,这个时候我们就需要合理的对寄存器进行位扩展,位扩展有些是单纯的补0,而有些是补符号位,这要根据自己的场景来补。总而言之位扩展非常重要,希望各位朋友能万分重视,时刻注意自己运算的数是否会溢出而造成结果不准!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值