FPGA编程—组合逻辑编码器等verilog实现
本篇博客主要实现对组合逻辑电路的一些常用模块的实现。组合逻辑中,包括译码器,编码器,输入输出选择器,数值比较器,算法单元等。
先来实现编码器,最常用的8-3编码器,这里先讲一下要用到的case ,casex,casez三者的关系和区别。对于8-3编码器因为用到优先级编码,所以三者的区别。Casex中对于某些位呈现x或者z,对这些位比较就会忽略,不予考虑,而只关注其他位的比较结果。casez中对于某些位呈现高组态,对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。而case是一种全比较型,逐一进行比较。在应用过程中不建议采用casex或者casez的形式,因为有些综合其不能对两者进行综合,所以建议采用case语句。这里在modelsim中采用casex形式对编码器进行编码。
这里讲解一下verilog书写代码的格式,首先调用预编译命令`timescale命令,指定仿真时间单位和仿真时间精度,不可省略。
Module(
Input clk,
Input rst_n,
nput xxx,(这里加入其它输入信号)
output xx(这里加入其它输出信号)
);
reg xxx;
always@(posedge clk or negedge rst_n)
begin
if(rst_n)
//这里加入要初始化的参数
else if()
//这里加入满足此条件的功能
else()
end
assign 输出信号 = 满足要求的输出变量值;
endmodule
上述是简单的verilog结构,verilog语法有很多种,其实常用的不多,记住常用的语法就可以了。比如如下:
localparam N = 20;
parameter N = 20;
上述两个参数的作用范围不一样,parameter定义的参数可以用于参数的传递,而localparam定义的的参数只能在module内使用。
task
begin
//加入要执行的语句
end
endtask
这里说一下task和function的区别,在面试的时候可能会被问到。
task的结构定义需要在过程块的外部,不能定义在内部。task的调用必须在过程块内调用。task的定义可以定义有输入输出端口,也可以不用定义,task可以调用function和其他类的函数。
function的结构定义也是不能定义在过程快的内部,而且function内部不能出现时延参数,#、@ 等。function只有input变量,不过可以通过参数名来传递一个返回值。
所以上述两者的区别就是:
task有输入输出端口,function只有输入端口,没有输出端口。
task的调用必须通过输出端口来传递输出值,function是通过函数名来传递一个返回值。
function中不能调用任务类函数,task可以调用function。
function可以出现在过程块或者连续赋值语句中,task只能出现在过程块中。
function只能与主模块共用一个仿真时间单位,其内部不能有其他时延参数参与,task中没有此限制。
repeat();该语句执行重复命令,括号内填写重复的数字即可,如repeat (4) @(posedge clk),该语句的意思是重复执行clk上升沿4次。
forever # (N/2) clk = !clk;
forever语句是永远执行的意思,常常用于时钟信号的产生。
initial
begin
//加入要执行的语句
end
代码实现部分可以参考 个人专博,网址:http://www.raymontec.com/