FPGA/Verilog|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).
【FPGA/Verilog|HDLBits——Replication operator位扩展 (非常有用的一道题目)】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|DDR3原理总结
- FPGA开发--Quartus|FPGA开发--Quartus II常见警告说明及解决方案
- FPGA期末项目|FPGA期末项目 | 数字时钟
- verilog中assign和always@(*)两者描述组合逻辑时的差别
- Altera|Altera特殊管脚的使用(适用全系列Altera FPGA,MSEL区别除外)-来自altera论坛
- 笔记|FPGA里面的时钟管理
- verilog 时钟管理模块
- 关于PIC和FPGA
- FPGA学习笔记7-Quartus|FPGA学习笔记7-Quartus II其余的部分TCL指令(翻译)
- RGB转YUV的verilog实现和验证