【问题标题】:Verilog bit shiftVerilog 位移
【发布时间】:2018-04-20 02:30:29
【问题描述】:

我刚刚开始学习如何学习verilog,我偶然发现了这个问题。所以我试图制作一个移位器,为每个上升时钟脉冲将输入位向左移动一次。但是,当我尝试运行模拟时,输出为 XXXX。任何帮助将不胜感激

module shift_left #(parameter i=3)(
input clk,
input rst,
input [i:0]data_in,
output reg [i:0]data_out
);
wire [i:0]in;
assign in=data_in;
reg [i:0]temp;

always @(posedge clk)begin

    if(rst==1)begin
        temp<=in;
    end
    else
        data_out<=temp;
        temp<=temp<<1;
        temp[0]=1'b0;
    end

endmodule

【问题讨论】:

  • 你在一个非阻塞赋值之后立即使用阻塞赋值。我怀疑这可能与您的问题有关。顺便说一句,assign in=data_in 有什么好处?由于它是wire 而不是reg(您将在always @ 块中分配),我认为如果您在temp&lt;=data_in 条件下使用temp&lt;=data_in,它不会改变任何东西。
  • 你需要提供你的测试台代码的片段

标签: verilog


【解决方案1】:

看起来您正在使用同步 reset,而您的问题主要是由于在模拟开始时未在您的 TB 中声明 reset。在继续进行其余的模拟之前,您需要使用 reset 信号至少遵循 1 个断言-解除断言序列。

至于您的代码,正如 Patrick 指出的那样,您不需要创建额外的 wire [i:0] in。您可以直接在 always 块中执行 temp &lt;= data_in

另外,没有必要执行temp[0] = 1'b0;,因为左移运算符&lt;&lt; 会自动负责在LSB 中插入一个零。

忠告:不要在同一个 always 块中混合阻塞和非阻塞语句,至少在刚开始学习 Verilog 时不要这样做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多