首页 > 其他分享 >【牛客】3 时序逻辑

【牛客】3 时序逻辑

时间:2023-02-23 21:58:16浏览次数:45  
标签:逻辑 clk 1ns begin 时序 牛客 rst input reg

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

写一个简单的Moore状态机就可以了,太短就懒得写三段式了。

`timescale 1ns/1ns

module seq_circuit(
      input                A   ,
      input                clk ,
      input                rst_n,
 
      output   wire        Y   
);

reg [1:0]state;
always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)
        state <= 0;
    else begin
        case(state)
        0:state <= A?3:1;
        1:state <= A?0:2;
        2:state <= A?1:3;
        3:state <= A?2:0;
        endcase
    end
end
assign Y = (state == 2'b11);
endmodule

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

因为输出定义的是wire变量,这里就直接用的assign输出了。

`timescale 1ns/1ns

module seq_circuit(
   input                C   ,
   input                clk ,
   input                rst_n,
 
   output   wire        Y   
);

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

always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)
        state <= 0;
    else
        state <= next_state;
end
always@(*)
begin
    case(state)
    0:next_state = C?1:0;
    1:next_state = C?1:3;
    2:next_state = C?2:0;
    3:next_state = C?2:3;
    endcase
end
assign Y = (state == 3)||(state == 2&&C);

endmodule

VL23 ROM的简单实现

初始化想用initial的,但是initial不可综合。因为接口定义的是wire,所以直接用assign输出。

ram的话就在always块内赋值即可。

`timescale 1ns/1ns
module rom(
    input clk,
    input rst_n,
    input [7:0]addr,
    
    output [3:0]data
);
reg [3:0]rom[0:7];
always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)begin
        rom[0] <= 0;
        rom[1] <= 2;
        rom[2] <= 4;
        rom[3] <= 6;
        rom[4] <= 8;
        rom[5] <= 10;
        rom[6] <= 12;
        rom[7] <= 14;
    end 
end
assign data = rom[addr];
endmodule

VL24 边沿检测

这题比较简单,把输入打一拍再进行比较,注意时序输出即可。

`timescale 1ns/1ns
module edge_detect(
    input clk,
    input rst_n,
    input a,
    
    output reg rise,
    output reg down
);
reg a_reg;
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        rise <= 1'b0;
        down <= 1'b0;
        a_reg <= 1'b0;
    end else begin
        a_reg <= a;
        if(a&&~a_reg)
            rise <= 1'b1;
        else
            rise <= 1'b0;
        if(~a&&a_reg)
            down <= 1'b1;
        else
            down <= 1'b0;
    end
end
    
endmodule

基础题还是比较简单的,明天开始进阶。

标签:逻辑,clk,1ns,begin,时序,牛客,rst,input,reg
From: https://www.cnblogs.com/magnolia666/p/17149581.html

相关文章

  • TDengine 发布主流时序数据库对比分析报告,与 InfluxDB、TimescaleDB 展开全面对比测试
    2月21日,开源、高性能、云原生的时序数据平台TDengine正式发布TDengine3.0性能对比分析报告,该报告从数据写入、压缩和查询等维度,对比了TDengine与市场其他流行的......
  • 逻辑回归
    逻辑回归在线性回归中,我们预测的目标变量取值范围比较广泛,但是在有些问题中,想要预测的结果可能只有两种。例如,我们想要判断一封电子邮件是否为垃圾邮件,又或者是想要预测一......
  • ubuntu 逻辑卷增加磁盘
    使用lv*相关的命令lvdisplay lvscan ACTIVE      '/dev/ubuntu-vg/ubuntu-lv'[<74.00GiB]inherit lvextend-l+100%free/dev/mapper/ubuntu--v......
  • 用户投稿——详解我了解的 TDengine 以及它所在的时序数据库“战场”
    作者:大数据模型本篇文章出自2022年“用TDengine,写TDengine”征文投稿活动。因为工作的关系,最近几年我接触到过各种国产数据库,唯独对TDengine念念不忘。在众多数......
  • 运算符:指数-链判断-Null判断-逻辑赋值
    指数运算符//2*2console.log(2**2);//4//2*2*2*2console.log(2**4);//16指数运算符是右结合,多个指数运算符连用时,从右边开始计算。console.log(......
  • Linux中做逻辑分区,分区扩容操作
    1.lvm删除先用umount卸载逻辑卷,再用lvremove删逻辑卷,vgremove删卷组,最后用pvremove删物理卷。2.lvm创建  http://www.linuxidc.com/Linux/2010-08/28228.htm1.新......
  • elasticsearch之使用正则表达式自定义分词逻辑
    一、PatternAnalyzer简介elasticsearch在索引和搜索之前都需要对输入的文本进行分词,elasticsearch提供的patternanalyzer使得我们可以通过正则表达式的简单方式来定义分......
  • 服务器业务逻辑处理框架
    1. 多线程    (1)在主线程中利用epoll进程数据的接收,将收到的数据包(包头+包体)给加上消息头(包含连接池的地址)后 扔到消息队列中去;    (2)多个线程从消息队......
  • 【牛客】1 基础语法
    VL1 四选一多路器`timescale1ns/1nsmodulemux4_1(input[1:0]d1,d2,d3,d0,input[1:0]sel,output[1:0]mux_out);//*************code***********//assignmux......
  • 扩容根目录(逻辑卷)
    跨磁盘扩容根目录原创 陈步云 小陈运维 2023-02-0615:26 发表于内蒙古跨磁盘扩容根目LVM的基本概念物理卷PhysicalVolume(PV):可以在上面建立卷组的媒......