verilog练习——时序逻辑
创始人
2024-03-15 22:26:12
0

目录

VL21 根据状态转移表实现时序电路

VL22 根据状态转移图实现时序电路

VL23 ROM的简单实现

VL24 边沿检测


VL21 根据状态转移表实现时序电路

题目分析:

1、使用三段式状态机,实现更为方便和简洁。

2、三段式和(一段式、二段式)对比:

        优点:
                (1)时序逻辑和组合逻辑分开,便于分析。
                (2)利于综合软件的分析和优化。
                (3)代码简介明了,便于维护。

        缺点:
                (1)代码结构相较两段式复杂。
                (2)采用时序逻辑输出避免了亚稳态,但是增加了触发器的使用。

数字IC笔面基础,师傅领进门,修行靠个人——人人心中都有一个状态机(状态机简介及Verilog模板)_HFUT90S的博客-CSDN博客

三段式状态机模板:

第1段:描述状态转移(时序逻辑)

第2段:描述状态转移的条件和规律(组合逻辑)

第3段:描述状态输出(组合/时序逻辑)

 代码实现:

module seq_circuit(input                A   ,input                clk ,input                rst_n,output   wire        Y   
);//三段式状态机//状态定义        
localparam IDLE = 2'b0;    //初态
localparam s0 = 2'b01;
localparam s1 = 2'b10;
localparam s2 = 2'b11;reg [1:0] CS;	//现态
reg [1:0] NS;	//次态//描述状态转移(时序逻辑)
always @(posedge clk or negedge rst_n)beginif(!rst_n)CS <= IDLE;else CS <= NS;
end//描述状态转移的条件和规律(组合逻辑)
always @(*)begincase(CS)IDLE:	if(!A)NS = s0;elseNS = s2;s0  :	if(!A)NS = s1;elseNS = IDLE;s1  :	if(!A)NS = s2;elseNS = s0;s2  :	if(!A)NS = IDLE;elseNS = s1;default: NS = IDLE;endcase      	
end//描述状态输出(组合/时序逻辑)
assign Y = ((CS == IDLE)|(CS == s0)|(CS == s1))?0:1;endmodule

VL22 根据状态转移图实现时序电路

题目分析:

VL22和VL21同理,只不过从状态转移表换成了状态转移图,细心一点就没问题,用的还是三段式状态机。

说明:→上表示“C/Y”,圆圈内为现态,→指向次态。

代码实现:

