毛豆仙人 2023-10-05 17:06 采纳率: 75%
浏览 7

为什么输出一直不动,是我的for语句写的有问题吗?

想写一个环形移位寄存器,时钟上升沿到来时就移位一次
代码


module shift(input clk,
input [31:0]d,
input res,
output reg [31:0]out);
parameter m=5'd32;
reg [4:0]i;
reg med;

always@(posedge clk or negedge res)
begin
med<=d[31];
if(!res)
out<=32'b0;
else
for(i=5'd31;i>=0;i=i-1)
begin
if(i==0)
out[0]<=med;
else
out[i]<=d[i-1];
end
end
endmodule

testbench

`timescale 1ns/1ns
module shift_tb();
reg clk;
reg res;
reg [31:0]d;
wire [31:0]out;
shift test6(.clk(clk),
.d(d),
.res(res),
.out(out));
always#5000 clk=~clk;
initial
begin
clk<=0;
d<=32'b0;
res<=0;
#1000 res<=1'b1;
#1000 d<=32'b10011111_11011101_00001111_11110011;
end
endmodule

img

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-05 23:42
    关注

    引自强大而免费的微信小程序:皆我百晓生。


    在你的代码中,可以看到你在always块中使用了一个for循环来移位。然而,在Verilog中,并不支持在always块中使用for循环语句。因此,你的代码应该被修改为使用一个通用的移位操作,而不是使用一个for循环。

    以下是修改后的代码示例:

    module shift(
        input clk,
        input [31:0] d,
        input res,
        output reg [31:0] out
    );
        parameter m = 5'd32;
        reg med;
    
        always @(posedge clk) begin
            if (!res)
                out <= 32'b0;
            else begin
                med <= d[31];
                out <= {med, d[31:1]};
            end
        end
    endmodule
    

    在修改后的代码中,我们使用了一个通用的移位操作{med, d[31:1]}来实现位移。这个操作将med放在了最高位,然后将d的其余位逐位向左移动一位。

    希望这可以帮助你解决问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 10月5日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表