Verilog 使摩尔机器中的输出LED闪烁
我所设计的是一台摩尔机器,它为每个州赋予特定的颜色。 这是我代码的一部分Verilog 使摩尔机器中的输出LED闪烁,verilog,vivado,Verilog,Vivado,我所设计的是一台摩尔机器,它为每个州赋予特定的颜色。 这是我代码的一部分 always @(*) begin case (state) S0 : led = 6'b111111; S1 : led = 6'b010100; // have to blink // S2 : led = 6'b100010; S3 : led = 6'b110110;
always @(*) begin
case (state)
S0 : led = 6'b111111;
S1 : led = 6'b010100; // have to blink //
S2 : led = 6'b100010;
S3 : led = 6'b110110;
default : led_output = 6'b000000;
endcase
end
端模
在上面显示的代码之前,有一些关于分配与输入相对应的状态的代码
上面显示的代码用于确定摩尔机器的输出值。(因此条件为*)
我留下的是为每个状态分配led输出值
然而,S1的条件不仅是特定的颜色,而且必须“闪烁”1s
我已经在谷歌上搜索过“闪烁LED”的verilog代码,但它们和我的情况有点不同
我不知道编码块是必要的
你能给我一些建议或答案让S1闪烁吗?要让它闪烁,你需要区分两种状态。因此,创建一个1位信号,例如
sel
,它在S1
状态下切换,其切换速度和占空比在“闪烁”1s期间满足您的要求。这基本上是在计数器的帮助下实现的
reg [3:0] cnt; // assume 4-bit long
reg sel;
// counter to determine the HIGH / LOW time of sel.
always@(posedge clk or negedge resetn)begin
if(!resetn)begin
cnt <= 4'h0;
end
// since you can exit S1 state at any time using push_button,
// make sure cnt is always ZERO when entering S1 state next time.
// also to save power when using clock gating, because this statement
// is only active for 1 cycle.
else if((state == S1) & ((push_button == 2'b01) | (push_button == 2'b10)))begin // S1 exit condition
cnt <= 4'h0;
end
else if(state == S1)begin
// sel HIGH lasts <HIGH_MAX_VAL>+1 cycles
// sel LOW lasts <LOW_MAX_VAL>+1 cycles
if(cnt == (sel ? <HIGH_MAX_VAL> : <LOW_MAX_VAL>))begin
cnt <= 4'h0;
end
else begin
cnt <= cnt + 4'h1;
end
end
end
always@(posedge clk or negedge resetn)begin
if(!resetn)begin
sel <= 1'h0;
end
else if((state == S1) & ((push_button == 2'b01) | (push_button == 2'b10)))begin
sel <= 1'h0;
end
else if(state == S1)begin
if(cnt == (sel ? <HIGH_MAX_VAL> : <LOW_MAX_VAL>))begin
sel <= ~sel;
end
end
end
always@(*)begin
case(state)
....
S1 : led = sel ? 6'b010100 : <ANOTHER_VALUE>;
....
endcase
end