【HDLBits 刷题 10】Circuits(6)Finite State Manchines 10-17

2023-10-26

目录

写在前面

Finite State Manchines

Lemmings1

Lemmings2

Lemmings3

Lemmings4

Fsm onehot

Fsm ps2

Fsm ps2data

Fsm serial


写在前面

HDLBits 刷题来到了最为重要的一部分---有限状态机,都说 Verilog 设计的精髓就是状态机的设计,可见状态机设计的重要性,通过三十多道的状态机的练习,可以更加熟悉状态机设计的要点,通常都设计为三段式,这样设计的状态机层次清晰且易于设计,时序上更为易懂。以下的解题方法不一定为最佳解决方案,有更好的方法欢迎提出,共同学习,共同进步!

Finite State Manchines

Lemmings1

游戏 Lemmings1 涉及大脑相当简单的小动物。如此简单,以至于我们将使用有限状态机对其进行建模。

在Lemmings  的2D世界中,Lemmings 可以处于两种状态之一:向左走或向右走。如果它撞到障碍物,它会改变方向。特别是,如果旅鼠在左侧被撞倒,它将向右走。如果它被撞到右边,它会向左走。如果它同时在两侧颠簸,它仍然会切换方向。

实现具有两个状态、两个输入和一个输出的 Moore 状态机,以对此行为进行建模。

以下四道题还挺有趣的,以游戏为引入,对其状态进行建模。

44e10a32e34244deb48d256b9b9a55a8.png

module top_module(
    input      clk,
    input      areset,    
    input      bump_left,
    input      bump_right,
    output     walk_left,
    output     walk_right
);
    //状态机状态定义
    parameter  LEFT  = 0;
    parameter  RIGHT = 1;
    reg        state;
    reg        next_state;

//状态机第一段,状态初始化,时序逻辑非阻塞赋值
always @(posedge clk or posedge areset) begin
	if (areset) begin
		state <= LEFT;
	end
	else begin
		state <= next_state;
	end 
end

//状态机第二段,状态跳转,阻塞复制
always @(*) begin
    next_state = state;
    case(state)
    	LEFT: begin
    		if (bump_left) begin
    			next_state = RIGHT;
    		end
    		else begin
    			next_state = LEFT;
    		end
    	end
    	RIGHT: begin
    		if (bump_right) begin
    			next_state = LEFT;
    		end
    		else begin
    			next_state = RIGHT;
    		end
    	end
    endcase
end

//状态机第三段,结果输出,组合逻辑
assign walk_left  = (state==LEFT);
assign walk_right = (state==RIGHT);

endmodule

Lemmings2

除了左右走之外,如果地面消失在他们下面,Lemmings也会摔倒(并且大概会“啊!”)。

除了左右走和颠簸时改变方向外,当地面=0时,旅鼠会摔倒并说“啊啊!当地面重新出现(地面=1)时,旅鼠将恢复沿与坠落前相同的方向行走。在跌倒时被撞到不会影响行走方向,并且与地面消失(但尚未下降)在同一周期中被撞击,或者当地面在仍然下降时重新出现时,也不影响行走方向。

构建一个有限状态机来模拟这种行为。

38adb6740e54431ca6b5d7a62d8b2492.png

//`timescale 100ps / 1ps
//
// Stage: Finite_State_Manchines 
// Engineer: LQC
// Create Date: 2022/08/06
// Design Name: 
// Module Name: top_module
// Description:    
//    除了左右走之外,如果地面消失,Lemmings也会摔倒(并且大概会“啊!”)。
//    
//    除了左右走和颠簸时改变方向外,当地面=0时,旅鼠会摔倒并说“啊啊!
//    当地面重新出现(地面=1)时,旅鼠将恢复沿与坠落前相同的方向行走。
//    在跌倒时被撞到不会影响行走方向,并且与地面消失(但尚未下降)
//    在同一周期中被撞击,或者当地面在仍然下降时重新出现时,也不影响行走方向。
//    
//    构建一个有限状态机来模拟这种行为。
//

