12.5单端口RAM,JS计数器,流水线乘法器,不重叠序列检测器(状态机+移位寄存器),信号发生器,交通灯

news2024/9/21 8:05:25

单端口RAM 

`timescale 1ns/1ns



module RAM_1port(
    input clk,
    input rst,
    input enb,
    input [6:0]addr,
    input [3:0]w_data,
    output wire [3:0]r_data
);

    reg [6:0]mem[127:0];
    integer i;
    always @(posedge clk or negedge rst) begin
        if(!rst) begin
            for (i=0; i<127 ; i=i+1) begin
                mem[i] <= 'b0;
            end
        end
        else if (enb) begin
            mem[addr] <= w_data;
        end
    end
	
    assign r_data = (!enb)?mem[addr]:'b0;


endmodule

JS计数器

`timescale 1ns/1ns

module JC_counter(
   input                clk ,
   input                rst_n,
 
   output reg [3:0]     Q  
);
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) Q <= 'd0;
        else Q <= {~Q[0], Q[3 : 1]};
    end
endmodule

流水线乘法器

 
  assign mul_1 = mul_b[0]? mul_a: 0;
  assign mul_2 = mul_b[1]? mul_a<<1: 0;
  assign mul_3 = mul_b[2]? mul_a<<2: 0;
  assign mul_4 = mul_b[3]? mul_a<<3: 0;
   

这步就是竖式乘法,认为是b个a相加在一起,b的最低位上的数字意味着有1个a,b[1]位上的数字意味着有2个a,b[2]意味有4个,B【3】意味有8个。所以就采用移位方式。

  assign sum_1 = {size*(1'b0),mul_r1} + {size*(1'b0),mul_r2};
  assign sum_2 = {size*(1'b0),mul_r3} + {size*(1'b0),mul_r4};
