FPGA的HDL建模第二周
今天迎来了我们的FPGA每周一练第二周
首先回答上周一位坛友@sunedi561的提:全加器有什么典型应用?
简单来说全加器除了可以用作二进制数的加法运算外,还可以应用在其它方向。例如:二进制的减法、乘法运算、BCD码的加法、减法、码组变换、数码比较,以及其它组合电路的设计等方面。
话入正题:
感谢大家的热情参与,感谢大家的积极回复。对于上周问题
1.用Verilog实现设计一个全加
2.四选一的多路选择器。
我看见对选择器是设计基本一样,使用的是CASE语句,用CASE语句可以实现无优先级的选择。当然在新版Verilog综合器中使用IF时只要条件变量各不相同,且相斥,也是可以综合出无优先级的。那我还是在写一遍:
- module MUX( C,D,E,F,S,out);
- input C,D,E,F ; //input
- input [1:0] S ; //select control
- output reg out ; //result
- //___________________cut_______________________//
- always@(C or D or E or F or S)
- begin
- case (S)
- 2'b00 : Mux_out = C ;
- 2'b01 : Mux_out = D ;
- 2'b10 : Mux_out = E ;
- default : Mux_out = F ;
- endcase
- end
- endmodule
很多人会把写Verilog代码想象成写C类程序。事实上这种想法是不对的,因为Verilog是硬件描述语言。何为硬件描述语言?就是描述电路的,描述功能,实现功能。只要功能实现了,代码就要像看女生的超短裙一样,越短越好。
但是你写的代码不单纯是给计算机读的,如果如果单纯的给计算机读,那好啦,写0101010101....计算机岂不是很开心。代码最主要就是给人读的,给人读的就要注意什么?可读性!(这个是个很重要的问题,这个课程结束后,可能会讲RTL编码规范,到时候细讲。)那我们此次的代码要怎样写呢?我也给个参考:
- module fulladd(cout, sum, ain, bin, cin);
- input ain, bin, cin; //input
- output sum, cout;
-
- wire sum; //summation
- wire cout; //carry output
- //________________________cut__________________________//
- assign sum = ain ^ bin ^ cin;
- assign cout = (ain & bin) | (bin & cin) | (ain & cin);
- endmodule
1、设计一个10进制计数器;
2、设计3-8译码器。
欢迎各位朋友们积极跟帖回答交流,希望能和大家在学习FPGA的道路上携手共进,共同进步,如果有任何问题也可回帖探讨!
【FPGA每周一练】FPGA的HDL建模第一周
欢迎各位朋友们积极跟帖回答交流
- --COUNT10
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- USE IEEE.STD_LOGIC_UNSIGNED.ALL;
- ENTITY CONT10 IS
- PORT(LD: IN STD_LOGIC; --置位信号(低电平有效)
- CLK: IN STD_LOGIC; --时钟脉冲
- DATA: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --预置数
- NUM: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)); --计数结果
- END ENTITY CONT10;
- ARCHITECTURE BHV OF CONT10 IS
- BEGIN
- PROCESS(CLK,LD) IS
- BEGIN
- IF(LD='1') THEN
- NUM '0'); COUT = "1001" THEN Q1 '0'); COUT module add60(clk,clear,qh,ql); input clk,clear; output[3:0] qh,ql; reg[3:0] qh,ql; always @ (posedge clk or negedge clear) if(~clear) {qh,ql} else if(clk) begin if(ql==4'b1001) ql if(qh==4'b0101) qh else qh else ql //add60.v(13)near text "else"; expecting "end" end else {qh,ql} endmodule
嗯嗯,已经解决了,不好意思啊,我只在上传之前看而已,上传之后忘记了,谢谢!
标点符号不对? 语法错误?
3-8译码器
- module coder_38(in, out);
- input [2:0] in;
- output [7:0] out;
- reg [7:0] out;
- always @(in) begin
- case(in)
- 3'd0 : out=8'b11111110;
- 3'd1 : out=8'b11111101;
- 3'd2 : out=8'b11111011;
- 3'd3 : out=8'b11110111;
- 3'd4 : out=8'b11101111;
- 3'd5 : out=8'b11011111;
- 3'd6 : out=8'b10111111;
- 3'd7 : out=8'b01111111;
- endcase
- end
- endmodule
module DecimalCounter(clk, rst_n, en, cnt);
input clk, rst_n, en;
output cnt;
reg [3:0] cnt;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 4'd0;
else
if(en)
begin
if(cnt==4'd10)
cnt <= 4'd0;
else
cnt <= cnt + 1'b1;
end
endmodule
module 38Decoder(en, din, dout);
input clk, rst_n;
input [2:0] din;
output [7:0] dout;
reg [7:0] dout;
always @(clk or en)
if(en)
case(din)
3'b000: dout <= 8'b11111110;
3'b001: dout <= 8'b11111101;
3'b010: dout <= 8'b11111011;
3'b011: dout <= 8'b11110111;
3'b100: dout <= 8'b11101111;
3'b101: dout <= 8'b11011111;
3'b110: dout <= 8'b10111111;
3'b111: dout <= 8'b01111111;
endcase
else
dout <= 8'b11111111;
endmodule
我一般都是 先用if 判断是否溢出 然后再赋值 自增
感觉还是我的比较清楚一些
