发布时间:2025-12-10 19:38:31 浏览次数:3
小梅哥Xilinx FPGA学习笔记2——三八译码器三八译码器〇、功能介绍1.功能描述2.真值表一、代码编写1.设计文件2.激励文件二、总结〇、功能介绍1.功能描述译码器(Decoder)是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。本设计的是通用译码器。三八译码器,即是3种输入状态翻译成8种输出状态。2.真值表一、代码编写1.设计文件moduledecoder_3_8(a,b,c,out);inputa;//输入端口
译码器(Decoder)是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。本设计的是通用译码器。三八译码器,即是 3 种输入状态翻译成 8 种输出状态。
module decoder_3_8(a,b,c,out); input a;//输入端口a input b;//输入端口b input c;//输入端口c output [7:0] out;//输出端口out reg [7:0] out; //或者用output reg [7:0] out//以always块描述的信号赋值,被赋值的对象必须要定义成reg类型always@(a,b,c)begin //相当于always@(*) case({ a,b,c})//位拼接,{a,b,c}变成了一个三位的信号 3'b000:out = 8'b0000_0001; 3'b001:out = 8'b0000_0010; 3'b010:out = 8'b0000_0100; 3'b011:out = 8'b0000_1000; 3'b100:out = 8'b0001_0000; 3'b101:out = 8'b0010_0000;//3'd5 :out = 8'b0010_0000 3'b110:out = 8'b0100_0000; 3'b111:out = 8'b1000_0000; /* 3'd0:out = 8'b0000_0001;//下划线 _ 是为了增强代码的可读性。 3'd1:out = 8'b0000_0010; 3'd2:out = 8'b0000_0100; 3'd3:out = 8'b0000_1000; 3'd4:out = 8'b0001_0000; 3'd5:out = 8'b0010_0000;//3'd5 :out = 8'b0010_0000 3'd6:out = 8'b0100_0000; 3'd7:out = 8'b1000_0000; */ endcase end endmodule 是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!
【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…
`timescale 1ns/1nsmodule decoder_3_8_tb(); reg s_a; reg s_b; reg s_c; wire [7:0] out; decoder_3_8 decoder_3_8( .a(s_a), .b(s_b), .c(s_c), .out(out) ); initial begin s_a=0;s_b=0;s_c=0; //在0时刻三个输入均为0 #200; //经过200ns的延时 s_a=0;s_b=0;s_c=1; //在200ns时输入信号的值 #200; //又经过200ns的延时 s_a=0;s_b=1;s_c=0; //在400ns时输入信号的值 #200; //又经过200ns的延时 s_a=0;s_b=1;s_c=1; //在600ns时输入信号的值 #200; s_a=1;s_b=0;s_c=0; #200; s_a=1;s_b=0;s_c=1; #200; s_a=1;s_b=1;s_c=0; #200; s_a=1;s_b=1;s_c=1; #200; $stop; //停止仿真 endendmodule 1.case开始开始,endcase结束;
2.数字声明时,合法的基数格式有 4 中,包括:十进制(‘d 或 ‘D),十六进制(‘h 或 ‘H),二进制(’b 或 ‘B),八进制(’o 或 ‘O)。数值可指明位宽,也可不指明位宽。
数字10的不同表示方式,'前面的数字表示位数,'后面的一个字母字母表示进制格式b 二进制 4'b1010 0 八进制 2'o12 d 十进制 2'd10h 十六进制 1'ha 3.Verilog 中有 2 种注释方式:用 // 进行单行注释;
reg [7:0] out;//或者用output reg [7:0] out 用 /* 与 */ 进行跨行注释:
/* 3'd0:out = 8'b0000_0001; 3'd1:out = 8'b0000_0010; 3'd2:out = 8'b0000_0100; 3'd3:out = 8'b0000_1000; 3'd4:out = 8'b0001_0000; 3'd5:out = 8'b0010_0000;//3'd5 :out = 8'b0010_0000 3'd6:out = 8'b0100_0000; 3'd7:out = 8'b1000_0000; */ 3.标识符与关键字;标识符(identifier)可以是任意一组字母、数字、$ 符号和 _(下划线)符号的合,但标识符的第一个字符必须是字母或者下划线,不能以数字或者美元符开始。
另外,标识符是区分大小写的。
关键字是 Verilog 中预留的用于定义语言结构的特殊标识符。
Verilog 中关键字全部为小写。
input a;//input 为关键字, a 为标识符 input b;//input 为关键字, a 为标识符 input c;//input 为关键字, a 为标识符 output reg [7:0] out;//output 、reg 为关键字, out 为标识符 4.数值的种类
Verilog HDL 有下列四种基本的值来表示硬件电路中的电平逻辑:0:逻辑 0 或 "假"1:逻辑 1 或 "真"x 或 X:未知z 或 Z:高阻x 意味着信号数值的不确定,即在实际电路里,信号可能为 1,也可能为 0。z 意味着信号处于高阻状态,常见于信号(input, reg)没有驱动时的逻辑结果。例如一个 pad 的 input 呈现高阻状态时,其逻辑值和上下拉的状态有关系。上拉则逻辑值为 1,下拉则为 0 。 5.数据类型
Verilog 最常用的 2 种数据类型就是线网(wire)与寄存器(reg),其余类型可以理解为这两种数据类型的扩展或辅助。
线网(wire)
wire 类型表示硬件单元之间的物理连线,由其连接的器件输出端连续驱动。如果没有驱动元件连接到 wire 型变量,缺省值一般为 “Z”。举例如下:
wire [7:0] out; 线网型还有其他数据类型,包括 wand,wor,wri,triand,trior,trireg 等。这些数据类型用的频率不是很高。
寄存器(reg)
寄存器(reg)用来表示存储单元,它会保持数据原有的值,直到被改写。
reg s_a; reg s_b; reg s_c; 例如在 always 块中,寄存器可能被综合成边沿触发器,在组合逻辑中可能被综合成 wire 型变量。寄存器不需要驱动源,也不一定需要时钟信号。在仿真时,寄存器的值可在任意时刻通过赋值操作进行改写。例如:
reg s_a; reg s_b; reg s_c; initial begin s_a=0;s_b=0;s_c=0; //在0时刻三个输入均为0 #200; //经过200ns的延时 end 4-16译码器
`timescale 1ns / 1nsmodule decoder_4_16(a,b,c,d,out ); input a; input b; input c; input d; output reg[15:0] out;always@(a,b,c,d)begin case({ a,b,c,d}) 4'b0000:out=16'b0000_0000_0000_0001; 4'b0001:out=16'b0000_0000_0000_0010; 4'b0010:out=16'b0000_0000_0000_0100; 4'b0011:out=16'b0000_0000_0000_1000; 4'b0100:out=16'b0000_0000_0001_0000; 4'b0101:out=16'b0000_0000_0010_0000; 4'b0110:out=16'b0000_0000_0100_0000; 4'b0111:out=16'b0000_0000_1000_0000; 4'b1000:out=16'b0000_0001_0000_0000; 4'b1001:out=16'b0000_0010_0000_0000; 4'b1010:out=16'b0000_0100_0000_0000; 4'b1011:out=16'b0000_1000_0000_0000; 4'b1100:out=16'b0001_0000_0000_0000; 4'b1101:out=16'b0010_0000_0000_0000; 4'b1110:out=16'b0100_0000_0000_0000; 4'b1111:out=16'b1000_0000_0000_0000; /* 2'd00:out=16'b0000_0000_0000_0001; 2'd01:out=16'b0000_0000_0000_0010; 2'd02:out=16'b0000_0000_0000_0100; 2'd03:out=16'b0000_0000_0000_1000; 2'd04:out=16'b0000_0000_0001_0000; 2'd05:out=16'b0000_0000_0010_0000; 2'd06:out=16'b0000_0000_0100_0000; 2'd07:out=16'b0000_0000_1000_0000; 2'd08:out=16'b0000_0001_0000_0000; 2'd09:out=16'b0000_0010_0000_0000; 2'd10:out=16'b0000_0100_0000_0000; 2'd11:out=16'b0000_1000_0000_0000; 2'd12:out=16'b0001_0000_0000_0000; 2'd13:out=16'b0010_0000_0000_0000; 2'd14:out=16'b0100_0000_0000_0000; 2'd15:out=16'b1000_0000_0000_0000;*/ endcaseend endmodule `timescale 1ns / 1nsmodule decoder_4_16_tb();reg s_a;reg s_b;reg s_c;reg s_d;wire [15:0] out; decoder_4_16 decoder_4_16(.a(s_a),.b(s_b),.c(s_c),.d(s_d),.out(out));initial begins_a=0;s_b=0;s_c=0;s_d=0;#100;s_a=0;s_b=0;s_c=0;s_d=1;#100;s_a=0;s_b=0;s_c=1;s_d=0;#100;s_a=0;s_b=0;s_c=1;s_d=1;#100;s_a=0;s_b=1;s_c=0;s_d=0;#100;s_a=0;s_b=1;s_c=0;s_d=1;#100;s_a=0;s_b=1;s_c=1;s_d=0;#100;s_a=0;s_b=1;s_c=1;s_d=1;#100;s_a=1;s_b=0;s_c=0;s_d=0;#100;s_a=1;s_b=0;s_c=0;s_d=1;#100;s_a=1;s_b=0;s_c=1;s_d=0;#100;s_a=1;s_b=0;s_c=1;s_d=1;#100;s_a=1;s_b=1;s_c=0;s_d=0;#100;s_a=1;s_b=1;s_c=0;s_d=1;#100;s_a=1;s_b=1;s_c=1;s_d=0;#100;s_a=1;s_b=1;s_c=1;s_d=1;#100; endendmodule 后记:勿谓寸阴短,既过难再获。勿谓一丝微,既绍难再白。