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

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,而有些是补符号位,这要根据自己的场景来补。总而言之位扩展非常重要,希望各位朋友能万分重视,时刻注意自己运算的数是否会溢出而造成结果不准!

你可能感兴趣的:(FPGA/Verilog,fpga,verilog,嵌入式,电脑硬件)