每次在输出上放置数据时,我想只给出一个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
答案 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