首页 > 其他分享 ><Verilog学习>Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器

<Verilog学习>Verilog设计参数化的译码器与编码器,以及设计4位格雷码计数器

时间:2023-01-14 11:22:38浏览次数:52  
标签:10 编码器 monitor clk initial gray Verilog rst 译码器

使用Quartus+modelsim完成设计

目录

1. 参数化的译码器

在这里插入图片描述

分析

参数化译码器,由于输出Y使用的是独热码,所以可以直接用移位运算符实现。

代码实现

module decodern #(
	parameter n=3,
				 m=1<<n
	)(
	input wire[n-1:0]in,
	output reg[m-1:0]y
	);
	//y is one-hot, so just use shift to finish
	always@(*)y=1<<in;
endmodule 

Testbench

`timescale 1 ns/ 1 ns
module decodern_vlg_tst();
reg [2:0] in;
// wires                                               
wire [7:0]  y;
                      
decodern i1 ( 
	.in(in),
	.y(y)
);
initial                                                
begin
	in=3'b010;
	#10 in=3'b001;
	#10 in=3'b111;
	#10 $stop;
end
initial 
	$monitor($time,": in=%b \t -> \t y=%b ",in,y);
endmodule

结果

输出结果与预期一致

  • Modelsim波形显示以及monitor输出
    在这里插入图片描述
    在这里插入图片描述

  • 逻辑综合电路
    在这里插入图片描述

2. 参数化的编码器

在这里插入图片描述

分析

参数化的编码器,主要问题点是实现优先编码,只识别最高位最先为“1”的位数,然后赋值给输出y

  • 为了实现优先编码,应该到达就跳出循环,quartus的语法中不支持break;
  • 可以使用disable来跳出循环

代码

module encodern #(
	parameter n=3,
				 m=1<<n
)(
	input wire[m-1:0]in,
	output reg[n-1:0]y
);
	integer i;
	always@(*)
	begin:encoder
		for (i=m-1;i>0;i=i-1)
			if(in[i]==1)
			begin
				y = i;
				disable encoder;
				//jump loop called encoder
			end
			else y = 0;
	end
	
endmodule 

Testbench

`timescale 1 ns/ 1 ns
module encodern_vlg_tst();
reg [7:0] in;
// wires                                               
wire [2:0]  y;

// assign statements (if any)                          
encodern i1 (
// port map - connection between master ports and signals/registers   
	.in(in),
	.y(y)
);
initial                                                
begin        
	in = 8'b1000_0000;
	#10 in = 8'b0111_1111;
	#10 in = 8'b0010_1000;
	#10 in = 8'b0000_0000;
	#10 in = 8'b0000_0000;
	#10 $stop;
end
initial $monitor($time, ": in:%b \t -> \t y:%b",in,y);
endmodule

结果

输出结果与预期一致

  • Modelsim波形显示以及monitor输出
    在这里插入图片描述
    在这里插入图片描述

  • 逻辑综合电路
    在这里插入图片描述

3. 4位格雷码计数器

在这里插入图片描述

分析

对于四位格雷码,可以直接用一个Case解决,实现一个循环,同时注意是异步复位

Q[3] Q[2] Q[1] Q[0]
0 0 0 0
0 0 0 1
0 0 1 1
0 0 1 0
0 1 1 0
0 1 1 1
0 1 0 1
0 1 0 0
1 1 0 0
1 1 0 1
1 1 1 1
1 1 1 0
1 0 1 0
1 0 1 1
1 0 0 1
1 0 0 0

代码

module Gray(
	input clk,
	input rst_n,
	output reg[3:0]gray
);
	always@(posedge clk or negedge rst_n)
	if(!rst_n)	gray <= 4'b0000;
	else
		case(gray)
			4'b0000 : gray <= 4'b0001;
			4'b0001 : gray <= 4'b0011;
			4'b0011 : gray <= 4'b0010;
			4'b0010 : gray <= 4'b0110;
			4'b0110 : gray <= 4'b0111;
			4'b0111 : gray <= 4'b0101;
			4'b0101 : gray <= 4'b0100;
			4'b0100 : gray <= 4'b1100;
			4'b1100 : gray <= 4'b1101;
			4'b1101 : gray <= 4'b1111;
			4'b1111 : gray <= 4'b1110;
			4'b1110 : gray <= 4'b1010;
			4'b1010 : gray <= 4'b1011;
			4'b1011 : gray <= 4'b1001;
			4'b1001 : gray <= 4'b1000;
			4'b1000 : gray <= 4'b0000;
			default : gray <= 4'bx;
		endcase

