草庐IT

【Verilog】Verilog的八个经典入门例题

LM358_hzx 2023-06-05 原文

Verilog的八个经典入门例题

文章目录


前言

西安电子科技大学大三上学期硬件描述语言与可编程逻辑设计上机作业,本文作者采用vivado软件编译,Vivado自带的Simulation工具仿真,效果完全等同于Quartus编译+Modelsim仿真的组合


提示:以下是本篇文章正文内容,提供的程序仅供参考

一、7人表决器设计

题目内容:设计一个表决器,实现功能大于3人同意,表决通过,输出“1’b1”,否则输出“1’b0”。

源程序(示例):

module vote_7in(
input a,b,c,d,e,f,g,
output out
    );
assign out = (a+b+c+d+e+f+g >3)?1:0;
endmodule

测试程序(示例):

`timescale 1ns / 1ns
module vote_7in_tb;
reg a,b,c,d,e,f,g;
wire out;

vote_7in U1(.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g),.out(out));

initial 
begin
	{a,b,c,d,e,f,g} = 7'b0;
	#5 a = 1'b1;
	#5 b = 1'b1;
	#5 c = 1'b1;
	#5 d = 1'b1;
	#5 e = 1'b1;
	#5 f = 1'b1;
	#5 g = 1'b1;

end
endmodule

仿真波形截图(示例):

二、8位的ALU设计

题目内容: 设计一个8位的ALU(算术逻辑单元),该单元具有两个输入数据a,b和一个输入操作符Oper及输出数据c_out, sum,并且还具有下表所示的功能。

操作符功能
Adda+b
Subtracta-b
Subtract_ab-a
Ora | b
Anda&b
Xora^b
Xnora~^b

源程序(示例):

/*仅考虑无符号情况*/
module alu_8bit(
input[7:0] a,b,
input[2:0]Oper,
output reg c_out,
output reg[7:0] sum
    );
	
always@(a or b or Oper)
begin
	case(Oper)
	3'b000:  {c_out,sum} = a + b;
	3'b001:  {c_out,sum} = a - b;
	3'b010:  {c_out,sum} = b - a;
	3'b011:  {c_out,sum} = a | b;
	3'b100:  {c_out,sum} = a & b;
	3'b101:  {c_out,sum} = a ^ b;
	3'b110:  {c_out,sum} = a ~^ b;
	default: {c_out,sum} = 9'bx;
	endcase
end
endmodule

测试程序(示例):

`timescale 1ns / 1ns
module alu_8bit_tb;
	reg[7:0] a,b;
	reg[2:0] Oper;
	wire c_out;
	wire[7:0] sum;
	
	alu_8bit u1(.a(a),.b(b),.Oper(Oper),.c_out(c_out),.sum(sum));
	
	initial
	begin
	a = 8'b01110000; b = 4'b11110011; Oper = 3'b0;
		#5 Oper = 3'b000;
		#5 Oper = 3'b001;
		#5 Oper = 3'b010;
		#5 Oper = 3'b011;
		#5 Oper = 3'b100;
		#5 Oper = 3'b101;
		#5 Oper = 3'b110;
		#5 Oper = 3'b111;
	end
endmodule

仿真波形截图(示例):

三、JK触发器的设计

题目内容: 编写Verilog代码使之能正确描述下表所示的1bit JK触发器功能,其中Q+表示在时钟上升沿到来后的Q值。要求该触发器还具有异步复位的功能。

JKQ+
00Q
101
010
11~Q

源程序(示例):

module jk_ff(j,k,q,clk,rst);
input j,k,clk,rst;
output reg q;
always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		q = 0;
	else
		case({j,k})
		2'b00:q = q;
		2'b10:q = 1;
		2'b01:q = 0;
		2'b11:q = ~q;
		endcase
end
endmodule

测试程序(示例):

