修改代码后将seg语块放置在reg后,但运行代码进行制作功能仿真图,seg依旧没有变化,这是什么原因呢


module SHIFT_REG(clk, rst, mode, din, dout, seg);

input clk, rst;1
input [1:0] mode;
input [7:0] din;
output [7:0] dout;
output [7:0] seg;

reg [7:0] dout;
reg [7:0] seg;
reg CY; // 进位标志位
reg [7:0] REG;

// 状态转移行为
always @(posedge clk or posedge rst)
begin
    if (rst) // 复位
        REG <= 8'b0;
    else begin
        case(mode) // 根据不同模式进行操作
            2'b00: begin // 循环左移
                CY <= REG[7]; // 记录最高位
                REG <= {REG[6:0], REG[7]}; // 左移,最高位补到最低位
            end
            2'b01: begin // 带进位左移
                CY <= REG[7];
                REG <= {1'b0, REG[7:1]};
            end
            default: begin // 其他模式,直接赋值
                CY <= 1'b0;
                REG <= din;
            end
        endcase
    end
end

// 七段数码管显示
always @(posedge clk)
begin
    case (seg) // 根据不同的 seg 值选择输出
        8'b00000000: dout <= 7'b1111110; // 显示 0
        8'b00000001: dout <= 7'b0110000; // 显示 1
        8'b00000010: dout <= 7'b1101101; // 显示 2
        8'b00000011: dout <= 7'b1111001; // 显示 3
        8'b00000100: dout <= 7'b0110011; // 显示 4
        8'b00000101: dout <= 7'b1011011; // 显示 5
        8'b00000110: dout <= 7'b1011111; // 显示 6
        8'b00000111: dout <= 7'b1110000; // 显示 7
        8'b00001000: dout <= 7'b1111111; // 显示 8
        8'b00001001: dout <= 7'b1111011; // 显示 9
        default: dout <= 7'b0000001; // 默认显示 1
    endcase
end

endmodule
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/835431179586132.png "#left")

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

在你的代码中,你定义了两个变量 seg,一个是输入端口,一个是内部的寄存器变量。这两个变量的名字相同,可能会导致编译器产生歧义,因此建议将其中一个变量的名字修改一下。

此外,在你的代码中,我没有看到其他的模块或者主程序与 SHIFT_REG 模块进行连接,因此无法判断代码是否存在其他问题。如果问题仍然没有解决,建议你检查一下代码的其他部分,特别是与 SHIFT_REG 模块相关的部分。

根据你的需求,修改了一下代码中的 seg 变量名,并完整地给出了修改后的代码。你可以参考一下:

module SHIFT_REG(clk, rst, mode, din, dout, seg_in);
 
input clk, rst;
input [1:0] mode;
input [7:0] din;
output [7:0] dout;
input [7:0] seg_in;
 
reg [7:0] dout;
reg [7:0] seg_out;
reg CY; // 进位标志位
reg [7:0] REG;
 
// 状态转移行为
always @(posedge clk or posedge rst)
begin
    if (rst) // 复位
        REG <= 8'b0;
    else begin
        case(mode) // 根据不同模式进行操作
            2'b00: begin // 循环左移
                CY <= REG[7]; // 记录最高位
                REG <= {REG[6:0], REG[7]}; // 左移,最高位补到最低位
            end
            2'b01: begin // 带进位左移
                CY <= REG[7];
                REG <= {1'b0, REG[7:1]};
            end
            default: begin // 其他模式,直接赋值
                CY <= 1'b0;
                REG <= din;
            end
        endcase
    end
end
 
// 七段数码管显示
always @(posedge clk)
begin
    case (seg_in) // 根据不同的 seg 值选择输出
        8'b00000000: seg_out <= 7'b1111110; // 显示 0
        8'b00000001: seg_out <= 7'b0110000; // 显示 1
        8'b00000010: seg_out <= 7'b1101101; // 显示 2
        8'b00000011: seg_out <= 7'b1111001; // 显示 3
        8'b00000100: seg_out <= 7'b0110011; // 显示 4
        8'b00000101: seg_out <= 7'b1011011; // 显示 5
        8'b00000110: seg_out <= 7'b1011111; // 显示 6
        8'b00000111: seg_out <= 7'b1110000; // 显示 7
        8'b00001000: seg_out <= 7'b1111111; // 显示 8
        8'b00001001: seg_out <= 7'b1111011; // 显示 9
        default: seg_out <= 7'b0000001; // 默认显示 1
    endcase
end
 
assign dout = seg_out;
 
endmodule

在这个修改后的代码中,我将输入端口的 seg 变量名修改为了 seg_in,同时将输出端口的 seg 变量名修改为了 seg_out,避免了变量名冲突的问题。另外,我使用了 assign 语句将 seg_out 赋值给了 dout,这样就可以将 seg_out 的值直接传递给 dout,实现了七段数码管的显示功能。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