endmodule 

Testbench

`timescale 1 ns/ 1 ns
module Gray_vlg_tst();
reg clk;
reg rst_n;
// wires                                               
wire [3:0]  gray;

// assign statements (if any)                          
Gray i1 (
// port map - connection between master ports and signals/registers   
	.clk(clk),
	.gray(gray),
	.rst_n(rst_n)
);
initial 
begin 
	rst_n = 0;//initial state
	clk = 0;
	#5 rst_n = 1;
	#100 $stop;
end

always #5 clk = ~clk;

initial $monitor($time,"-> \t now state of gray is : %b",gray);
endmodule

结果

输出结果与预期一致

  • Modelsim波形显示以及monitor输出
    在这里插入图片描述
    在这里插入图片描述

  • 逻辑综合电路

在这里插入图片描述

标签:10,编码器,monitor,clk,initial,gray,Verilog,rst,译码器
From: https://www.cnblogs.com/TiYuan/p/17051470.html

相关文章

  • <Verilog学习>Verilog设计“111”检测器与“01110”检测器并测试所有情况
    使用Quartus+modelsim完成本次设计目录1."111"检测器分析代码实现Testbench结果2."01110"检测器分析代码实现Testbench结果1."111"检测器分析分析题目,得到其有限状......
  • Verilog实现基于状态机的序列检测
    一、状态机的基本概念硬件设计需要并行设计思想,而用Verilog描述的电路大多都是并行实现的,但是对于实际的项目工程,往往需要让硬件来做一些具有顺序的工作,这就要用到状态......
  • m在ISE平台下使用verilog开发基于FPGA的GMSK调制器
    1.算法描述高斯最小频移键控(GaussianFilteredMinimumShiftKeying),这是GSM系统采用的调制方式。数字调制解调技术是数字蜂窝移动通信系统空中接口的重要组成部分。GMSK调......
  • m在ISE平台下使用verilog开发基于FPGA的GMSK调制器
    1.算法描述       高斯最小频移键控(GaussianFilteredMinimumShiftKeying),这是GSM系统采用的调制方式。数字调制解调技术是数字蜂窝移动通信系统空中接口的重要......
  • 03-Verilog语法
    Verilog语法1Register组合逻辑-->寄存器-->组合逻辑-->寄存器Register是一个变量,用于存储值,并不代表一个真正的硬件DFF。regA,C;//assignmentsarealwaysdonei......
  • 电子设计教程51:16*16LED点阵屏驱动-74HC238译码器
      我尝试通过移位寄存器级联+三八译码器,实现用3跟控制线,驱动16*16LED点阵屏的效果。这是第三篇博客,讲述三八译码器的工作原理。  当驱动8×8LED点阵时,单片机至少需要发......
  • Verilog基本语法(二)模块
    模块module<模块名>(<模块端口列表>,<端口声明>(若有),<参数声明>(可选));...//模块内容//1-wire,reg和其他类型的变量声明;//2-数据流语句(assign);//3-......
  • 01-Verilog
    VerilogRTL编程实践在进行数字IC设计过程中,RTLcoding能力是非常重要的。结合逻辑仿真(VCS)和逻辑综合(DesignCompiler)工具。看RTL。1.ASICDesignFLOwIDEADesignsp......
  • Verilog基本语法(一)基本概念
    VerilogHDL是一种硬件描述语言(HDL:HardwareDescriptionLanguage),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻......
  • 基于Verilog的脉冲边缘检测电路及代码实现
    一、摘要本篇博客主要记录使用Verilog实现对脉冲的上升沿和下降沿检测;下面的链接是博主所写的“基于basys2的按键消抖”,其中状态机实现按键消抖使用了本篇博客所介绍的边......