通过Verilog进行简单的编译

来源:互联网 发布:ubuntu设置中文环境 编辑:程序博客网 时间:2024/06/13 02:36

4-16进制译码器

首先,创建新的Verilog文本,打入如下代码

module ligulei5(IN        ,   // input  OUT       );  // output input [3:0] IN;output[15:0] OUT;reg   [15:0] OUT;// get the OUT  always @ (IN) begin   case(IN)    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;   endcase  endendmoduled

打入代码之后,进行部分编译,之后打开Tools目录下的 RTL viewer 查看逻辑图,逻辑图如下:
4-16译码器逻辑图

检查完逻辑图之后,进行完全编译,之后画波形图,得到波形图如下:
4-16译码器波形图

十二进制计数器

创建新的Verilog文本,打入如下代码

module ligulei3(  RST   , // 异步复位, 高有效  CLK   , // 时钟,上升沿有效  EN    , // 输入的计数使能,高有效  CLR   , // 输入的清零信号,高有效  LOAD  , // 输入的数据加载使能信号,高有效  DATA  , // 输入的加载数据信号  CNTVAL, // 输出的计数值信号  OV    );// 计数溢出信号,计数值为最大值时该信号为1input RST   , CLK   , EN    , CLR   , LOAD  ;input [3:0] DATA ;output [3:0] CNTVAL;output OV;   reg [3:0] CNTVAL, cnt_next;reg OV;// 电路编译参数,最大计数值parameter CNT_MAX_VAL = 11;// 组合逻辑,生成cnt_next// 计数使能最优先,清零第二优先,加载第三优先always @(EN or CLR or LOAD or DATA or CNTVAL) begin  if(EN) begin    // 使能有效if(CLR) begin // 清零有效  cnt_next = 0;endelse begin  // 清零无效  if(LOAD) begin // 加载有效    cnt_next = DATA;  end  else begin     // 加载无效,正常计数    // 使能有效,清零和加载都无效,根据当前计数值计算下一值    if(CNTVAL < CNT_MAX_VAL) begin // 未计数到最大值, 下一值加1      cnt_next = CNTVAL + 1'b1;    end    else begin // 计数到最大值,下一计数值为0        cnt_next = 0;      end    end // else LOAD  end  // else CLR  end // if EN  else begin  // 使能无效,计数值保持不动   cnt_next = CNTVAL;  end // else ENend// 时序逻辑 更新下一时钟周期的计数值// CNTVAL 会被编译为D触发器always @ (posedge CLK or posedge RST) begin  if(RST)     CNTVAL <= 0;  else    CNTVAL <= cnt_next;end // 组合逻辑,生成OValways @ (CNTVAL) begin  if(CNTVAL == CNT_MAX_VAL)     OV = 1;  else    OV = 0;  endendmodule

打入代码之后,进行部分编译,之后打开Tools目录下的 RTL viewer 查看逻辑图,逻辑图如下:
十二进制计数器逻辑图

检查完逻辑图之后,进行完全编译,之后画波形图,得到波形图如下:
十二进制计数器波形图

二十进制计数器

创建新的Verilog文本,打入如下代码

 module ligulei6(  RST   , // 异步复位, 高有效  CLK   , // 时钟,上升沿有效  EN    , // 输入的计数使能,高有效  CLR   , // 输入的清零信号,高有效  LOAD  , // 输入的数据加载使能信号,高有效  DATA  , // 输入的加载数据信号  CNTVAL, // 输出的计数值信号  OV    );// 计数溢出信号,计数值为最大值时该信号为1input RST   , CLK   , EN    , CLR   , LOAD  ;input [4:0] DATA ;output [4:0] CNTVAL;output OV;   reg [4:0] CNTVAL, cnt_next;reg OV;// 电路编译参数,最大计数值parameter CNT_MAX_VAL = 19;// 组合逻辑,生成cnt_next// 计数使能最优先,清零第二优先,加载第三优先always @(EN or CLR or LOAD or DATA or CNTVAL) begin  if(EN) begin    // 使能有效if(CLR) begin // 清零有效  cnt_next = 0;endelse begin  // 清零无效  if(LOAD) begin // 加载有效    cnt_next = DATA;  end  else begin     // 加载无效,正常计数    // 使能有效,清零和加载都无效,根据当前计数值计算下一值    if(CNTVAL < CNT_MAX_VAL) begin // 未计数到最大值, 下一值加1      cnt_next = CNTVAL + 1'b1;    end    else begin // 计数到最大值,下一计数值为0      cnt_next = 0;    end  end // else LOADend  // else CLR  end // if EN  else begin  // 使能无效,计数值保持不动  cnt_next = CNTVAL; end // else ENend// 时序逻辑 更新下一时钟周期的计数值// CNTVAL 会被编译为D触发器 always @ (posedge CLK or posedge RST) begin  if(RST)     CNTVAL <= 0;  else    CNTVAL <= cnt_next;  end// 组合逻辑,生成OValways @ (CNTVAL) begin  if(CNTVAL == CNT_MAX_VAL)    OV = 1;  else   OV = 0;  endendmodule

打入代码之后,进行部分编译,之后打开Tools目录下的 RTL viewer 查看逻辑图,逻辑图如下:
二十进制计数器逻辑图

检查完逻辑图之后,进行完全编译,之后画波形图,得到波形图如下:
二十进制计数器波形图

原创粉丝点击