「Verilog学习笔记」信号发生器

专栏前言

本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网

方波的实现,较为简单,只需要设置一个计数器,使输出保持10个时钟为0,跳变为20,再保持10个时钟。依次循环。可以按照如下的过程实现:cnt每个时钟加一,当cnt=19时,将wave的值置为0,同时cnt置为0;当cnt=9时,将wave的值置为20。

锯齿波的实现,即输出信号由0每次加一递增到20,然后从20跳变到0。可以按照如下的过程实现:当wave=20,将wave的值置为0,其余时刻,wave加一。

三角波的实现,类似于锯齿波,但当wave达到20时,不是跳变到0,而是以一为步长递减到0。可以设置一个指示信号up,当up的值是1时,wave每个时钟加一。当up的值为0时,则减一。

复制代码
`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) begin 
		if (!rst_n) begin 
			wave <= 5'd0 ; 
			cnt <= 5'd0 ; 
		end
		else begin 
			case (wave_choise) 
				2'b00 : begin 
					if (cnt == 5'd19) begin 
						wave <= 5'd0 ; 
						cnt <= 5'd0 ; 
					end
					else if (cnt == 5'd9) begin 
						wave <= 5'd20 ;
						cnt <= cnt + 1'd1 ; 
					end
					else begin 
						wave <= wave ; 
						cnt <= cnt + 1'd1 ; 
					end
				end
				2'b01 : begin
					if (wave == 5'd20) wave <= 5'd0 ; 
					else wave <= wave + 1'd1 ; 
				end
				2'b10 : begin 
					if (wave == 5'd20) begin 
						wave <= wave - 1'd1 ; 
						up <= 1'd0 ; 
					end
					else if (wave == 5'd0) begin 
						wave <= wave + 1'd1 ; 
						up <= 1'd1 ; 
					end
					else if (up) wave <= wave + 1'd1 ; 
					else wave <= wave - 1'd1 ; 
				end
				default : 
					wave <= 1'b0 ; 
			endcase
		end
	end			
  
endmodule
相关推荐
问君能有几多愁~1 天前
C++ 数据结构复习笔记
数据结构·c++·笔记
r_oo_ki_e_1 天前
Java Map 集合学习笔记
java·笔记·学习
笨鸟先飞的橘猫1 天前
skynet——sharetable学习
学习·skynet
liuyicenysabel1 天前
大模型学习笔记 · 第八篇 · 进阶:偏好对齐与多卡训练
人工智能·笔记·学习
Funing71 天前
FreeRTOS学习day1:Keil 工程配置与 FreeRTOS 链表机制理解
数据结构·学习·链表
心中有国也有家1 天前
使用 DevEco Studio 配置 Flutter 鸿蒙签名
学习·flutter·华为·harmonyos
灯澜忆梦1 天前
MySQL 完整学习路线
学习·mysql
番茄育学园1 天前
我的三款主流云存储音乐库实测笔记
笔记·分类·媒体
森林古猿11 天前
再论斜率优化
c++·学习·算法
心中有国也有家1 天前
鸿蒙Flutter开发环境从零搭建教程(Windows/macOS双平台·避坑版)
学习·flutter·华为·harmonyos