8.1 组合逻辑及其Verilog设计表门级逻辑及其verilog设计 | | | | | | | | | reg A,B; always@(*)begin B=A; end | |
| | | reg[3:0] A,B; always@(*)begin B=A; end | | 当A和B是n位时,实际就有n根线。但为看图方便,我们通常只画出一根线表示 | | | reg[3:0] A; reg[2:0] B; always@(*)begin B=A>>2; end | | | | | reg[3:0] A; reg[2:0] B; always@(*)begin B={A[2],A[3],A[0]}; end | | | | | | reg A,B; always@(*)begin B=~A; end | |
| | | reg[1:0] A,B; always@(*)begin B=~A; end | | 如果A和B都是n位,实际电路就是有n个反相器。画电路图时可画一个来简化。 | | | | reg A,B; always@(*)begin C=A&&B; end | | 注意: FPGA支持多输入的与门,例如四输入与门,输入可为ABCD,输出为E,当ABCD同时为1时,E为1 | | | reg[2:0] A,B,C; always@(*)begin C=A&&B; end | | 多位信号之间的逻辑与,很容易引起歧义,设计最好不要用多位数的逻辑与。如果要实现上面功能,建议代码改为如下: always@(*)begin C=(A!=0)&&(B!=0); end | | | reg[2:0] A,B,C; always@(*)begin C=A&B; end | |
| | | reg[2:0] A; always@(*)begin C=&A; end | |
| | | | reg A,B; always@(*)begin C=A||B; end | | 注意:FPGA支持多输入的与门,例如四输入与门,输入可为ABCD,输出为E,当ABCD同时为1时,E为1 | | | reg[2:0] A,B,C; always@(*)begin C=A||B; end
| | 多位信号之间的逻辑或,很容易引起歧义。最好不要用多位的逻辑或。如果要实现相同功能,建议改为如下: always@(*)begin C=(A!=0)||(B!=0); end | | | reg[2:0] A,B,C; always@(*)begin C=A|B; end
| |
| | | reg[2:0] A; always@(*)begin C=|A; end
| |
|
表选择器和比较器及其verilog设计 | | | | | | | | | always@(*)begin case(S) 2’b00 : C=D0; 2’b01 : C=D1; 2’b10 : C=D2; default : C= D3; endcase end | |
| | | always@(*)begin C = D[S]; end | | | | | always@(*)begin if(S==0) C=D0; else if(S==2’b01) C=D1; else C=D2; end | | 请注意此处用到了相等比较器和选择器。请掌握这种if else代码的画法。 | | | | always@(*)begin if(A==B) C=1; else C=0; end | |
| | | always@(*)begin if(A>B) C=1; else C=0; end | |
| | | always@(*)begin if(A>=B) C=1; else C=0; end | |
| | | | |
| | | always@(*)begin if(A<=B) C=1; else C=0; end | |
|
表运算逻辑及其verilog设计 | | | | | | | always@(*)begin C =A+B; end | | 本质上,运算逻辑都是由与门、或门等门逻辑搭建起来的电路,例如1位的加法就是S= A ^B;Cout= A&&B。 | | | always@(*)begin C =A-B; end | | | | always@(*)begin C =A*B; end | | 在二进制运算中,乘法运算实质上就是加法运算,例如1111*111 = (1111) +(11110) +(111100)。所以乘法器会比加法器消耗的资源多。 | | | always@(*)begin C =A/B; end | | 二进制运算中,除法和求余涉及到加法、减法和移位等运算,所以除法和求余电路资源都非常大,在设计时要尽力避免除法和求余。如果一定要用到除法,尽量让除数为2的n次方,如2,4,8,16等。因为a/2实质就是a向右移1位;a/4实质就是a向右移2位。移位运算是不消耗资源的。 | | | always@(*)begin C =A%B; end | |
8.2 时序逻辑verilog设计方法时序逻辑的代码一般有两种,同步复位的时序逻辑和异步复位的时序逻辑。同步复位的时序逻辑,即复位不是立即有效,而在时钟上升沿时复位才有效。代码结构如下: always@(posedge clk) begin if(rstn==1’b0) 代码语句; else begin 代码语句; end end
异步复位的时序逻辑,复位立即有效,与时钟无关。代码结构如下: always@(posedge clk or negedge rstn) begin if(rstn==1’b0) 代码语句; else begin 代码语句; end end
对于时序逻辑verilog设计明德扬提出以下建议: 为了教学的方便,明德扬的代码统一采用异步时钟逻辑,建议同学们都采用此结构,这样设计时只需考虑是用时序逻辑还是组合逻辑结构来写代码即可;实际工作,请遵从公司规范。 在明德扬提供的gVim版本软件中打开代码后,输入“Zuhe”命令(回车后)可得到组合逻辑的代码结构;输入“Shixu”命令(回车后)可得到时序逻辑的代码结构; 时序逻辑没有复位信号是不规范的代码,建议不要这样使用。
1
|
|
|
|
|
|