`timescale 1ns/1ns
module jk_ff_tb;
reg j,k,clk,rst;
wire q;
jk_ff u1(.j(j),.k(k),.clk(clk),.rst(rst),.q(q));
always #5 clk = ~clk;
initial
begin
	rst = 0; clk = 0; j = 1; k = 0;
	#10 j=0;k=0;
	#10 j=1;k=0;
	#10 j=0;k=1;
	#10 j=1;k=1;
	#15	rst = 1;
	#10 j=0;k=0;
	#10 j=1;k=0;
	#10 j=0;k=1;
	#10 j=1;k=1;
end
endmodule

仿真波形截图(示例):

四、环形计数器

题目内容: 设计下图所示寄存顺序的环形计数器,异步复位,复位时计数器中的值为4’b0001。
要求:(1)用参数定义此计数器的位宽;
            (2)仿真测试对象为8bit的环形计数器;

0001
0010
0100
1000
0100
0010
0001

源程序(示例):

module ring_count(reset, clk, count);
parameter width = 4;
input reset, clk;
output reg[width - 1:0] count;
integer I;
always@(posedge clk or posedge reset)
begin
	if(reset == 1'b1)
		begin
		count <= 4'b0001;
		I <= 0;
		end
	else
	begin
		if(I<width - 1)
			begin
			count <= {count[2:0],count[width - 1]};
			I <= I + 1;
			end
		else if(I<5&&I>=width - 1)
			begin
			count <= {count[0],count[width - 1:1]};
			I <= I + 1;
			end
		else
			begin
				count <= {count[0],count[width - 1:1]};
				I <= 0;
			end
	end
end
endmodule

测试程序(示例):

`timescale 1ns/1ns
module ring_count_tb;
reg clk,reset;
wire [7:0] count;

ring_count u1(.reset(reset),.clk(clk),.count(count));

always #5 clk = ~clk;

initial
begin
clk <= 1'b0;
reset <= 1'b1;
#15 reset = 1'b0;
#100 reset = 1'b1;
end
endmodule

仿真波形截图(示例):

五、二进制整数除法器设计

要求:(1)分析除法器工作原理,不能使用整除运算符/ 和求余运算符% ;
            (2)设被除数位数=8,除数位数=4
            (3)输出商和余数

源程序(示例):

/*二进制无符号整数除法*/
module divider_2bit(a,b,c,d);
input [7:0]a;//a为被除数
input [3:0]b;//b为除数
output reg[7:0]c;//c为商
output reg[3:0]d;//d为余数

reg[15:0] temp_a=0;
reg[7:0] temp_c=0;

integer I;

always@(a or b)
begin
	temp_a = a;
	for(I=0;I<9;I=I+1)//效果等同于repeat(9),只有循环次数确定的for、while、repeat语句才可综合,否则不可综合
	begin
		temp_c = temp_c<<1;//移位运算符的结果是一串数,并不能改变移位对象的值
		if(temp_a[15:8]>=b)
		begin
			temp_c = temp_c + 1'b1;
			temp_a[15:8] = temp_a[15:8] - b;
			temp_a = temp_a<<1;//效果等同于temp_a = {temp_a[14:0],1'b0};切记使用位拼接运算符要注明位宽
		end
		else
			temp_a = temp_a<<1;//不可写作temp_a = {temp_a[14:0],0};因为0没有注明位宽
	end
	c <= temp_c;
	d <= temp_a[12:9];
end

endmodule

测试程序(示例):

`timescale 1ns / 1ns
module divider_2bit_tb;
reg[7:0] a;
reg[3:0] b;
wire[7:0]c;
wire[3:0]d;

divider_2bit u1(.a(a),.b(b),.c(c),.d(d));

initial
begin
a = 8'b0001_1011;
b = 4'b0101;
#100
a = 8'b1001_1011;
b = 4'b0001;
#100
a = 8'b0000_0011;
b = 4'b1101;
#100
a = 8'd250;
b = 4'd15;
#100
a = 8'd6;
b = 4'd3;
#100
a = 8'd97;
b = 4'd13;
end
endmodule

仿真波形截图(示例):

六、排序任务

设a,b,c,d四个数,按从小到大的顺序重新排列并输出到ra,rb,rc,rd中。
要求:(1)需在Verilog HDL描述中使用任务(task)。

源程序(示例):

module sort_task(a,b,c,d,ra,rb,rc,rd);
parameter width = 4;
input [width-1:0] a,b,c,d;
output reg[width-1:0] ra,rb,rc,rd;

always@(a or b or c or d)
begin
	sort(a,b,c,d,ra,rb,rc,rd);
end

task sort;
input [width-1:0] a,b,c,d;
output reg[width-1:0] ra,rb,rc,rd;
reg [width-1:0]temp;
integer i,j;
reg [width-1:0]data[3:0];

begin
data[0] = a;
data[1] = b;
data[2] = c;
data[3] = d;

for(i=0;i<3;i=i+1)
	begin
	for(j=0;j<3-i;j=j+1)
		begin
		if(data[j]>data[j+1])
			begin
			temp = data[j+1];
			data[j+1] = data[j];
			data[j] = temp;
			end
		end
	end

ra = data[0];
rb = data[1];
rc = data[2];
rd = data[3];
end

endtask

endmodule

测试程序(示例):

`timescale 1ns / 1ns
module sort_task_tb;
parameter width = 4;
reg[width-1:0] a,b,c,d;
wire[width-1:0] ra,rb,rc,rd;

