搜索
bottom↓
回复: 5

【点滴积累FPGA】关于3-8译码器的10种不同表达

[复制链接]

出0入0汤圆

发表于 2011-7-5 09:49:32 | 显示全部楼层 |阅读模式
module decoder38_1( //使用位移操作
input [2:0]a,
output [7:0]y
);
assign y=1<<a;
endmodule

module decoder38_2( //使用CASE 语句
input [2:0]a,
output [7:0]y
);
reg [7:0]y;
always @*
case (a[2:0])
0:y<=8'b0000_0001;
1:y<=8'b0000_0010;
2:y<=8'b0000_0100;
3:y<=8'b0000_1000;
4:y<=8'b0001_0000;
5:y<=8'b0010_0000;
6:y<=8'b0100_0000;
7:y<=8'b1000_0000;
endcase
endmodule




module decoder38_3( //使用if
input [2:0]a,
output [7:0]y
);
reg [7:0]y;
always @*
if (a==0)y<='h01;else
if (a==1)y<='h02;else
if (a==2)y<='h04;else
if (a==3)y<='h08;else
if (a==4)y<='h10;else
if (a==5)y<='h20;else
if (a==6)y<='h40;else
if  (a==7)y<='h80;else
y<='hx;
endmodule



module decoder38_4( //使用assign
input [2:0]a,
output [7:0]y
);

assign y[0] = a==0 ;
assign y[1] = a==1 ;
assign y[2] = a==2 ;
assign y[3] = a==3 ;
assign y[4] = a==4 ;
assign y[5] = a==5 ;
assign y[6] = a==6 ;
assign y[7] = a==7 ;

endmodule  


module decoder38_5( //使用位逻辑运算
input [2:0]a,
output [7:0]y
);

assign y[0] = ~a[2] & ~a[1] & ~a[0] ;//3'b000
assign y[1] = ~a[2] & ~a[1] & a[0] ;//3'b001
assign y[2] = ~a[2] & a[1] & ~a[0] ;//3'b010
assign y[3] = ~a[2] & a[1] & a[0] ;//3'b011
assign y[4] = a[2] & ~a[1] & ~a[0] ;//3'b100
assign y[5] = a[2] & ~a[1] & a[0] ;//3'b101
assign y[6] = a[2] & a[1] & ~a[0] ;//3'b110
assign y[7] = a[2] & a[1] & a[0] ;//3'b111

endmodule  

module decoder38_6(//使用?:表达式
input [2:0]a,
output [7:0]y
);
assign y = (a==0)?'h01:
           (a==1)?'h02:
           (a==2)?'h04:
           (a==3)?'h08:
           (a==4)?'h10:
           (a==5)?'h20:
           (a==6)?'h40:
           (a==7)?'h80:
           'hx;
endmodule



module decoder38_7(//使用循环
input [2:0]a,
output [7:0]y
);
reg [7:0]y;

integer i ;//or reg [3:0]i ;
always @*
for(i=0;i<=7;i=1+i)
if(a==i)y=1;else y=0;

endmodule



module decoder38_8( //使用 function 调用
input [2:0]a,
output [7:0]y
);
function [7:0]do_dec38;
input [2:0]din;
do_dec38 = 1<<din;
endfunction
assign y=do_dec38(a);
endmodule


module decoder38_9( //使用task 调用,此处可以综合
input [2:0]a,
output [7:0]y
);
reg [7:0]y ;
task do_dec38;
input [2:0]din;
y = 1<<din;
endtask

always @*
do_dec38(a);

endmodule


module decoder38_10( //例化模块实现。
input [2:0]a,
output [7:0]y
);

and3 y0_logic (.a0(~a[0]),.a1(~a[1]),.a2(~a[2]),.b(y[0]));
and3 y1_logic (.a0(~a[0]),.a1(~a[1]),.a2(a[2]),.b(y[1]));
and3 y2_logic (.a0(~a[0]),.a1(a[1]),.a2(~a[2]),.b(y[2]));
and3 y3_logic (.a0(~a[0]),.a1(a[1]),.a2(a[2]),.b(y[3]));
and3 y4_logic (.a0(a[0]),.a1(~a[1]),.a2(~a[2]),.b(y[4]));
and3 y5_logic (.a0(a[0]),.a1(~a[1]),.a2(a[2]),.b(y[5]));
and3 y6_logic (.a0(a[0]),.a1(a[1]),.a2(~a[2]),.b(y[6]));
and3 y7_logic (.a0(a[0]),.a1(a[1]),.a2(a[2]),.b(y[7]));
endmodule

module and3( //被例化模块:三输入与门
input a0,a1,a2,
output b
);
assign b = a0 & a1 & a2;
endmodule


1,以上所有模块都是综合并在硬件实现,并且实现功能以及逻辑资源占用量完全等效。
2,以上10个例子是比较典型的一题多解的例子,在设计中经常做这样的尝试能加深基础知识,也使思路更开阔,以及一种熟练驾驭语言的控制感。
3,decoder38_9 这个模块使用的是任务方式实现(task),是一个任务可以被综合的典型例子。
4,decoder38_8 使用了函数(fuction)。实际上所有用函数(function)能实现的功能都可以用assign来实现,因为硬件本质一样:都是门电路,不带有reg以及latch。
5,decoder38_10 和decoder38_8 书面上有点相似,但是decoder38_10共注重的是硬件的连接,表现为几个模块连接在一起组成一个新的模块。
6,对于电平敏感信号,提倡用always @* 写法,意思是包含了所有引起下述进程发生动作的敏感电平信号(注意非边缘信号)。
7,decoder38_7中使用循环了for,仅仅是告诉编译器进行怎样的处理,是一种类似脚本语言的特性。
8,decoder38_5和decoder38_10的描述方法更偏向硬件,是一种门级描述方法。
9,表达常量有2,10,16进值的形式(8进值就不要用了),要灵活选用。如decoder38_4采用10进值,decoder38_3采用16进值,decoder38_2采用2进值。
10,10中表达出一个结果,也说明了HDL描述语言不同于C之类的串行语言,如果C语言逐行扫描编译得到的汇编结果肯定是不一样,更不说2进值机器代码。Hardware Describe Language.确实是描述硬件的,告诉编译工具以及综合工具你要做什么,可以有不同的方法让它知道你要多什么。





刚看到发错地方了,能不能麻烦管理员移动到CPLD/FPGA分论坛。

出0入0汤圆

发表于 2011-7-5 10:03:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-5 10:07:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-10 17:18:40 | 显示全部楼层
LZ,补充一种,门电路自己搭一个吧,呵呵。。。。开个玩笑,受益颇多,不错对了解语法很有帮助啊,谢啦

出0入0汤圆

发表于 2011-7-11 18:28:16 | 显示全部楼层
学习!

出0入0汤圆

发表于 2014-10-11 22:06:32 | 显示全部楼层
这些综合后都是完全一样的么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 20:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表