如何在Verilog中实现32位比特交换?以第0位与第31位互换为例
Verilog 32位首尾比特位交换实现方案
原尝试代码的可行性说明
你编写的非阻塞赋值代码在时序逻辑场景下可以正常实现交换效果:
// 时钟沿触发的时序逻辑交换实现 always @(posedge clk) begin p[0] <= p[31]; p[31] <= p[0]; // 其余位保持不变可补充 p[30:1] <= p[30:1],若p为reg型且无其他逻辑修改也可省略 end
非阻塞赋值的特性是所有赋值语句的右值会先采样时钟触发前的原始值,再统一更新左值,不会出现赋值覆盖问题,该写法可以正确完成两个比特的交换。
通用实现方案(兼容组合/时序逻辑)
更推荐用拼接写法实现,逻辑更清晰无歧义,适配所有场景:
// 拼接写法含义:将原p的第0位放到最高位31位,中间30位保持不变,原p的第31位放到最低位0位 assign p = {p[0], p[30:1], p[31]};
- 该写法既可以作为组合逻辑的连续赋值语句,也可以作为时序逻辑非阻塞赋值的右值使用,可读性和可维护性更高。
完整功能示例代码
组合逻辑实现(无延迟)
module bit_swap_32 ( input [31:0] din, output [31:0] dout ); assign dout = {din[0], din[30:1], din[31]}; endmodule
时序逻辑实现(时钟同步输出)
module bit_swap_32_sync ( input clk, input rst_n, input [31:0] din, output reg [31:0] dout ); always @(posedge clk or negedge rst_n) begin if(!rst_n) begin dout <= 32'd0; end else begin dout <= {din[0], din[30:1], din[31]}; end end endmodule
内容的提问来源于stack exchange,提问作者Walaa Fadaleh
相关产品推荐
相关产品推荐