sort_task u1(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd));

initial
begin
a <= 4'd4;
b <= 4'd3;
c <= 4'd2;
d <= 4'd1;
#500
a <= 4'd0;
b <= 4'd7;
c <= 4'd3;
d <= 4'd5;
end
endmodule

仿真波形截图(示例):

七、简易频率计

设计一个8 位数字显示的简易频率计
要求:
①能够测试10Hz~10MHz 方波信号;
②电路输入的基准时钟为1Hz,要求测量值以8421BCD 码形式输出;
③系统有复位键;
④采用分层次分模块的方法;

源程序(示例):

module freq_cnt(clk_1Hz, fin, rst, d0, d1, d2, d3, d4, d5, d6, d7);  
  input clk_1Hz;
  input fin; 
  input rst;
  
  output[3:0] d0, d1, d2, d3, d4, d5, d6, d7; 
  wire[3:0] q0, q1, q2, q3, q4, q5, q6, q7;  
  //wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
  wire[3:0] en_out0,en_out1,en_out2,en_out3,en_out4,en_out5,en_out6,en_out7;
  wire count_en;  
  wire latch_en;  
  wire clear;
  
  

  control u_control(.clk_1Hz(clk_1Hz), .rst(rst), .count_en(count_en),  
                    .latch_en(latch_en), .clear(clear));  
    

  counter_10 counter0(.en_in(count_en), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out0), .q(q0));  
  counter_10 counter1(.en_in(en_out0), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out1), .q(q1));  
  counter_10 counter2(.en_in(en_out1), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out2), .q(q2));  
  counter_10 counter3(.en_in(en_out2), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out3), .q(q3));  
  counter_10 counter4(.en_in(en_out3), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out4), .q(q4));  
  counter_10 counter5(.en_in(en_out4), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out5), .q(q5));  
  counter_10 counter6(.en_in(en_out5), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out6), .q(q6));  
  counter_10 counter7(.en_in(en_out6), .clear(clear), .rst(rst),  
                      .fin(fin), .en_out(en_out7), .q(q7));  
 
  ulatch u_latch(.clk_1Hz(clk_1Hz),.rst(rst),.latch_en(latch_en),
					.q0(q0),.q1(q1),.q2(q2),.q3(q3),.q4(q4),.q5(q5),.q6(q6),.q7(q7),
					.d0(d0),.d1(d1),.d2(d2),.d3(d3),.d4(d4),.d5(d5),.d6(d6),.d7(d7));
endmodule  
  

module control(clk_1Hz, rst, count_en, latch_en, clear);  
  input clk_1Hz;  
  input rst;  
  output count_en;  
  output latch_en;  
  output clear;  
  reg[1:0] state; 
  reg count_en;  
  reg latch_en;  
  reg clear;  
  always @(posedge clk_1Hz or negedge rst)  
  if(!rst)   
    begin    
      state <= 2'd0;  
      count_en <= 1'b0;  
      latch_en <=1'b0;  
      clear <= 1'b0;  
    end  
     else   
    begin  
      case(state)  
            2'd0:   
            begin 
            count_en <= 1'b1; 
            latch_en <=1'b0;  
            clear <= 1'b0;  
            state <= 2'd1;  
          end  
        2'd1:  
          begin   
            count_en <= 1'b0;  
            latch_en <=1'b1;  
            clear <= 1'b0;  
            state <= 2'd2;  
          end  
        2'd2:   
          begin 
            count_en <= 1'b0;  
            latch_en <=1'b0;  
            clear <= 1'b1;  
            state <= 2'd0;
          end  
        default:  
          begin  
            count_en <= 1'b0;  
            latch_en <=1'b0;  
            clear <= 1'b0;  
            state <= 2'd0;  
          end  
            
      endcase  
            
    end  
    
    
endmodule  
  