`timescale 1ns/1ns

module multi_pipe#(
	parameter size = 4
)(
	input 						clk 		,   
	input 						rst_n		,
	input	[size-1:0]			mul_a		,
	input	[size-1:0]			mul_b		,
 
 	output	reg	[size*2-1:0]	mul_out		
);
    //parameter 
    parameter N = size * 2;
    //defination
    wire [N - 1 : 0] temp [0 : 3];
    
    reg [N - 1 : 0] adder_0;
    reg [N - 1 : 0] adder_1;
    
    //output 
    genvar i;
    generate
        for(i = 0; i < 4; i = i + 1)begin : loop
            assign temp[i] = mul_b[i] ? mul_a << i : 'd0;
        end
    endgenerate
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) adder_0 <= 'd0;
        else adder_0 <= temp[0] + temp[1];
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) adder_1 <= 'd0;
        else adder_1 <= temp[2] + temp[3];
    end
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) mul_out <= 'd0;
        else mul_out <= adder_0 + adder_1;
    end
endmodule

这里注意temp[]的位数是N-1.即两倍的乘法位数。

变量名前的【】表示变量的位宽,每位的位宽。变量名后的【】表示数组长度,相同变量的个数,串在一起。

不重叠序列检测

状态机

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);
    
    parameter ZERO=0, ONE=1, TWO=2, THREE=3, FOUR=4, FIVE=5, SIX=6, FAIL=7;
    reg [2:0] state, nstate;
    reg [2:0] cnt;
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            cnt <= 0;
        else
            cnt <= cnt==6? 1: cnt+1; 
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            state <= ZERO;
        else
            state <= nstate;
    end
    
    always@(*) begin
        if(~rst_n)
            nstate = ZERO;
        else
            case(state)
                ZERO : nstate = data? FAIL : ONE;
                ONE  : nstate = data? TWO  : FAIL;
                TWO  : nstate = data? THREE: FAIL;
                THREE: nstate = data? FOUR : FAIL;
                FOUR : nstate = data? FAIL : FIVE;
                FIVE : nstate = data? FAIL : SIX;
                SIX  : nstate = data? FAIL : ONE;
                FAIL : nstate = cnt==6&&data==0? ONE: FAIL;
                default: nstate = ZERO;
            endcase
    end
    
    always@(*) begin
        if(~rst_n) begin
            match     = 0;
            not_match = 0;
        end
        else begin
            match     = cnt==6&&state==SIX;
            not_match = cnt==6&&state==FAIL;
        end
    end
    
endmodule
FAIL : nstate = cnt==6&&data==0? ONE: FAIL;

移位寄存器

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);
    
    reg [2:0] cnt;
    reg [5:0] data_r;
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            cnt <= 0;
        else 
            cnt <= cnt==5? 0: cnt+1;
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            data_r <= 6'b0; 
        else
            data_r <= {data_r[4:0], data};
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            match     <= 1'b0;
            not_match <= 1'b0;
        end
        else begin
            match     <= (cnt==5) && ({data_r[4:0], data}==6'b011100);
            not_match <= (cnt==5) && ({data_r[4:0], data}!=6'b011100);
        end
    end
    
endmodule

判断必须要这样判断,不可写为~match。

因为要match时,是要取反的是当下周期,但是由于是非阻塞,此时macth是上个周期的,但非阻塞,就会导致下个Not_match取反的就是上个周期的match而不是当下周期的,下个周期的match取反才是需要的

需要注意由于是非阻塞,所以当前进入的数据会在下一个周期里才会进入寄存器,所以在本周期中如果要输出,就需要额外再移位判断一下

信号发生器

在方波时,

// 仅在方波模式工作的计数器
always@(posedge clk or negedge rst_n) begin
    if(~rst_n)
      cnt <= 0;
    else
      cnt <= wave_choise!=0 ? 0:
             cnt        ==19? 0:
             cnt + 1;
end

如果波形选择不是0,即!=0成立,那么cnt就一直保持为0;不然就是==0成立,然后判断cnt是不是等于19,如果是的话,就复位,重新计数,不然就+1 

wave <= cnt ==9 ? 20: 
        cnt ==19? 0 :
        wave;

 就是cnt是只在方波模式下才工作的,先判断cnt是否==9,是的话就让wave=20;不是的话,就判断是不是等于19,是的话复位到0,不然就保持,这样实现出来的话,每个周期下,前半个周期是低电平,只有到cnt==9时,wave在下个周期设置为20,才会在后半个周期显示为高电平。

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);

	reg [4:0]cnt;
	reg up;
	always @(posedge clk or negedge rst_n)
		if (!rst_n)
			begin 
				wave <= 0;
				cnt <= 0;
			end
		else case (wave_choise)
		2'b00:				//产生方波,保持0十个时钟,保持20十个时钟
			begin
				if (cnt == 19)
					begin	
						wave <= 0;
						cnt <= 0;
					end
				else if(cnt == 9)
					begin	
						wave <= 20;
						cnt <= cnt + 1;
					end
				else
					begin
						wave <= wave;
						cnt <= cnt + 1;
					end
			end
		2'b01:				//产生锯齿,0递增到20
			begin
				if (wave == 20)
					begin
						wave <= 0;
					end
				else 
					begin
						wave <= wave + 1;
					end
			end
		2'b10:
			begin
				if (wave == 20)
					begin
						wave <= wave - 1;
						up <= 0;
					end
				else if (wave == 0)
					begin
						wave <= wave + 1;
						up <= 1;
					end
				else if (up)
					begin
						wave <= wave + 1;
					end
				else 
					begin
						wave <= wave - 1;
					end
			end
		default:
			begin
				wave <= 1;
			end
	endcase
endmodule

交通灯

竞争与险象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python3 中常见的数据类型

目录 数字(Number)总结 字符串(String)字符串运算符字符串格式化字符串的截取总结 List&#xff08;列表&#xff09;更新列表删除列表元素列表函数&方法总结 Tuple&#xff08;元组&#xff09;修改元组删除元组总结 Set&#xff08;集合&#xff09;Dictionary&#xff0…

Java实现快速排序算法

快速排序算法 &#xff08;1&#xff09;概念&#xff1a;快速排序是指通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行&…

Python中的魔力编程:掌握面向对象之道

Python中的面向对象编程 背景&#xff1a; ​ 最近在看一些代码的时候&#xff0c;对类中的一些内置方法不是很懂&#xff0c;因此出一篇文章来细说一下&#xff0c;希望大家看完后对Python中类有一个清楚的认识。 基础铺垫&#xff1a; ​ 面向对象的三个特点&#xff1a;…

案例课6——追一科技

1.公司介绍 追一科技是一家企业级智能服务AI公司&#xff0c;创立于2016年3月&#xff0c;主攻深度学习和自然语言处理&#xff0c;为金融、零售、生活服务等领域企业提供智能服务系统和解决方案。 追一科技的智能服务系统AIforce&#xff0c;拥有AI语义理解能力、智能产品矩阵…

【Android】完美解决Cannot resolve method ‘subscribe(Observer<T>)‘

问题截图&#xff1a; 解决方法&#xff1a; 如上图&#xff0c;看我标123的三个地方&#xff0c;2标注的地方提示我们我方法实际返回的值是Observer<Res_GetCellCode>,而我想要返回的结果是&#xff1a;3标记的结果&#xff1a;Observer<Res_QueryCTInfo>&#xf…

python自动化运维快速入门,python自动化运维教程

大家好&#xff0c;给大家分享一下python自动化运维需要掌握的技能&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 面向学员 熟练使用计算机&#xff0c;对Windows、Linux 有一点了解从业职或在校学生 对目前从事互联网运维&#xff0c;想…

js 生成分享码或分享口令

代码 function getShareToken(length) {var characters ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;var shareToken ;for (var i 0; i < length; i) {var randomIndex Math.floor(Math.random() * characters.length);var randomChar character…

亚马逊云科技Amazon Bedrock,现推出更多模型选择和全新强大功能

亚马逊云科技在re:Invent 2023上宣布推出Amazon Bedrock更多模型选择和强大功能&#xff0c;帮助客户更轻松地构建和规模化针对其业务定制的生成式AI应用程序。 Amazon Bedrock是一项全面托管的服务&#xff0c;用户可轻松访问来自AI21 Labs、Anthropic、Cohere、Meta、Stabili…

CRM的作用:强化客户忠诚度和提升业务效益

随着国内市场的不断发展和企业数字化进程持续进行&#xff0c;许多人在工作和生活中或多或少都对CRM客户关系管理系统有所耳闻&#xff0c;但可能并不清楚CRM管理系统具体是什么&#xff0c;以及都有什么作用。这篇文章带您全面了解一下&#xff0c;CRM是什么&#xff0c;以及C…

java-两个列表进行比较,判断那些是需要新增的、删除的、和更新的

文章目录 前言两个列表进行比较&#xff0c;判断那些是需要新增的、删除的、和更新的 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…

02基于matlab的卡尔曼滤波

基于matlab的卡尔曼滤波&#xff0c;可更改状态转移方程&#xff0c;控制输入&#xff0c;观测方程&#xff0c;设置生成的信号的噪声标准差&#xff0c;设置状态转移方差Q和观测方差R等参数&#xff0c;程序已调通&#xff0c;需要直接拍下。

bootstrap:下拉菜单

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>下拉菜单DEMO</title> <link rel"stylesheet" type"text/css" href"/cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css"…

加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)

文章目录 &#x1f680;前言&#x1f680;异或运算以及与运算&#x1f680;加法的实现&#x1f680;减法的实现&#x1f680;乘法的实现&#x1f680;除法的实现 &#x1f680;前言 这也是阿辉开的新专栏&#xff0c;知识将会很零散不成体系&#xff0c;不过绝对干货满满&…

螺旋方阵-2d

Description 一个 n 行 n 列的螺旋方阵按如下方法生成&#xff1a;从方阵的左上角&#xff08;第 1 行第 1 列&#xff09;出发&#xff0c;初始时向右移动&#xff1b;如果前方是未曾经过的格子&#xff0c;则继续前进&#xff1b;否则&#xff0c;右转。重复上述操作直至经过…

【离散数学】——期末刷题题库( 二元关系)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

CAVLC(基于上下文自适应的可变长编码)

以1个4 x 4的图像块为例,来说明CAVLC的编码及解码过程。 编码 ZIG-ZAG排列 ZIG-ZAG排列后的序列为: 计算非零系数数目和拖尾系数数目 TotalCoeffs:非零系数数目。变换系数level中所有不为0的level的数目,本例中为5。 TrailingOnes:拖尾系数的数目。指的是矩阵重排列后…

系统韧性研究(7)| 韧性系统的16大指导原则

不良事件和条件可能会中断系统&#xff0c;导致系统无法提供必要的功能和服务。正如我在本系列的前几篇文章中所概述的那样&#xff0c;韧性是大多数系统的一个基本质量属性&#xff0c;因为它们提供了关键的能力和服务&#xff0c;尽管存在着不可避免的困难&#xff0c;但这些…

部署Nextcloud详细步骤及优化方法

一、安装PHP8.0以上 我这里使用PHP8.0.30 [rootlocalhost ~]# php -v PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.30, Copyright (c) Zend Technologies [rootlocalhost ~]# 安装方法参考 二、安装MY…

台式扫描电镜中的扫描速度和扫描模式如何选择?

台式扫描电镜&#xff08;SEM&#xff09;是一种利用电子束扫描样品表面&#xff0c;通过检测样品反射或发射的次级电子、背散射电子、X 射线等信号&#xff0c;来获取样品的形貌、结构、组成和分布等信息的仪器。台式扫描电镜具有体积小、操作简单、样品制备方便、分辨率高、成…

2023年团体程序设计天梯赛——总决赛题

F-L1-1 最好的文档 有一位软件工程师说过一句很有道理的话&#xff1a;“Good code is its own best documentation.”&#xff08;好代码本身就是最好的文档&#xff09;。本题就请你直接在屏幕上输出这句话。 输入格式&#xff1a; 本题没有输入。 输出格式&#xff1a; 在一…