`timescale 1ns/1nsmodule seq_circuit(input                C   ,input                clk ,input                rst_n,output   wire        Y   
);//三段式状态机//状态定义
localparam IDLE = 2'b0;
localparam s0 = 2'b01;
localparam s1 = 2'b10;
localparam s2 = 2'b11;reg [1:0] CS;	//现态
reg [1:0] NS;	//次态//描述状态转移(时序逻辑)
always @(posedge clk or negedge rst_n)beginif(!rst_n)CS <= IDLE;else CS <= NS;
end//描述状态转移的条件和规律(组合逻辑)
always @(*)begincase(CS)IDLE:	if(!C)NS = IDLE;	//0elseNS = s0;	//0s0  :	if(!C)NS = s2;	//0elseNS = s0;	//0s1  :	if(!C)NS = IDLE;	//0elseNS = s1;	//1s2  :	if(!C)NS = s2;	//1elseNS = s1;	//1default: NS = IDLE;endcase      	
end//描述状态输出(组合/时序逻辑)
assign Y = ((CS == s2) | ((CS == s1)& (C == 1)))?1:0;endmodule

VL23 ROM的简单实现

题目描述:

        ①实现一个深度为8,位宽为4bit的ROM,数据初始化为0,2,4,6,8,10,12,14。可以通过输入地址addr,输出相应的数据data。

        ②使用Verilog HDL实现以上功能并编写testbench验证。

代码实现:

module VL23_rom(input clk,input rst_n,input [7:0]addr,output [3:0]data
);//定义一个深度为8 宽度为4的数组
reg [3:0] memory [7:0];	always @(posedge clk or negedge rst_n)beginif(!rst_n)beginmemory[0] <= 4'b0;memory[1] <= 4'b0;memory[2] <= 4'b0;memory[3] <= 4'b0;		memory[4] <= 4'b0;memory[5] <= 4'b0;		memory[6] <= 4'b0;memory[7] <= 4'b0;		endelse beginmemory[0] <= 4'd0;memory[1] <= 4'd2;memory[2] <= 4'd4;memory[3] <= 4'd6;		memory[4] <= 4'd8;memory[5] <= 4'd10;		memory[6] <= 4'd12;memory[7] <= 4'd14;		end		
endassign data = 	(addr == 8'd0)?memory[0]:(addr == 8'd1)?memory[1]:	(addr == 8'd2)?memory[2]:(addr == 8'd3)?memory[3]:				(addr == 8'd4)?memory[4]:(addr == 8'd5)?memory[5]:(addr == 8'd6)?memory[6]:(addr == 8'd7)?memory[7]:0;
endmodule

仿真文件:

module tb_VL23_rom;// Inputsreg clk;reg rst_n;    reg [7:0] addr ;                // Outputswire [3:0] data;// Instantiate the Unit Under Test (UUT)VL23_rom uut (.clk(clk), .rst_n(rst_n), .addr(addr), .data(data));initial begin// Initialize Inputsclk = 0;rst_n = 0;addr = 0;// Wait 100 ns for global reset to finish#100;rst_n = 1'b1;#100;addr = 4'd6;		#100;						//#100  addr = 4'd5;  addr = 4'd5;				//代表100ns后addr由上一个状态4'd6 变为此时的状态4'd5#100;addr = 4'd4;	#100;		addr = 4'd3;#100;addr = 4'd2;#100;				addr = 4'd1;		// Add stimulus hereendalways #10 clk=~clk;endmodule

仿真图片:

VL24 边沿检测

题目描述:

        边沿检测:有一个缓慢变化的1bit信号a,编写一个程序检测a信号的上升沿给出指示信号rise,当a信号出现下降沿时给出指示信号down。
        注:rise,down应为单脉冲信号,在相应边沿出现时的下一个时钟为高,之后恢复到0,一直到再一次出现相应的边沿。

代码实现:

module VL24_edge_detect(input clk,input rst_n,input a,output reg rise,output reg down
);reg b,c;
wire posedge_flag;
wire negedge_flag;	always @(posedge clk or negedge rst_n)beginif(!rst_n)beginb <= 1'b0;c <= 1'b0;endelse beginb <= a;c <= b;		end
endassign posedge_flag = ~c & b;	
assign negedge_flag = c & ~b;	always @(*)beginif(posedge_flag)rise <= 1'b1;		else if(negedge_flag)down <= 1'b1;else begin	rise <= 1'b0;	down <= 1'b0;end
end	endmodule

仿真文件:

module tb_VL24_edge_detect;// Inputsreg clk;reg rst_n;    reg a;                // Outputswire rise;wire down;// Instantiate the Unit Under Test (UUT)VL24_edge_detect uut (.clk(clk), .rst_n(rst_n), .a(a), .rise(rise),.down(down));initial begin// Initialize Inputsclk = 0;rst_n = 0;a = 0;// Wait 100 ns for global reset to finish#100;rst_n = 1'b1;#100;a = 1;		#300;						a = 0;				#300;a = 1;#300;				a = 4'd0;		// Add stimulus hereendalways #10 clk=~clk;endmodule

仿真图片:


哈哈哈,结束啦!

相关内容

热门资讯

聚杰微纤(300819)披露制... 截至2025年12月25日收盘,聚杰微纤(300819)报收于28.81元,较前一交易日上涨3.0%...
康曼德资本董事长丁楹:A股将进... 2025年A股在政策、估值、盈利、资金四重支撑下走出了牛市行情,但市场细分赛道的分化却愈发明显。20...
缅甸妙瓦底KK园区等已被强力拆... 视频来源:公安部微信公众号 记者12月25日从公安部获悉,近日,公安部派出工作组会同缅甸、泰国执法部...
盐田港(000088)披露公司... 截至2025年12月25日收盘,盐田港(000088)报收于4.55元,较前一交易日上涨0.66%,...
952名缅甸妙瓦底地区涉电诈犯... 来源:人民日报客户端 中缅泰联合开展清剿缅甸妙瓦底地区 赌诈园区行动 952名缅甸妙瓦底地区涉电诈犯...
原创 新... 最近几个赛季,孙铭徽一直都被视为广厦的“小外援”,距离他上一次场均得分不到两位数,还要追溯到2018...
意大利要求Meta暂停禁止竞争... 意大利已下令Meta公司暂停其禁止企业在WhatsApp上使用商业工具提供自家AI聊天机器人的政策。...
山西证券(002500)披露现... 截至2025年12月25日收盘,山西证券(002500)报收于6.11元,较前一交易日上涨0.33%...