module counter_10(en_in, rst, clear, fin, en_out, q);  
  input en_in;  
  input rst;   
  input clear; 
  input fin;    
  output en_out; 
  output[3:0] q;  
    
  reg en_out;  
  reg[3:0] q;  
    
  always@ (posedge fin or negedge rst)  
  if(!rst) 
      begin  
        en_out <= 1'b0;  
        q <= 4'b0;  
      end  
        
    else if(en_in) 
      begin  
        if(q == 4'b1001)   
          begin  
            q <= 4'b0;  
            en_out <= 1'b1;  
          end  
             else   
          begin  
            q <= q + 1'b1;  
            en_out <=1'b0;  
          end  
      end  
        
    else if(clear) 
      begin  
        q <= 4'b0;  
        en_out <= 1'b0;  
      end  
    else  
    begin  
    q <= q;  
    en_out <=1'b0;  
    end   
    
endmodule  
   
module ulatch(clk_1Hz, latch_en, rst, q0, q1, q2, q3, q4, q5, q6, q7,  
            d0, d1, d2, d3, d4, d5, d6, d7);  
              
  input clk_1Hz, latch_en, rst;  
  input[3:0] q0, q1, q2, q3, q4, q5, q6, q7;  
  output[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
  reg[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
  always@ (posedge clk_1Hz or negedge rst)  
  if(!rst) 
    begin  
      d0 <= 4'b0; d1 <= 4'b0; d2 <= 4'b0; d3 <= 4'b0; d4 <= 4'b0;  
      d5 <= 4'b0; d6 <= 4'b0; d7 <= 4'b0;  
    end  
  else if(latch_en) 
    begin  
      d0 <= q0; d1 <= q1; d2 <= q2; d3 <= q3; d4 <= q4;  
      d5 <= q5; d6 <= q6; d7 <= q7;  
    end  
     else  
    begin  
      d0 <= d0; d1 <= d1; d2 <= d2; d3 <= d3; d4 <= d4;  
      d5 <= d5; d6 <= d6; d7 <= d7;  
    end  
  
endmodule


测试程序(示例):

`timescale 1ns/1ps  
//测试模块  
module freq_cnt_tb;  
  parameter CLK_1HZ_DELAY = 5_0000_0000; //1Hz基准信号  
  parameter FIN_DELAY = 100;             //5MHz待测信号  
  reg clk_1Hz;  
  reg fin;  
  reg rst;  
    
  wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7;  
    
  initial  
    begin  
      rst =1'b0;  
      #1 rst = 1'b1;  
    end  
      
  initial  
    begin  
      fin = 1'b0;  
      forever  
      #FIN_DELAY fin = ~fin;  
    end  
      
  initial  
    begin  
      clk_1Hz = 1'b0;  
      forever  
      #CLK_1HZ_DELAY clk_1Hz = ~clk_1Hz;  
    end  
      
    freq_cnt freDetect1(.clk_1Hz(clk_1Hz), .rst(rst), .fin(fin),  
    .d0(d0), .d1(d1), .d2(d2), .d3(d3), .d4(d4), .d5(d5), .d6(d6), .d7(d7));  
      
     
endmodule  

仿真波形截图(示例):

八、序列检测器

要求:
(1)在每一个时钟下降沿检查输入数据,当输入数“10011”时,输出asm被置为1;其余情况asm为0。
(2)画出fsm(有限状态机);

源程序(示例):

module seq_detector(clk,ain,asm);
input clk,ain;
output reg asm;
reg[4:0] q;
q = 5'b00000;
always@(negedge clk) q <= {q[3:0],ain};

always@(negedge clk) 
	if(q == 5'b10011) asm = 1;
	else			  asm = 0;
endmodule

测试程序(示例):

`timescale 1ns/1ps
module seq_detector_tb;
wire asm,ain;
reg clk;
reg[19:0] arr;
seq_detector U0(.clk(clk),.ain(ain),.asm(asm));
initial 
begin 
	clk = 0;
	arr = 20'b_01001_11010_11001_10010;
	#500 $stop;
end
always #5 clk=~clk;
always @(negedge clk) arr = {arr[0],arr[19:1]};
assign ain = arr[0];
endmodule

仿真波形截图(示例):

有关【Verilog】Verilog的八个经典入门例题的更多相关文章

  1. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  4. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  5. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  6. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  7. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  8. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  9. Verilog使用inout信号的方法 - 2

    目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电

  10. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

随机推荐