在verilog中的顺序case语句中重置变量

时间:2014-06-30 05:13:14

标签: variables verilog fpga flags

每次在输出上放置数据时,我想只给出一个2个时钟周期宽的选通脉冲。我无法在verilog中实现逻辑。这是我写的伪代码

reg [1:0] step = 2'b00;
always @ (posedge clock)
begin    
case (switch)
1'b0 : begin        
       load data 1;
       flag <= 1;
   end
1'b0 : begin        
       load data 2;
       flag <= 1;
       end    
endcase

if (flag == 1)
case (step)
2'b00 : strobe high;
2'b01 : wait;
2'b10 : strobe low;
2'b11 : flag <=0;   
endcase 
end

如果我这样做,在第一个数据之后正确给出选通脉冲后,reg步骤变为2'b11,但是我无法将第二个数据再次复位为零,所以当第二个时间标志设置为高时步骤变量只输入最后一个案例。如果我在其他地方设置step&lt; = 2'b00,则选通输出随每个时钟周期不断变化。我只想要一个脉冲。

实际代码:

`timescale 1ns / 1ps

module test3(
input i_clock,
input i_switch,
output reg [7:0] o_data = 8'b00001111,
output reg o_strobe = 1'b0
);

reg flag = 1'b0;
reg [1:0] step = 2'b00;

always @ (posedge i_clock)
begin
  if (flag == 1'b0)
    begin
      case (i_switch)                                 
        1'b0  :  begin
                   o_data [7:0] <= 32'b00000000;
                   flag <= 1'b1;
                 end
        1'b1  :  begin
                   o_data [7:0] <= 32'b11111111;
                   flag <= 1'b1;
                 end
      endcase
    end
else if (flag == 1)
      begin
        case (step)
          2'b00  :  begin
                      o_strobe <= 1'b1;
                      step <= 2'b01;
                    end
          2'b00  :  begin
                      step <= 2'b10;
                    end
          2'b10  :  begin
                      o_strobe <= 1'b0;
                      step <= 2'b11;
                    end
          2'b11  :  begin
                      flag <= 1'b0;
                      // step <= 2'b00;
                    end
       endcase
    end
  end
endmodule

波形: 第二个数据没有选通,步骤&lt; = 2'b00评论

http://i30.photobucket.com/albums/c315/soumyabumba/strobe_zpsc342b740.gif

连续切换选通,步骤&lt; = 2'b00取消注释

http://i30.photobucket.com/albums/c315/soumyabumba/pulse_strobe_zps8a1a5fb4.gif

1 个答案:

答案 0 :(得分:0)

非常感谢蒂姆。我解决了它只是因为你有用的建议添加标志和步骤波形。主要问题是case(switch)在每个时钟周期执行,并带有前一个周期的开关值,并触发每个语句下的标志。因此,我从case(i_switch)中删除了always @ (i_clock),并将其单独放在always @ (i_switch)中,以便case(switch)仅在切换时更改。

虽然我面临一个小问题。由于我添加了always@(i_switch)块,因此我怀疑初始化测试平台文件中的i_switch输入。如果我在全局重置100#之前初始化它,则o_data以00000000而不是00001111开始,即case语句甚至在全局重置完成之前就开始运行。如果我在100#之后给i_switch作为刺激,那么对于100#表示未初始化的输入,红色线和X将来i_switch。我附加了波形和解码的代码。执行这个会有问题吗?另外我在某处读取所有if语句必须遵循else语句,否则可能会发生不需要的锁存,可以在else (flag == 0)always @(i_clock)条件下写什么?

波形:

http://i30.photobucket.com/albums/c315/soumyabumba/strobe_solved_zps72b65a42.png

解决代码:

`timescale 1ns / 1ps

module test3(
input i_clock,
input i_switch,
output reg [7:0] o_data = 8'b00001111,
output reg o_strobe = 1'b0
);

reg flag = 1'b0;
reg [1:0] step = 2'b00;

always @ (i_switch)
begin
    case (i_switch)                                 
    1'b0  :  begin
               o_data [7:0] <= 32'b00000000;
               flag <= 1'b1;
             end
    1'b1  :  begin
               o_data [7:0] <= 32'b11111111;
               flag <= 1'b1;
             end
    endcase
end

always @ (posedge i_clock)
begin
if (flag == 1)
  begin
    case (step)
      2'b00  :  begin
                  o_strobe <= 1'b1;
                  step <= 2'b01;
                end
      2'b01  :  begin
                  step <= 2'b10;
                end
      2'b10  :  begin
                  o_strobe <= 1'b0;
                  step <= 2'b11;
                end
      2'b11  :  begin
                  flag <= 1'b0;
                  step <= 2'b00;
                end
   endcase
end
end
endmodule