module top_module(
    input        clk,
    input        areset,    // Freshly brainwashed Lemmings walk left.
    input        bump_left,
    input        bump_right,
    input        ground,
    output       walk_left,
    output       walk_right,
    output       aaah 
);

    //状态机状态定义
    parameter  LEFT  = 0;
    parameter  RIGHT = 1;
    parameter  LEFT_AAAH = 2;
    parameter  RIGHT_AAAH = 3;

    reg   [1:0]    state;
    reg   [1:0]    next_state;

//状态机第一段,初始化状态,时序逻辑非阻塞赋值
always @(posedge clk or posedge areset) begin
 	if (areset) begin
 		state <= LEFT;
 	end
 	else begin
 		state <= next_state;
 	end
 end 

//状态机第二段,状态跳转,阻塞赋值
always @(*) begin
	case(state)
		LEFT: begin
			if (~ground) begin
				next_state <= LEFT_AAAH;
			end
			else if (bump_left) begin
				next_state <= RIGHT;
			end
			else begin
				next_state <= LEFT;
			end
		end
		RIGHT: begin
			if (~ground) begin
				next_state <= RIGHT_AAAH;
			end
			else if (bump_right) begin
				next_state <= LEFT;
			end
			else begin
				next_state <= RIGHT;
			end
		end
		LEFT_AAAH: begin
			if (ground) begin
				next_state <= LEFT;
			end
			else begin
				next_state <= LEFT_AAAH;
			end			
		end
		RIGHT_AAAH: begin
			if (ground) begin
				next_state <= RIGHT;
			end
			else begin
				next_state <= RIGHT_AAAH;
			end		
		end
	endcase
end

//状态机第三段,结果输出,组合逻辑
assign walk_left  = (state==LEFT);
assign walk_right = (state==RIGHT);
assign aaah = ((state==LEFT_AAAH) | (state==RIGHT_AAAH));

endmodule

Lemmings3

除了走路和摔倒之外,Lemmings有时还可以被告知做一些有用的事情,比如挖(当dig=1时开始挖)。如果旅鼠当前在地面上行走(地面=1且未掉落),则可以挖掘,并将继续挖掘,直到到达另一侧(地面=0)。在这一点上,由于没有地面,它会掉下来(啊啊!),然后一旦它再次撞击地面,就继续朝着原来的方向走。与坠落一样,在挖掘时被撞击没有效果,并且在跌倒或没有地面时被告知要挖掘会被忽略。

(换句话说,行走的旅鼠可能会摔倒,挖掘或改变方向。如果满足这些条件中的多个条件,则下降的优先级高于 dig,后者的优先级高于切换方向。

扩展有限状态机以对此行为进行建模。

7cc441f99f254abc93bd8a29ffcc15a9.png

module top_module(
    input       clk,
    input       areset,    // Freshly brainwashed Lemmings walk left.
    input       bump_left,
    input       bump_right,
    input       ground,
    input       dig,
    output      walk_left,
    output      walk_right,
    output      aaah,
    output      digging 
); 
//状态申明
parameter  LEFT         =  8'b00000001;   //向左走状态
parameter  RIGHT        =  8'b00000010;   //向右走状态
parameter  LEFT_AH      =  8'b00000100;   //向左走出现没地喊叫
parameter  RIGHT_AH     =  8'b00001000;   //向右走出现没地喊叫
parameter  LEFT_DIG     =  8'b00010000;   //向左走挖掘指令
parameter  RIGHT_DIG    =  8'b00100000;   //向右走挖掘指令
parameter  LEFT_DIG_AH  =  8'b01000000;   //向左走挖掘出现地空
parameter  RIGHT_DIG_AH =  8'b10000000;   //向右走挖掘出现地空

reg  [7:0]   state;
reg  [7:0]   next_state; 

//状态机第一段,状态初始化,时序逻辑非阻塞赋值
always @(posedge clk or posedge areset) begin
	if (areset) begin
		state <= LEFT;
	end
	else begin
		state <= next_state;
	end
end

//状态机第二段,状态跳转,阻塞赋值
always @(*) begin
	next_state = state;
	case(state)
		LEFT: begin
			if (~ground) begin
				next_state = LEFT_AH;
			end
			else if (dig) begin
				next_state = LEFT_DIG;
			end
			else if (bump_left) begin
				next_state = RIGHT;
			end
			else begin
				next_state = LEFT;
			end
		end
		RIGHT: begin
			if (~ground) begin
				next_state = RIGHT_AH;
			end
			else if (dig) begin
				next_state = RIGHT_DIG;
			end
			else if (bump_right) begin
				next_state = LEFT;
			end
			else begin
				next_state = RIGHT;
			end
		end
		LEFT_AH: begin
			if (ground) begin
				next_state = LEFT;
			end
			else begin
				next_state = LEFT_AH;
			end
		end
		RIGHT_AH: begin
			if (ground) begin
				next_state = RIGHT;
			end
			else begin
				next_state = RIGHT_AH;
			end
		end
		LEFT_DIG: begin
			if (~ground) begin
				next_state = LEFT_DIG_AH;
			end
			else begin
				next_state = LEFT_DIG;
			end
		end
		RIGHT_DIG: begin
			if (~ground) begin
				next_state = RIGHT_DIG_AH;
			end
			else begin
				next_state = RIGHT_DIG;
			end
		end
		LEFT_DIG_AH: begin
			if (ground) begin
				next_state = LEFT;
			end
			else begin
				next_state = LEFT_DIG_AH;
			end
		end
		RIGHT_DIG_AH: begin
			if (ground) begin
				next_state = RIGHT;
			end
			else begin
				next_state = RIGHT_DIG_AH;
			end
		end
		default: begin
			next_state = LEFT;
		end
	endcase
end

//状态机第三段,结果输出,组合逻辑
assign walk_left = (state == LEFT);
assign walk_right = (state == RIGHT);
assign aaah = ((state == LEFT_AH) | (state == RIGHT_AH) | (state == LEFT_DIG_AH) | (state == RIGHT_DIG_AH));
assign digging = ((state == LEFT_DIG) | (state == RIGHT_DIG));

endmodule

Lemmings4

虽然旅鼠可以走路,摔倒和挖掘,但旅鼠并不是无懈可击的。如果旅鼠坠落太久然后撞到地面,它可能会飞溅。特别是,如果一只旅鼠坠落超过20个时钟周期,然后撞击地面,它将飞溅并停止行走,坠落或挖掘(所有4个输出变为0),永远(或直到FSM被重置)。旅鼠在落地之前可以落多远没有上限。旅鼠只在撞击地面时飞溅;它们不会在半空中飞溅。

扩展有限状态机以对此行为进行建模。

1f487024b9234fb68ff7dfed806bcee6.png

module top_module(
    input       clk,
    input       areset,    // Freshly brainwashed Lemmings walk left.
    input       bump_left,
    input       bump_right,
    input       ground,
    input       dig,
    output      walk_left,
    output      walk_right,
    output      aaah,
    output      digging 
); 
//状态申明
parameter  LEFT         =  9'b000000001;   //向左走状态
parameter  RIGHT        =  9'b000000010;   //向右走状态
parameter  LEFT_AH      =  9'b000000100;   //向左走出现没地喊叫
parameter  RIGHT_AH     =  9'b000001000;   //向右走出现没地喊叫
parameter  LEFT_DIG     =  9'b000010000;   //向左走挖掘指令
parameter  RIGHT_DIG    =  9'b000100000;   //向右走挖掘指令
parameter  LEFT_DIG_AH  =  9'b001000000;   //向左走挖掘出现地空
parameter  RIGHT_DIG_AH =  9'b010000000;   //向右走挖掘出现地空
parameter  SPLATTER     =  9'b100000000;   //掉落时间过久碰地飞溅 

reg  [8:0]     state;
reg  [8:0]     next_state; 
reg  [100:0]   fall_cnt;

//状态机第一段,状态初始化,时序逻辑非阻塞赋值
always @(posedge clk or posedge areset) begin
	if (areset) begin
		state <= LEFT;
	end
	else begin
		state <= next_state;
	end
end

//状态机第二段,状态跳转,阻塞赋值
always @(*) begin
	next_state = state;
	case(state)
		LEFT: begin
			if (~ground) begin
				next_state = LEFT_AH;
			end
			else if (dig) begin
				next_state = LEFT_DIG;
			end
			else if (bump_left) begin
				next_state = RIGHT;
			end
			else begin
				next_state = LEFT;
			end
		end
		RIGHT: begin
			if (~ground) begin
				next_state = RIGHT_AH;
			end
			else if (dig) begin
				next_state = RIGHT_DIG;
			end
			else if (bump_right) begin
				next_state = LEFT;
			end
			else begin
				next_state = RIGHT;
			end
		end
		LEFT_AH: begin
			if (ground && fall_cnt>='d20) begin
				next_state = SPLATTER;
			end
			else if (ground && fall_cnt<='d19) begin
				next_state = LEFT;
			end
			else begin
				next_state = LEFT_AH;
			end
		end
		RIGHT_AH: begin
			if (ground && fall_cnt>='d20) begin
				next_state = SPLATTER;
			end
			else if (ground && fall_cnt<='d19) begin
				next_state = RIGHT;
			end
			else begin
				next_state = RIGHT_AH;
			end
		end
		LEFT_DIG: begin
			if (~ground) begin
				next_state = LEFT_DIG_AH;
			end
			else begin
				next_state = LEFT_DIG;
			end
		end
		RIGHT_DIG: begin
			if (~ground) begin
				next_state = RIGHT_DIG_AH;
			end
			else begin
				next_state = RIGHT_DIG;
			end
		end
		LEFT_DIG_AH: begin
			if (ground && fall_cnt>='d20) begin
				next_state = SPLATTER;
			end
			else if (ground && fall_cnt<='d19) begin
				next_state = LEFT;
			end
			else begin
				next_state = LEFT_DIG_AH;
			end
		end
		RIGHT_DIG_AH: begin
			if (ground && fall_cnt>='d20) begin
				next_state = SPLATTER;
			end
			else if (ground && fall_cnt<='d19) begin
				next_state = RIGHT;
			end
			else begin
				next_state = RIGHT_DIG_AH;
			end
		end
		SPLATTER: begin
			next_state = next_state;
		end
		default: begin
			next_state = LEFT;
		end
	endcase
end

//对掉落时间计数
always @(posedge clk or posedge areset) begin
	if (areset) begin
		fall_cnt <= 'd0;
	end
	else if (state==LEFT_AH || state==RIGHT_AH || state==LEFT_DIG_AH || state==RIGHT_DIG_AH) begin
		fall_cnt <= fall_cnt + 'd1;
	end
	else begin
		fall_cnt <= 'd0;
	end
end

//状态机第三段,结果输出,组合逻辑
assign walk_left = (state == LEFT);
assign walk_right = (state == RIGHT);
assign aaah = ((state == LEFT_AH) | (state == RIGHT_AH) | (state == LEFT_DIG_AH) | (state == RIGHT_DIG_AH));
assign digging = ((state == LEFT_DIG) | (state == RIGHT_DIG));

endmodule

Fsm onehot

给定具有以下具有 1 个输入和 2 个输出的状态机:

f3c274e95be54cee9dd236ef49ff1bcc.png

假设此状态机使用单热编码,其中状态[0]到状态[9]分别对应于状态S0到S9。除非另有说明,否则输出为零。

实现状态机的状态转换逻辑和输出逻辑部分(但不是状态触发器)。您将获得状态为当前状态[9:0],并且必须产生next_state[9:0]和两个输出。通过假设一个热编码的检查来推导逻辑方程。(测试平台将使用非一个热输入进行测试,以确保您不会尝试执行更复杂的操作)。

module top_module(
    input         in,
    input  [9:0]  state,
    output [9:0]  next_state,
    output        out1,
    output        out2
);

assign next_state[0] = (state[0] & ~in) | (state[1] & ~in) | (state[2] & ~in) | (state[3] & ~in) | (state[4] & ~in) | (state[7] & ~in) | (state[8] & ~in) | (state[9] & ~in);
assign next_state[1] = (state[0] & in) | (state[8] & in) | (state[9] & in);
assign next_state[2] = (state[1] & in);
assign next_state[3] = (state[2] & in);
assign next_state[4] = (state[3] & in);
assign next_state[5] = (state[4] & in);
assign next_state[6] = (state[5] & in);
assign next_state[7] = (state[6] & in) | (state[7] & in);
assign next_state[8] = (state[5] & ~in);
assign next_state[9] = (state[6] & ~in);

assign out1 = (state[8] | state[9]);
assign out2 = (state[7] | state[9]);

endmodule

Fsm ps2

PS/2 鼠标协议发送长度为 3 个字节的消息。但是,在连续的字节流中,消息的开始和结束位置并不明显。唯一的迹象是,每个三字节消息的第一个字节总是有位[3]=1(但其他两个字节的位[3]可能是1或0,具体取决于数据)。

我们想要一个有限状态机,当给定一个输入字节流时,它将搜索消息边界。我们将使用的算法是丢弃字节,直到我们看到一个bit[3]=1的字节。然后,我们假设这是消息的字节1,并在收到所有3个字节(完成)后发出消息接收信号。

FSM 应在成功接收每条消息的第三个字节后立即在周期内完成信号。

4c313525c5ce47b983bc4c8da5eba45e.png

module top_module(
    input        clk,
    input [7:0]  in,
    input        reset,    // Synchronous reset
    output       done
);

parameter  IDLE  = 'd0;
parameter  BYTE1 = 'd1;
parameter  BYTE2 = 'd2;
parameter  BYTE3 = 'd3;

reg [1:0]   state;
reg [1:0]   next_state;

//状态机第一段,初始状态,时序逻辑非阻塞赋值
always @(posedge clk or posedge reset) begin
	if (reset) begin
		state <= IDLE;
	end
	else begin
		state <= next_state;
	end
end

//状态机第二段,状态跳转,阻塞赋值
always @(*) begin
	next_state = state;
	case(state)
		IDLE: begin
			if (in[3]) begin
				next_state = BYTE1;
			end
			else begin
				next_state = IDLE;
			end
		end
		BYTE1: begin
			next_state = BYTE2;
		end
		BYTE2: begin
			next_state = BYTE3;
		end
		BYTE3: begin
			if (in[3]) begin
				next_state <= BYTE1;
			end
			else begin
				next_state <= IDLE;
			end
		end
	endcase
end

//状态机第三段,结果输出,组合逻辑
assign done = (state == BYTE3);

endmodule

Fsm ps2data

现在,您已经有了一个状态机,该状态机将识别 PS/2 字节流中的三字节消息,请添加一个数据路径,该数据路径在收到数据包时也会输出 24 位(3 字节)消息(out_bytes[23:16] 是第一个字节,out_bytes[15:8] 是第二个字节,依此类推)。

每当置位完成的信号时,out_bytes都必须有效。您可以在其他时间输出任何内容(即,不在乎)。

例如:

fbae3bc925114edd8aa7901bd290fccd.png

module top_module(
    input          clk,
    input  [7:0]   in,
    input          reset,
    output [23:0]  out_bytes,
    output         done
);

parameter  IDLE  = 'd0;
parameter  BYTE1 = 'd1;
parameter  BYTE2 = 'd2;
parameter  BYTE3 = 'd3;

reg [1:0]   state;
reg [1:0]   next_state;
reg [23:0]  byte_rx;

//状态机第一段,初始状态,时序逻辑非阻塞赋值
always @(posedge clk) begin
	if (reset) begin
		state <= IDLE;
	end
	else begin
		state <= next_state;
	end
end

//状态机第二段,状态跳转,阻塞赋值
always @(*) begin
	next_state = state;
	case(state)
		IDLE: begin
			if (in[3]) begin
				next_state = BYTE1;
			end
			else begin
				next_state = IDLE;
			end
		end
		BYTE1: begin
			next_state = BYTE2;
		end
		BYTE2: begin
			next_state = BYTE3;
		end
		BYTE3: begin
			if (in[3]) begin
				next_state = BYTE1;
			end
			else begin
				next_state = IDLE;
			end
		end
	endcase
end

//
always @(posedge clk) begin
	if (next_state == BYTE1) begin
		byte_rx <= {byte_rx[15:0],in};
	end
	else if (next_state == BYTE2) begin
		byte_rx <= {byte_rx[15:0],in};
	end
	else if (next_state == BYTE3) begin
		byte_rx <= {byte_rx[15:0],in};;
	end
	else begin
		byte_rx <= 'd0;
	end
end

//状态机第三段,结果输出,组合逻辑
assign done = (state == BYTE3);
assign out_bytes = byte_rx;

endmodule

Fsm serial

在许多(较旧的)串行通信协议中,每个数据字节都与起始位和停止位一起发送,以帮助接收方从位流中分隔字节。一种常见的方案是使用一个起始位 (0)、8 个数据位和 1 个停止位 (1)。当没有传输任何内容(空闲)时,该线也处于逻辑1。

设计一个有限状态机,当给定比特流时,它将识别何时正确接收字节。它需要识别起始位,等待所有8个数据位,然后验证停止位是否正确。如果停止位未按预期出现,则 FSM 必须等到找到停止位后再尝试接收下一个字节。

95accebcb00a473091dc17c1344d503b.png

module top_module(
    input     clk,
    input     in,
    input     reset,
    output    done
);
//状态机状态申明
parameter  IDLE       =  12'b000000000001; 
parameter  START      =  12'b000000000010; 
parameter  DATA_ONE   =  12'b000000000100; 
parameter  DATA_TWO   =  12'b000000001000; 
parameter  DATA_THREE =  12'b000000010000; 
parameter  DATA_FOUR  =  12'b000000100000; 
parameter  DATA_FIVE  =  12'b000001000000; 
parameter  DATA_SIX   =  12'b000010000000; 
parameter  DATA_SEVEN =  12'b000100000000; 
parameter  DATA_EIGHT =  12'b001000000000; 
parameter  STOP       =  12'b010000000000; 
parameter  WAIT       =  12'b100000000000;

reg  [11:0]   state;
reg  [11:0]   next_state;

//状态机第一段,状态初始化,时序逻辑,非阻塞赋值
always @(posedge clk) begin
  	if (reset) begin
  		state <= IDLE;
  	end
  	else begin
  		state <= next_state;
  	end
end 

//状态机第二段,状态跳转,阻塞赋值
always @(*) begin
	next_state = state;
	case(state)
		IDLE: begin
			if (~in) begin
				next_state = START;
			end
			else begin
				next_state = IDLE;
			end
		end
		START: begin
			next_state = DATA_ONE;
		end
		DATA_ONE: begin
			next_state = DATA_TWO;
		end
		DATA_TWO: begin
			next_state = DATA_THREE;
		end
		DATA_THREE:begin
			next_state = DATA_FOUR;
		end
		DATA_FOUR: begin
			next_state = DATA_FIVE;
		end
		DATA_FIVE: begin
			next_state = DATA_SIX;
		end
		DATA_SIX: begin
			next_state = DATA_SEVEN;
		end
		DATA_SEVEN: begin
			next_state = DATA_EIGHT;
		end
		DATA_EIGHT: begin
			if (in) begin
				next_state = STOP;
			end
			else begin
				next_state = WAIT;
			end
		end
		WAIT: begin
			if (in) begin
				next_state = IDLE;
			end
			else begin
				next_state = WAIT;
			end
		end
		STOP: begin
			if (in) begin
				next_state = IDLE;
			end
			else begin
				next_state = START;
			end	
		end
		default: begin
			next_state = IDLE;
		end
	endcase
end 

//状态机第三段,结果输出,组合逻辑
assign done = (state==STOP);

endmodule

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【HDLBits 刷题 10】Circuits(6)Finite State Manchines 10-17 的相关文章

  • 比较数字进行排序然后得到中值

    使用按位或比较运算符对五个整数进行排序可以通过以下方式实现 首先获取最大的数字 然后获取第二大的数字 然后获取第三大的数字 依此类推 这是我获取最高数字的代码 include
  • 分治—快速选择算法

    文章目录 215 数组中的第K个最大元素 1 题目 2 算法原理 3 代码实现 LCR 159 库存管理 III
  • 如何在 Verilog 中定义带参数的模块?

    我想定义一个add有一个参数的模块 但我对新实例的声明进展不顺利 我想定义这个模块的一个实例 module add parameter wd 1 input wire wd 1 0 a b output wire wd 1 0 o assi
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • [Verilog] Verilog 基本格式和语法

    主页 元存储博客 全文 3000 字 文章目录 1 声明格式 1 1 模块声明 1 2 输入输出声明 1 3 内部信号声明 1 4 内部逻辑声明
  • 「Verilog学习笔记」游戏机计费程序

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点 刷题网站用的是牛客网 timescale 1ns 1ns module game count input rst n 异位复位信号 低电平有效 input clk 时
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • 如何在verilog中逐行读取文本文件?

    我有一个 SREC 文件 它是一个简单的文本文件 我想在 verilog 中逐行读取它 我怎样才能做到这一点 以下读取文件 每个时钟周期 1 行 预期的数据格式是每行一个十进制数 integer data file file handler
  • 如何在RTL中使用时钟门控?

    我正在对一些时钟进行门控latch以及我设计中的逻辑 我在综合和布局布线方面没有太多经验 在 RTL 中实现时钟门控的正确方法是什么 示例1 always comb begin gated clk clk latch update en e
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • 将枚举转换为逻辑

    考虑以下模块声明 module DFF d q CLK RESET parameter W 2 input W 1 0 d input CLK input RESET output logic W 1 0 q endmodule 当 d 和
  • verilog 中的“<<”运算符

    我有一个verilog代码 其中有一行如下 parameter ADDR WIDTH 8 parameter RAM DEPTH 1 lt lt ADDR WIDTH 这里将存储什么RAM DEPTH以及什么是 lt lt 操作员在这里做
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • 在 Verilog 中判断总线是否包含单个 x 的最佳方法是什么?

    我有一个监控总线的测试台 总线内的一些信号 位 可以是 1 bx 由于多种原因 我需要知道总线内是否有任何信号是 1 bx 如果总线包含任何 x 测试 不用于综合 仅用于模拟目的 的最佳方法是什么 我曾希望我可以使用减少或然后使用 但这似乎
  • 具有 +1 逻辑的 4 位计数器 D 触发器

    我正在尝试通过 Verilog 实现带有 1 逻辑的 D 触发器计数器 但是我收到了很多有关网络多个常量驱动程序的错误代码 有人可以帮我吗 这是到目前为止的代码 module LAB clk clear Enable Q input clk
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻
  • verilog 中的案例陈述

    我遇到了优先级编码器设计 并找到了一种使用 case 语句来实现它的新方法 唯一令人困惑的是 case语句是否优先考虑case 例子 case 1 b1 A 3 Y lt 4 b1000 A 2 Y lt 4 b0100 A 1 Y lt

随机推荐

  • Spring:基于xml文件的控制反转(ioc)

    1 环境搭建 导入spring使用最基本的坐标
  • VMware Workstation 不可恢复错误: (vmx)

    errors VMware Workstation 不可恢复错误 vmx Exception 0xc0000006 disk error while paging has occurred 日志文件位于 K vmware centos vm
  • 运用决策表设计测试用例

    逻辑关系 逻辑关系 logic relationship 即 依赖关系 在项目管理中 指表示两个活动 前导活动和后续活动 中一个活动的变更将会影响到另一个活动的关系 强制依赖关系 所做工作中固有的依赖关系 可自由处理的依赖关系 由项目队伍确
  • MyBatis:尝试解决Spring Boot集成MyBatis 懒加载时序列化失败的三种方法以及原因FAIL_ON_EMPTY_BEANS

    MyBatis 解决No serializer found for class org apache ibatis executor loader javassist JavassistProxyFactory EnhancedResult
  • python3 Flask 简单入门(MVC模板类)

    跟上一篇文章一样的内容 Flask默认支持的模板是jinja2 jinja2简单实用 1 在Jinja2模板中 我们用 name 表示一个需要替换的变量 很多时候 还需要循环 条件判断等指令语句 在Jinja2中 用 表示指令 2 循环输出
  • win10 装黑苹果 完整教程

    一 材料准备 1 虚拟机软件VMware 2 适用于Windows版本的VMware解锁安装Mac OS的补丁 3 Mac OS X 10 10的黑苹果镜像 以上材料我都为你贴心地准备齐了 在我的云盘获取 链接 https pan baid
  • VUE3+Element-Plus form表单封装

    VUE3 Element Plus form表单封装 新建form组件页面 创建index vue 新建form组件页面 在components中创建新组件 将需要的form表单中常用的UI组件引入 vue3创建组件和vue2中多少有点区别
  • 大学《数据库原理与技术》复习题(二)

    数据库复习题 一 选择题 1 B 是按照一定的数据模型组织的 长期存储在计算机内 可为多个用户共享的数据的集合 A 数据库系统 B 数据库 C 关系数据库 D 数据库管理系统 2 数据库系统的基础是 A 数据结构 B 数据库管理系统 C 操
  • LVGL V8

    本文适用于LVGL V8版本 LVGL simulator vs2019 官方工程 lv sim visual studio 使用注意事项 1 将官方工程从github上下载下来 最好使用git 将整个工程clone下来 因为工程内部有依赖
  • c++坑人

    大家好 我是LCR 今天为大家带来的是c 中的弹窗病毒 当然你也可以把它理解为坑人代码 如果喜欢这篇文章 可以给我点一个赞吗 代码解释 system是c语言库里面自带的一个函数 start的原本意思为 跳转 后面本应接网址 当你的后面为空时
  • 多功能翻译工具:全球翻译、润色和摘要生成

    openai translator openai translator Stars 18 1k License AGPL 3 0 这个项目是一个多功能翻译工具 由 OpenAI 提供支持 可以进行全球单词翻译 单词润色和摘要生成等操作 提供
  • python项目导出依赖包requirements.txt文件

    只导出当前项目依赖包 注意 使用 pip freeze gt requirements txt 会导出大量无用的文件 包括很多个包信息 其实这里是把你当前 python 环境的所有包的相关信息导出来了 如果我们只需导出当前项目所需的依赖包
  • 如何创建线程,多线程下又如何上锁保护公共资源?

    目录 一 创建线程几种方法 1 继承thread类 重写run方法 2 实现runnable接口 重写run方法 3 使用匿名类 或 lamda表达式 让代码更简洁 4 Callable 接口 5 使用线程池创建线程 二 多线程下 需要上锁
  • canvas画布合成

  • windows自动颁发证书

    首先去配置组策略 计算机配置 windows设置 安全设置 公钥策略 证书注册策略和证书服务客户端 不需要勾选禁用用户配置注册策略服务器 用户配置也这样配置 最后进入证书管理器 找到证书模板 右键证书管理 看见一个计算机 去右键 安全这里允
  • 虚拟内存笔记

    虚拟内存 为什么要有虚拟内存 有些进程实际需要的内存很大 超过物理内存的容量 比如一个几十G的游戏 要运行在内存为8G的计算机上 由于多道程序设计 主存是同时可以存放多个进程的逻辑及数据的 这就使得每个进程可用的物理内存更加稀缺 不可能无限
  • [1194]GitLab在web端合并分支

    文章目录 gitlab 在 web 端合并分支 1 1 发起合并操作 1 2 选择源分支和目标分支 1 3 输入合并备注 1 4 合并检查 1 5 完成合并 1 6 查看提交记录 修改的文件及内容 gitlab 在 web 端合并分支 1
  • 概率密度估计(Probability Density Estimation)--Part3:混合模型

    目录 引入 求解方法 MLE法 Clustering E M EM EM算法 大概的说明 较为详细的说明 高斯混合中的
  • 线性代数 --- Gram-Schmidt, 格拉姆-施密特正交化(上)

    Gram Schmidt正交化 在前面的几个最小二乘的文章中 实际上已经看到Gram Schmidt正交化的影子 在我个人看来 Gram Schmidt正交化更像是一种最小二乘的简化算法 下面 我会接着上一篇文章中的最后一个例子讲 慢慢引出
  • 【HDLBits 刷题 10】Circuits(6)Finite State Manchines 10-17

    目录 写在前面 Finite State Manchines Lemmings1 Lemmings2 Lemmings3 Lemmings4 Fsm onehot Fsm ps2 Fsm ps2data Fsm serial 写在前面 HD